it-swarm-vi.com

Làm thế nào để tôi lập trình một khối 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?

31
vitaly.batonov

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 của bạn: #views-tab-block_1 mang đến cho bạn block_1.

63
tostinni

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);
22
Peter Lozovitskiy

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ừ tài liệu views_embed_view():

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 thực hiện chức năng này bằng tay, 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 bạn phải có bản xem trước trước gọi get_title() vì vậy tôi đã lật hai dòng đó xung quanh.

8
Joshua Stewardson

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

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

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

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
squarecandy

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
Leopathu

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

0
Alexis Wilke