Comment puis-je afficher par programme un bloc de vue?

32

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?

vitaly.batonov
la source

Réponses:

62

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_1vous donne block_1.

tostinni
la source
Qu'en est-il de Drupal 8? savez-vous comment ça marche dans drupal 8?
shekoufeh
Pour Drupal 8, nous utilisons Twig Tweak et cette syntaxe{{ drupal_view('view_machine_name', 'block_1') }}
tostinni
21

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);
Peter Lozovitskiy
la source
Qu'en est-il de Drupal 8? savez-vous comment ça marche dans drupal 8?
shekoufeh
@shekoufeh, selon la documentation ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/… ), cela devrait fonctionner de la même façon sur Drupal 8. Pourriez-vous s'il vous plaît essayer de nous le dire?
Peter Lozovitskiy
non, ça retourne juste tableau
shekoufeh
8

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.

Joshua Stewardson
la source
Bon conseil mon ami.
Stefgosselin
1

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>
devashish gurjar
la source
1

Note, pour moi le bloc par défaut (sans nom) est appelé blockplutôt que block_1:

<?php echo views_embed_view('news_archive', 'block'); ?>
Harry Mumford-Turner
la source
0

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');
}
squarecandy
la source
0

Vous pouvez rendre votre bloc au lieu de rendre les vues avec 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;
?>
Leopathu
la source
0

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.

Alexis Wilke
la source