¿Cómo insertar un bloque en un nodo o plantilla en Drupal 7?


En Drupal 6, era fácil insertar un bloque en una plantilla con el siguiente código:

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];

Sin embargo, usar las mismas instrucciones en Drupal 7 no parece funcionar. He mirado alrededor y no puedo encontrar el nuevo método.

¿Drupal 7 tiene una rutina que permita insertar un bloque mediante programación en una plantilla o nodo?

Author: Cœur, 2011-01-19

15 answers

Con la respuesta de wrburgess puede obtener un error si su servidor está utilizando una versión más reciente de PHP.

Strict warning: Only variables should be passed by reference in include()...

Esto es lo que hice para no causar/deshacerse del error.

  <?php
    $blockObject = block_load('views', 'block_name');
    $block = _block_get_renderable_array(_block_render_blocks(array($blockObject)));
    $output = drupal_render($block);
    print $output;
  ?>
 18
Author: canintex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-10 16:12:37

D7:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

'module_name' = El nombre de la máquina del módulo (es decir, el nombre de la carpeta del módulo). Esto también es cierto para los módulos principales, así que por ejemplo, 'buscar', 'usuario' y 'comentario' funcionarían aquí.

'block_delta' = el nombre de La máquina del bloque. Puede determinar qué es esto visitando la página de administración de bloques y editando el bloque. La URL para editar un bloque de formulario web, por ejemplo, sería algo como:

Drupal 7: admin / structure / block / manage / formulario web/client-block-11 / configure

En este ejemplo, 'webform' es el nombre del módulo, 'client-block-11' es el delta del bloque.

Los bloques personalizados tendrán el nombre del módulo 'block' y un número para un delta, que también puede encontrar editando el bloque.

Más información: http://drupal.org/node/26502

 85
Author: kloewer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 03:17:23

Esta parece ser la solución para insertar bloques en plantillas para Drupal 7, pero parece un poco torpe y no tengo idea sobre el impacto en el rendimiento:

$block = block_load('views', 'block_name');      
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));        
print $output;

Si alguien tiene un procedimiento mejor, por favor agregue.

 27
Author: Randy Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 17:30:04

Este trabajo para mí:

98 es el id del bloque

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
 11
Author: CaDyMaN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-27 13:52:18

Acabo de probar esto en drupal 7 y funciona:

$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);

¡Buena suerte!

 7
Author: DanyAlejandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 23:21:28

La función module_invoke() funciona. Sin embargo, descubrí que representar un bloque de esta manera aparentemente no usará una plantilla personalizada para ese bloque. Esto podría estar bien dependiendo de sus necesidades.

Como se comentó anteriormente en otras respuestas, esto también funciona y también hace uso de plantillas personalizadas:

$raw_block = block_load('your-module', 'delta');
$rendered_block = drupal_render(_block_get_renderable_array(_block_render_blocks(array($raw_block))));
print $rendered_block;

Por lo tanto, si tiene un archivo de plantilla personalizado block--your-module--delta.tpl.php, se utilizará para formatear el bloque.

Fuente: http://api.drupal.org/api/drupal/includes! module. inc / function / module_invoke/7

 5
Author: cafonso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-05 20:22:17

Por alguna razón render() no funciona para mí, pero esto sí:

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
 5
Author: user1253382,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 13:49:21

En mi búsqueda para incluir un bloque en una plantilla, me encontré con este post.

Como adición, si quieres incluir un bloque personalizado (que agregaste a través de la interfaz de bloques) tienes que usar (en lugar de block_load(); en drupal 7)

$block = block_get_custom_block($bid);
$content = $block['body'];
 3
Author: michaelmol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 07:08:47

Mejorando la respuesta de wrburgess, puedes hacerlo en una línea...

<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('module_name', 'block_delta'))))); ?>

Por ejemplo, uso el bloque número 6...

<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('block', '6'))))); ?>
 3
Author: Santiago Bendavid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 22:43:15

Esto funcionó para mi Drupal 7 , URL: admin / structure/block/manage / addthis/addthis_block / configure NOTA: delta y nombre del módulo presentes en la propia url

$addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);

Se puede encontrar más información en http://technarco.com/drupal/insert-block-node-or-template-drupal-7

 3
Author: Umesh Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-15 09:32:00
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

Esto funciona para mí para imprimir el bloque de menú.

 1
Author: MilanG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 09:09:12

Hay un módulo llamado insert_block para aquellos que quieran insertar el bloque "Drupal way" (para no programar nada, solo habilite el módulo). Aquí's cómo configurarlo.

NOTA: Sé que esta pregunta se trata de "insertar programáticamente un bloque en una plantilla o nodo", pero Google envía a la gente aquí incluso su están buscando solución no programador como yo.

 1
Author: Jasom Dotnet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 10:13:04

Echa un vistazo a cómo lo hace Drupal en _block_render_blocks. El resultado de esa función se pasa a drupal_render.

 0
Author: Oswald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 03:35:04

Recientemente me enfrenté al mismo problema y me encontré con una buena solución que describe la solución en drupal como la manera de drupal.

Puede imprimir regiones dentro de cualquier plantilla, pero no están disponibles fuera de la caja en el nodo.tpl.plantilla php. Para que estén disponibles, creará una nueva variable para su uso en su nodo.tpl.plantilla php que contendrá todo el contenido de la región.

La creación de nuevas variables de plantilla se realiza utilizando una función de preproceso. En la plantilla de tu tema.php archivo, crear una función que se vea así:

function mytheme_preprocess_node(&$variables) {
  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Luego, en el nodo de tu tema.tpl.plantilla php, puede representar cualquier región haciendo lo siguiente:

<?php print render($region['sidebar_first']); ?>

Donde sidebar_first es el nombre de la región que desea representar.

Lea el artículo completo aquí: https://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template

 0
Author: Prabhat Ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:46:54

Module_invoke Funciona bien para el bloque de renderizado en el archivo de plantilla, pero no funciona en sitios multilingües.

 0
Author: Sohan Jangid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-08 10:24:34