Comment insérer un bloc dans un noeud ou un modèle dans Drupal 7?

dans Drupal 6, il était facile d'insérer un bloc dans un modèle avec le code suivant:

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

cependant, utiliser les mêmes instructions dans Drupal 7 ne semble pas fonctionner. J'ai cherché partout et je ne trouve pas la nouvelle méthode.

Drupal 7 a-t-il une routine qui permet l'insertion programmatique d'un bloc dans un modèle ou un noeud?

35
demandé sur Cœur 2011-01-19 06:16:46

15 réponses

avec la réponse de wrburgess vous pouvez obtenir une erreur si votre serveur utilise une nouvelle version de PHP.

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

C'est ce que j'ai fait pour ne pas causer/se débarrasser de l'erreur.

  <?php
    $blockObject = block_load('views', 'block_name');
    $block = _block_get_renderable_array(_block_render_blocks(array($blockObject)));
    $output = drupal_render($block);
    print $output;
  ?>
18
répondu canintex 2014-03-10 16:12:37

D7:

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

"module_name " = le nom de machine du module (c'est-à-dire le nom de dossier du module). C'est vrai pour les modules de base aussi, donc par exemple 'Recherche', 'utilisateur' et 'commentaire' fonctionneraient ici.

"block_delta " = le nom de machine du bloc. Vous pouvez déterminer ce que c'est en visitant la page d'administration du bloc et en éditant le bloc. URL pour éditer un bloc de formulaire Web, par exemple, serait quelque chose comme:

Drupal 7: admin/structure/block/gérer/ webform / client-bloc-11 /configure

dans cet exemple, 'webform' est le nom du module, 'client-block-11' est le delta du bloc.

blocs personnalisés auront le nom de module de 'bloc' et un numéro pour un delta, que vous peut aussi trouver en éditant le bloc.

plus d'informations: http://drupal.org/node/26502

85
répondu kloewer 2014-12-02 03:17:23

cela semble être la solution pour insérer des blocs dans les gabarits pour Drupal 7, mais il semble un peu grotesque et je n'ai aucune idée de l'impact sur la performance:

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

Si quelqu'un a une meilleure procédure, s'il vous plaît ne ajouter.

27
répondu Randy Burgess 2011-01-19 17:30:04

ce travail pour moi:

98 est l'id du bloc

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
11
répondu CaDyMaN 2012-11-27 13:52:18

vient de tester dans drupal 7 et il fonctionne:

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

bonne chance!

7
répondu DanyAlejandro 2011-07-19 23:21:28

la fonction module_invoke() fonctionne. Cependant, j'ai trouvé que rendre un bloc de cette façon n'utilise apparemment pas un modèle personnalisé pour ce bloc. Cela pourrait être acceptable selon vos besoins.

comme déjà commenté dans d'autres réponses, cela fonctionne aussi bien et fait également usage de gabarits personnalisés:

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

donc, si vous avez un fichier de modèle personnalisé block--your-module--delta.tpl.php , il sera utilisé pour formater le bloc.

Source: http://api.drupal.org/api/drupal/includes-oui.module.inc / function / module_invoke / 7

5
répondu cafonso 2012-08-05 20:22:17

Pour une raison quelconque, 151910920" ne fonctionne pas pour moi, mais ce n':

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
5
répondu user1253382 2016-10-18 13:49:21

Dans ma recherche pour inclure un bloc dans un modèle, je suis tombé sur ce post.

comme ajout, si vous voulez inclure un bloc personnalisé (que vous avez ajouté via l'interface de bloc) vous devez utiliser (au lieu de block_load(); dans drupal 7)

$block = block_get_custom_block($bid);
$content = $block['body'];
3
répondu michaelmol 2012-11-08 07:08:47

améliorer la réponse de wrburgess, vous pouvez le faire en une seule ligne...

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

donc par exemple, j'utilise le bloc numéro 6...

<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('block', '6'))))); ?>
3
répondu Santiago Bendavid 2015-01-04 22:43:15

cela a fonctionné pour mon Drupal 7 , URL: admin/structure/block/gérer/ addthis / addthis_block /configurer NOTE: nom de delta et de module présent dans l'url elle-même

$addblock = module_invoke('addthis','block_view','addthis_block');

print render($addblock['content']);

Plus d'informations peuvent être trouvées sur http://technarco.com/drupal/insert-block-node-or-template-drupal-7

3
répondu Umesh Patil 2018-06-15 09:32:00
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

cela fonctionne pour moi pour imprimer le bloc de menu.

1
répondu MilanG 2014-03-26 09:09:12

il y a un module appelé insert_block pour ceux qui veulent insérer le bloc" Drupal way " (pour ne rien programmer, il suffit d'activer le module). Ici comment le configurer.

NOTE: je sais que cette question Est sur "l'insertion programmatique d'un bloc dans un modèle ou un noeud" mais Google envoie les gens ici même leurs sont à la recherche de solution sans programmeur comme moi.

1
répondu Jasom Dotnet 2016-01-25 10:13:04

regardez comment Drupal est-il dans _block_render_blocks . Le résultat de cette fonction est passé à drupal_render .

0
répondu Oswald 2011-01-19 03:35:04

récemment, j'ai fait face à la même question et je suis tombé sur une solution agréable qui décrit la solution dans drupal comme la voie de drupal.

vous pouvez imprimer des régions à l'intérieur de n'importe quel modèle, mais elles ne sont pas disponibles dans la boîte dans le noeud.tpl.template php. Pour les rendre disponibles, vous allez créer une nouvelle variable à utiliser dans votre noeud.tpl.template php qui contiendra tout le contenu de la région.

créer de nouvelles variables de modèle est fait en utilisant un pré-processus fonction. Dans le modèle de votre thème.fichier php, créer une fonction qui ressemble à ceci:

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

puis, dans le noeud de votre thème.tpl.modèle php, vous pouvez rendre n'importe quelle région en faisant ce qui suit:

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

où sidebar_first est le nom de la région que vous voulez rendre.

Lire l'article complet ici: https://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template

0
répondu Prabhat Ranjan 2017-04-13 12:46:54

module_invoke fonctionne bien pour le bloc de rendu dans le fichier template, mais il ne fonctionne pas les sites multilingues.

0
répondu Sohan Jangid 2018-06-08 10:24:34