Tôi đã tạo một khối xem, có tên máy là "tin tức".
Làm cách nào để hiển thị nó bằng cách sử dụng module_invoke()
và tên máy của chế độ xem?
Tôi đã tạo một khối xem, có tên máy là "tin tức".
Làm cách nào để hiển thị nó bằng cách sử dụng module_invoke()
và tên máy của chế độ xem?
Câu trả lời:
Sử dụng views_embed_view()
:
echo views_embed_view('view_machine_name', 'block_1');
Bạn có thể tìm ra tên hiển thị bằng cách nhấp vào tab và kiểm tra tên của nó trong thanh địa chỉ của trình duyệt: #views-tab-block_1
cung cấp cho bạn block_1
.
{{ drupal_view('view_machine_name', 'block_1') }}
Nếu bạn muốn truyền tham số cho khung nhìn, hãy sử dụng:
echo views_embed_view('view_machine_name', 'block_1', $param);
Ví dụ:
echo views_embed_view('view_machine_name', 'block_1', $node->nid);
hoặc là:
echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
câu trả lời của tostinni là câu trả lời đúng trong hầu hết các trường hợp. Tuy nhiên, nếu bạn muốn bao gồm tiêu đề View, nó xấu hơn một chút.
Từ views_embed_view()
tài liệu:
Lưu ý rằng chức năng này KHÔNG hiển thị tiêu đề của chế độ xem. Nếu bạn muốn làm điều đó, bạn sẽ cần phải làm những gì chức năng này làm thủ công, bằng cách tải chế độ xem, nhận bản xem trước và sau đó nhận
$view->get_title()
.
Ví dụ:
$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();
Đã cập nhật : @rojosnow lưu ý rằng các tài liệu chỉ ra rằng bạn phải xem trước khi gọi get_title()
vì vậy tôi đã lật hai dòng đó xung quanh.
Điều này làm việc cho tôi:
$view = views_get_view('view_machine_name');
$view->set_display('Master');
$view->get_title();
$response = $view->preview('You_Block_id');
// và gọi nó trong html như thế này //
<div class="col-md-4 col-sm-6">
<div class="blocksOuterWrapper companyNewsWrapper">
'.$response.'
</div>
</div>
Lưu ý, đối với tôi, khối mặc định (không có tên) được gọi block
thay vì block_1
:
<?php echo views_embed_view('news_archive', 'block'); ?>
Cũng dựa trên câu trả lời của tostinni:
Nếu bạn không muốn bất kỳ HTML nào hiển thị nếu chế độ xem không có kết quả. Ngoài ra, thêm một tiêu đề, nhưng chỉ khi có kết quả.
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');
}
Từ kinh nghiệm của riêng tôi, bạn có thể chuyển đổi một đường dẫn đến tiêu đề hoặc nội dung xem với chức năng như sau.
<?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;
}
Để hiển thị chế độ xem, sử dụng $view->render()
thay vì $view->get_title()
.
Chắc chắn, cho đến khi tôi gọi đúng $view->execute()
, không có gì hoạt động đúng. Tôi sẽ lấy các chuỗi rỗng (có thể là null) làm giá trị trả về.