ฉันจะแสดงบล็อกมุมมองโดยทางโปรแกรมได้อย่างไร


32

ฉันสร้างบล็อกการดูซึ่งมีชื่อเครื่องว่า "news"

ฉันจะแสดงโดยใช้module_invoke()และชื่อเครื่องของมุมมองได้อย่างไร

คำตอบ:


62

การใช้views_embed_view():

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

คุณสามารถหาชื่อที่แสดงโดยการคลิกที่แท็บและตรวจสอบชื่อในแถบที่อยู่ของเบราว์เซอร์ของคุณ: ช่วยให้คุณ#views-tab-block_1block_1


แล้ว drupal 8 ล่ะ คุณรู้หรือไม่ว่ามันทำงานใน drupal 8 ได้อย่างไร?
shekoufeh

สำหรับ 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

@shekoufeh ตามเอกสาร ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/ ...... ) มันควรจะทำงานเหมือนกันใน Drupal 8. คุณช่วยลองและบอกเราได้ไหม?
Peter Lozovitskiy

ไม่มันจะส่งกลับเฉพาะอาร์เรย์
shekoufeh

8

คำตอบของ tostinni เป็นคำตอบที่ถูกต้องในกรณีส่วนใหญ่ อย่างไรก็ตามหากคุณต้องการรวมหัวข้อการดูมันก็น่าเกลียดกว่าเล็กน้อย

จาก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>

1

หมายเหตุสำหรับฉันบล็อกเริ่มต้น (ไม่มีชื่อ) เรียกว่าblockมากกว่าblock_1:

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

0

สร้างคำตอบของ tostinni ด้วย:

หากคุณไม่ต้องการให้ 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()ไม่มีอะไรถูกต้อง ฉันจะได้รับสตริงที่ว่างเปล่า (อาจเป็นโมฆะ) เป็นค่าตอบแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.