Як я програматично показую блок перегляду?


32

Я створив блок перегляду, назва машини якого - "новини".

Як відобразити його за допомогою module_invoke()та назви машини в представленні даних?

Відповіді:


62

Використання views_embed_view():

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

Дізнатися назву відображення можна, натиснувши вкладку і перевірити її ім'я в адресному рядку вашого браузера: #views-tab-block_1дає вам block_1.


як щодо drupal 8? чи знаєте ви, як це працює в drupal 8?
шекуф

Для Drupal 8 ми використовуємо Twig Tweak і цей синтаксис{{ drupal_view('view_machine_name', 'block_1') }}
tostinni

21

Якщо ви хочете передати параметр перегляду, використовуйте:

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

Наприклад:

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

або:

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

як щодо drupal 8? чи знаєте ви, як це працює в drupal 8?
шекуф

@shekoufeh, згідно з документацією ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/… ), вона повинна працювати так само і на Drupal 8. Чи можете ви, будь ласка, спробуйте сказати нам?
Петро Лозовицький

ні, він повертає просто масив
shekoufeh

8

Відповідь тостінні в більшості випадків правильна. Однак, якщо ви хочете включити назву View, це трохи потворніше.

З views_embed_view()документації:

Зауважте, що ця функція НЕ відображає назву перегляду. Якщо ви хочете це зробити, вам потрібно буде виконати те, що ця функція виконує вручну, завантаживши подання, отримавши попередній перегляд, а потім отримавши $view->get_title().

Наприклад:

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

Оновлено : @rojosnow зазначив, що документи вказують, що ви повинні отримати попередній перегляд перед викликом, get_title()тому я перегорнув ці два рядки.


Добрий підказку мій друже.
stefgosselin

1

Це працювало для мене:

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

// і називав його в html, як це //

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


0

Також спираючись на відповідь тостінні:

Якщо ви не хочете, щоб якийсь HTML відображався, якщо представлення не має результатів. Також додайте заголовок, але лише за наявності результатів.

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

Можна замінити блок замість того, щоб переглядати перегляди за наступним кодом.

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

0

З мого власного досвіду ви можете перетворити шлях до заголовка чи вмісту перегляду за допомогою такої функції.

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

Щоб переглянути подання, використовуйте $view->render()замість $view->get_title().

Напевно, поки я правильно не зателефонував $view->execute(), нічого не вийшло. Я отримаю порожні рядки (можливо, нульові) як значення повернення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.