Wie zeige ich programmgesteuert einen Ansichtsblock an?

32

Ich habe einen Ansichtsblock erstellt, dessen Computername "Nachrichten" ist.

Wie zeige ich es mit module_invoke()und dem Computernamen der Ansicht an?

vitaly.batonov
quelle

Antworten:

62

Verwendung views_embed_view():

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

Sie können den Anzeigenamen herausfinden, indem Sie auf die Registerkarte klicken und den Namen in der Adressleiste Ihres Browsers überprüfen: #views-tab-block_1gibt Ihnen block_1.

tostinni
quelle
Was ist mit Drupal 8? Weißt du, wie es in Drupal 8 funktioniert?
Shekoufeh
Für Drupal 8 verwenden wir Twig Tweak und diese Syntax{{ drupal_view('view_machine_name', 'block_1') }}
tostinni
21

Wenn Sie der Ansicht einen Parameter übergeben möchten, verwenden Sie:

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

Beispielsweise:

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

oder:

echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
Peter Lozovitskiy
quelle
Was ist mit Drupal 8? Weißt du, wie es in Drupal 8 funktioniert?
Shekoufeh
@shekoufeh, laut Dokumentation ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/… ) sollte es auf Drupal 8 genauso funktionieren. Könnten Sie es bitte versuchen und es uns mitteilen?
Peter Lozovitskiy
Nein, es gibt nur Array
Shekoufeh
8

tostinnis antwort ist in den meisten fällen die richtige. Wenn Sie jedoch den Titel "Ansicht" einfügen möchten, ist dies etwas hässlicher.

Aus der views_embed_view()Dokumentation:

Beachten Sie, dass diese Funktion den Titel der Ansicht NICHT anzeigt. Wenn Sie das tun möchten, müssen Sie das, was diese Funktion tut, manuell tun, indem Sie die Ansicht laden, die Vorschau abrufen und dann abrufen $view->get_title().

Beispielsweise:

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

Aktualisiert : @rojosnow hat bemerkt, dass in den Dokumenten darauf hingewiesen wird, dass Sie die Vorschau erhalten müssen, bevor Sie anrufen. get_title()Ich habe also diese beiden Zeilen vertauscht .

Joshua Stewardson
quelle
Guter Tipp mein Freund.
Stefgosselin
1

Das hat bei mir funktioniert:

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

// und nannte es in HTML wie folgt //

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

Beachten Sie, dass für mich der Standardblock (ohne Namen) aufgerufen wird blockund nicht block_1:

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

Auch auf tostinnis Antwort aufbauend:

Wenn Sie nicht möchten, dass HTML-Code angezeigt wird, wenn die Ansicht keine Ergebnisse liefert. Fügen Sie auch einen Titel hinzu, aber nur, wenn Ergebnisse vorliegen.

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
quelle
0

Sie können Ihren Block rendern, anstatt die Ansichten mit dem folgenden Code zu rendern.

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

Aus eigener Erfahrung können Sie einen Pfad zu einem Ansichtstitel oder -inhalt mit einer Funktion wie der folgenden umwandeln.

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

Verwenden Sie zum Rendern der Ansicht $view->render()anstelle von $view->get_title().

Sicher, bis ich das richtig angerufen habe $view->execute(), hat nichts richtig funktioniert. Ich würde leere Zeichenfolgen (möglicherweise null) als Rückgabewerte erhalten.

Alexis Wilke
quelle