J'ai créé un bloc de vue dont le nom de machine est "news".
Comment puis-je l'afficher en utilisant module_invoke()
et le nom de la machine de la vue?
J'ai créé un bloc de vue dont le nom de machine est "news".
Comment puis-je l'afficher en utilisant module_invoke()
et le nom de la machine de la vue?
Réponses:
Utiliser views_embed_view()
:
echo views_embed_view('view_machine_name', 'block_1');
Vous pouvez trouver le nom complet 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
.
{{ drupal_view('view_machine_name', 'block_1') }}
Si vous voulez 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);
La réponse de tostinni est la bonne dans la plupart des cas. Toutefois, si vous souhaitez inclure le titre de la vue, il est un peu plus moche.
De la views_embed_view()
documentation:
Notez que cette fonction n’affiche PAS le titre de la vue. Si vous voulez faire cela, 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 la documentation indique que vous devez obtenir l'aperçu avant d' appeler, de get_title()
sorte que j'ai retourné ces deux lignes.
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>
Note, pour moi le bloc par défaut (sans nom) est appelé block
plutôt que block_1
:
<?php echo views_embed_view('news_archive', 'block'); ?>
Construisant également sur la réponse de tostinni:
Si vous ne voulez pas que du HTML apparaisse 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');
}
De ma propre expérience, vous pouvez transformer un chemin en titre ou en contenu de vue avec une fonction comme celle-ci.
<?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()
plutôt que $view->get_title()
.
Bien sûr, jusqu'à ce que j'appelle correctement $view->execute()
, rien ne fonctionnait correctement. Je voudrais obtenir des chaînes vides (peut-être null) comme valeurs de retour.