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?

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.


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);

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.


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>

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'); ?>

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');
}

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;
?>

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.