web-dev-qa-db-fra.com

Comment afficher par programme un bloc de vue?

J'ai créé un bloc de vue, dont le nom de machine est "news".

Comment l'afficher à l'aide de module_invoke() et du nom de machine de la vue?

31
vitaly.batonov

Utilisez views_embed_view() :

echo views_embed_view('view_machine_name', 'block_1');

Vous pouvez connaître le nom d'affichage en cliquant sur l'onglet et vérifier son nom dans la barre d'adresse de votre navigateur: #views-tab-block_1 vous donne block_1.

63
tostinni

Si vous souhaitez passer un paramètre à la vue, utilisez:

echo views_embed_view('view_machine_name', 'block_1', $param);

Par exemple:

echo views_embed_view('view_machine_name', 'block_1', $node->nid);

ou:

echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
22
Peter Lozovitskiy

la réponse de tostinni est la bonne dans la plupart des cas. Cependant, si vous voulez inclure le titre View, c'est un peu plus moche.

Dans la documentation views_embed_view():

Notez que cette fonction n'affiche PAS le titre de la vue. Si vous voulez le faire, vous devrez faire ce que cette fonction fait manuellement, en chargeant la vue, en obtenant l'aperçu puis en obtenant $view->get_title().

Par exemple:

$name = 'view_machine_name';
$display_id = 'block_1';
$view = views_get_view($name);
if (!$view || !$view->access($display_id)) {
  return;
}
$view_content = $view->preview($display_id);
$title = $view->get_title();

Mise à jour: @rojosnow a noté que les documents soulignent que vous devez obtenir l'aperçu avant appeler get_title() donc j'ai inversé ces deux lignes.

8
Joshua Stewardson

Cela a fonctionné pour moi:

$view = views_get_view('view_machine_name');
$view->set_display('Master');
$view->get_title();
$response = $view->preview('You_Block_id');

// et l'a appelé en html comme ceci //

<div class="col-md-4 col-sm-6">
<div class="blocksOuterWrapper companyNewsWrapper">
'.$response.'
</div>
</div>
1
devashish gurjar

Remarque, pour moi, le bloc par défaut (sans nom) s'appelle block plutôt que block_1:

<?php echo views_embed_view('news_archive', 'block'); ?>
1

S'appuyant également sur la réponse de tostinni:

Si vous ne souhaitez pas afficher de code HTML si la vue n'a aucun résultat. Ajoutez également un titre, mais uniquement s'il y a des résultats.

if (array_filter(views_get_view_result('view_machine_name', 'block_1'))) {
    print '<h2 class="my-view-block-title">Special Title</h2>';
    print views_embed_view('view_machine_name', 'block_1');
}
0
squarecandy

Vous pouvez rendre votre bloc au lieu de rendre les vues par le code suivant.

<?php
 $block = block_load($module, $delta);
 $render_array = _block_get_renderable_array(_block_render_blocks(array($block)));
 $output = render($render_array);
 print $output;
?>
0
Leopathu

D'après ma propre expérience, vous pouvez transformer un chemin d'accès en titre ou contenu de vue avec une fonction comme la suivante.

<?php
function view_path_to_title($path)
{
  // only if your path is a URL alias
  $sql = "SELECT src FROM {url_alias} WHERE dst = '%s'";
  $src = db_result(db_query($sql, $path));

  // if you do not use URL aliases, you probably use $path here instead of $src
  $menu_item = menu_get_item($src);

  // make sure it worked as expected
  if(!empty($menu_item)
  && $menu_item["page_callback"] == "views_page"
  && count($menu_item["page_arguments"]) >= 2)
  {
    $args = $menu_item["page_arguments"];
    $view = views_get_view($args[0]);
  }
  else
  {
    $view = null;
  }

  if ($view)
  {
    // just loading a view is not quite enough, we have to setup the
    // arguments, including the display, and the "execute" the view
    $view->set_display($args[1]);
    array_shift($args); // view name
    array_shift($args); // display name
    $view->set_arguments($args);
    $view->execute();
    $title = $view->get_title();
    if($title)
    {
      return $title;
    }
  }

  // some "random" default
  return $path;
}

Pour rendre la vue, utilisez $view->render() au lieu de $view->get_title().

Bien sûr, jusqu'à ce que j'appelle correctement la $view->execute(), rien ne fonctionnait correctement. J'obtiendrais des chaînes vides (peut-être null) comme valeurs de retour.

0
Alexis Wilke