Làm thế nào để tôi lập trình một khối xem?


32

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:


62

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_1cung cấp cho bạn block_1.


Thế còn drupal 8? Bạn có biết làm thế nào nó hoạt động trong drupal 8?
shekoufeh

Đối với Drupal 8, chúng tôi sử dụng Twig Tweak và cú pháp này{{ drupal_view('view_machine_name', 'block_1') }}
tostinni

21

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

Thế còn drupal 8? Bạn có biết làm thế nào nó hoạt động trong drupal 8?
shekoufeh

@shekoufeh, theo tài liệu ( api.drupal.org/api/drupal/core%21modules%21view%21view.module/ ,), nó sẽ hoạt động tương tự trên Drupal 8. Bạn có thể thử và cho chúng tôi biết không?
Peter Lozovitskiy

không, nó chỉ trả về mảng
shekoufeh

8

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.


Mẹo tốt bạn của tôi.
stefgosselin

1

Đ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>

1

Lưu ý, đối với tôi, khối mặc định (không có tên) được gọi blockthay vì block_1:

<?php echo views_embed_view('news_archive', 'block'); ?>

0

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

0

Bạn có thể kết xuất khối của mình thay vì hiển thị các khung nhìn theo đoạn mã sau.

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

0

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ề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.