Como mostro programaticamente um bloco de exibição?

32

Eu criei um bloco de exibição, cujo nome da máquina é "notícias".

Como exibi-lo usando module_invoke()e o nome da máquina da exibição?

vitaly.batonov
fonte

Respostas:

62

Use views_embed_view():

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

Você pode descobrir o nome de exibição clicando na guia e verificando seu nome na barra de endereços do seu navegador: #views-tab-block_1fornece block_1.

tostinni
fonte
e o drupal 8? você sabe como isso funciona no drupal 8?
shekoufeh
Para o Drupal 8, usamos Twig Tweak e essa sintaxe{{ drupal_view('view_machine_name', 'block_1') }}
tostinni
21

Se você deseja passar um parâmetro para a visualização, use:

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

Por exemplo:

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

ou:

echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
Peter Lozovitskiy
fonte
e o drupal 8? você sabe como isso funciona no drupal 8?
shekoufeh
@shekoufeh, de acordo com a documentação ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/… ), deve funcionar da mesma maneira no Drupal 8. Você poderia tentar nos dizer?
Peter Lozovitskiy
não, ele retorna apenas array
shekoufeh
8

a resposta de tostinni é a correta na maioria dos casos. No entanto, se você deseja incluir o título da exibição, é um pouco mais feio.

A partir da views_embed_view()documentação:

Observe que esta função NÃO exibe o título da visualização. Se você quiser fazer isso, precisará fazer o que essa função faz manualmente, carregando a visualização, obtendo a visualização e, em seguida, obtendo $view->get_title().

Por exemplo:

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

Atualizado : @rojosnow observou que os documentos apontam que você deve obter a visualização antes de ligar, get_title()então eu virei essas duas linhas.

Joshua Stewardson
fonte
Boa dica meu amigo.
stefgosselin
1

Isso funcionou para mim:

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

// e chamou em html assim //

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

Observe que, para mim, o bloco padrão (sem nome) é chamado em blockvez de block_1:

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

Também com base na resposta de tostinni:

Se você não deseja que nenhum HTML seja exibido, se a exibição não tiver resultados. Além disso, adicione um título, mas apenas se houver resultados.

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
fonte
0

Você pode renderizar seu bloco em vez de renderizar as visualizações pelo código a seguir.

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

De minha própria experiência, você pode transformar um caminho em um título ou conteúdo de exibição com uma função como a seguinte.

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

Para renderizar a exibição, use em $view->render()vez de $view->get_title().

Com certeza, até eu ligar corretamente $view->execute(), nada funcionou direito. Eu receberia cadeias vazias (talvez nulas) como valores de retorno.

Alexis Wilke
fonte