Bagaimana cara saya menunjukkan blok tampilan secara terprogram?

32

Saya membuat blok tampilan, yang nama mesinnya adalah "berita."

Bagaimana cara menampilkannya menggunakan module_invoke()dan nama mesin tampilan?

vitaly.batonov
sumber

Jawaban:

62

Gunakan views_embed_view():

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

Anda dapat mengetahui nama tampilan dengan mengklik tab dan memeriksa namanya di bilah alamat browser Anda: #views-tab-block_1memberi Anda block_1.

tostinni
sumber
bagaimana dengan drupal 8? Anda tahu bagaimana cara kerjanya di drupal 8?
shekoufeh
Untuk Drupal 8 kami menggunakan Twig Tweak dan sintaks ini{{ drupal_view('view_machine_name', 'block_1') }}
tostinni
21

Jika Anda ingin meneruskan parameter ke tampilan gunakan:

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

Sebagai contoh:

echo views_embed_view('view_machine_name', 'block_1', $node->nid);

atau:

echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
Peter Lozovitskiy
sumber
bagaimana dengan drupal 8? Anda tahu bagaimana cara kerjanya di drupal 8?
shekoufeh
@shekoufeh, menurut dokumentasinya ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/... ), seharusnya berfungsi sama di Drupal 8. Bisakah Anda mencoba dan memberi tahu kami?
Peter Lozovitskiy
tidak, itu hanya mengembalikan array
shekoufeh
8

Jawaban tostinni adalah jawaban yang benar dalam banyak kasus. Namun, jika Anda ingin memasukkan judul View, itu sedikit lebih jelek.

Dari views_embed_view()dokumentasi:

Perhatikan bahwa fungsi ini TIDAK menampilkan judul tampilan. Jika Anda ingin melakukan itu, Anda harus melakukan apa yang fungsi ini lakukan secara manual, dengan memuat tampilan, mendapatkan pratinjau dan kemudian mendapatkan $view->get_title().

Sebagai contoh:

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

Diperbarui : @rojosnow mencatat bahwa dokumen menunjukkan Anda harus mendapatkan pratinjau sebelum menelepon get_title()jadi saya telah membalik kedua baris itu.

Joshua Stewardson
sumber
Tip baik temanku.
stefgosselin
1

Ini Berhasil untuk saya:

$view = views_get_view('view_machine_name');
$view->set_display('Master');
$view->get_title();
$response = $view->preview('You_Block_id');

// dan menyebutnya dalam html seperti ini //

<div class="col-md-4 col-sm-6">
<div class="blocksOuterWrapper companyNewsWrapper">
'.$response.'
</div>
</div>
gurjar devashish
sumber
1

Catatan, bagi saya blok default (tanpa nama) disebut blockdaripada block_1:

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

Juga membangun jawaban tostinni:

Jika Anda tidak ingin HTML apa pun muncul jika tampilan tidak memiliki hasil. Juga, tambahkan judul, tetapi hanya jika ada hasil.

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

Anda dapat merender blok Anda alih-alih merender tampilan dengan kode berikut.

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

Dari pengalaman saya sendiri, Anda dapat mengubah jalur ke judul tampilan atau konten dengan fungsi seperti berikut.

<?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;
}

Untuk membuat tampilan, gunakan $view->render()sebagai ganti $view->get_title().

Yang pasti, sampai saya memanggilnya dengan benar $view->execute(), tidak ada yang berhasil. Saya akan mendapatkan string kosong (mungkin nol) sebagai nilai pengembalian.

Alexis Wilke
sumber