¿Cómo muestro mediante programación un bloque de vista?

32

Creé un bloque de vista, cuyo nombre de máquina es "noticias".

¿Cómo lo visualizo usando module_invoke()y el nombre de la máquina de la vista?

vitaly.batonov
fuente

Respuestas:

62

Uso views_embed_view():

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

Puede encontrar el nombre para mostrar haciendo clic en la pestaña y verifique su nombre en la barra de direcciones de su navegador: #views-tab-block_1le da block_1.

tostinni
fuente
¿Qué pasa con Drupal 8? ¿sabes cómo funciona en drupal 8?
shekoufeh
Para Drupal 8 usamos Twig Tweak y esta sintaxis{{ drupal_view('view_machine_name', 'block_1') }}
tostinni
21

Si desea pasar un parámetro a la vista, use:

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

Por ejemplo:

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

o:

echo views_embed_view('view_machine_name', 'block_1', $nid, $uid);
Peter Lozovitskiy
fuente
¿Qué pasa con Drupal 8? ¿sabes cómo funciona en drupal 8?
shekoufeh
@shekoufeh, de acuerdo con la documentación ( api.drupal.org/api/drupal/core%21modules%21views%21views.module/… ), debería funcionar de la misma manera en Drupal 8. ¿Podrían intentarlo y contarnos?
Peter Lozovitskiy
no, devuelve solo array
shekoufeh
8

La respuesta de tostinni es la correcta en la mayoría de los casos. Sin embargo, si desea incluir el título Ver, es un poco más feo.

De la views_embed_view()documentación:

Tenga en cuenta que esta función NO muestra el título de la vista. Si desea hacer eso, deberá hacer lo que hace esta función manualmente, cargando la vista, obteniendo la vista previa y luego obteniendo $view->get_title().

Por ejemplo:

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

Actualizado : @rojosnow señaló que los documentos señalan que debe obtener la vista previa antes de llamar, get_title()así que he cambiado esas dos líneas.

Joshua Stewardson
fuente
Buen consejo mi amigo.
stefgosselin
1

Esto funcionó para mí:

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

// y lo llamé en html así //

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

Tenga en cuenta que, para mí, se llama al bloque predeterminado (sin nombre) en blocklugar de block_1:

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

También aprovechando la respuesta de tostinni:

Si no desea que se muestre ningún HTML si la vista no tiene resultados. Además, agregue un título, pero solo si hay 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
fuente
0

Puede representar su bloque en lugar de representar las vistas con el siguiente código.

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

Desde mi propia experiencia, puede transformar una ruta a un título o contenido de vista con una función como la siguiente.

<?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 representar la vista, use en $view->render()lugar de $view->get_title().

Seguro, hasta que llamé correctamente $view->execute(), nada funcionó bien. Obtendría cadenas vacías (tal vez nulas) como valores de retorno.

Alexis Wilke
fuente