Я створив блок перегляду, назва машини якого - "новини".
Як відобразити його за допомогою module_invoke()
та назви машини в представленні даних?
Я створив блок перегляду, назва машини якого - "новини".
Як відобразити його за допомогою module_invoke()
та назви машини в представленні даних?
Відповіді:
Використання views_embed_view()
:
echo views_embed_view('view_machine_name', 'block_1');
Дізнатися назву відображення можна, натиснувши вкладку і перевірити її ім'я в адресному рядку вашого браузера: #views-tab-block_1
дає вам block_1
.
{{ drupal_view('view_machine_name', 'block_1') }}
Якщо ви хочете передати параметр перегляду, використовуйте:
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);
Відповідь тостінні в більшості випадків правильна. Однак, якщо ви хочете включити назву 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()
тому я перегорнув ці два рядки.
Це працювало для мене:
$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>
Зауважте, для мене блок за замовчуванням (без імені) називається, block
а не block_1
:
<?php echo views_embed_view('news_archive', 'block'); ?>
Також спираючись на відповідь тостінні:
Якщо ви не хочете, щоб якийсь 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');
}
З мого власного досвіду ви можете перетворити шлях до заголовка чи вмісту перегляду за допомогою такої функції.
<?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()
, нічого не вийшло. Я отримаю порожні рядки (можливо, нульові) як значення повернення.