web-dev-qa-db-fra.com

Comment insérer un bloc dans un nœud 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 regardé autour de moi et je ne trouve pas la nouvelle méthode.

Drupal 7 a-t-il une routine permettant d'insérer un bloc par programme dans un modèle ou un noeud?

35
Randy Burgess

Avec la réponse de wrburgess, vous risquez d'obtenir une erreur si votre serveur utilise une version plus récente de PHP.

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

C'est ce que j'ai fait pour ne pas causer/éliminer 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;
  ?>
19
canintex

D7:

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

'nom_du_module' = Le nom de la machine du module (c'est-à-dire le nom du dossier du module). Cela vaut également pour les modules de base. Ainsi, par exemple, «recherche», «utilisateur» et «commentaire» fonctionneraient tous ici.

'block_delta' = Nom de l'ordinateur du bloc. Vous pouvez déterminer ce qu'il en est en visitant la page d'administration du bloc et en le modifiant. L'URL pour éditer un bloc de formulaire Web, par exemple, serait quelque chose comme:

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

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

Les blocs personnalisés auront le nom de module 'bloc' et un numéro pour un delta, que vous pouvez également trouver en modifiant le bloc.

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

85
kloewer

Cela semble être la solution pour insérer des blocs dans les modèles de Drupal 7, mais cela semble un peu maladroit et je n'ai aucune idée de l'impact sur les performances:

$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, veuillez ajouter.

27
Randy Burgess

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
CaDyMaN

Je viens de tester cela dans drupal 7 et cela fonctionne:

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

Bonne chance!

7
DanyAlejandro

La fonction module_invoke() fonctionne. Cependant, j'ai constaté que le rendu d'un bloc de cette manière n'utiliserait apparemment pas de modèle personnalisé pour ce bloc. Cela pourrait être OK en fonction de vos besoins.

Comme indiqué précédemment dans d'autres réponses, cela fonctionne également et utilise également des modèles 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;

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

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

5
cafonso

Pour une raison quelconque, render() ne fonctionne pas pour moi, mais cela fonctionne: 

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
5
user1253382

En améliorant 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
Santiago Bendavid

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

En outre, si vous souhaitez 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
michaelmol
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

Cela fonctionne pour moi pour l'impression du bloc de menu.

1
MilanG

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

NOTE: Je sais que cette question concerne "l'insertion par programme d'un bloc dans un modèle ou un noeud", mais Google envoie des personnes ici même si elles recherchent une solution non programmable comme moi.

1
Jasom Dotnet

Découvrez comment Drupal le fait dans _block_render_blocks . Le résultat de cette fonction est passé à drupal_render .

0
Oswald

module_invoke Fonctionne bien pour le bloc de rendu dans le fichier modèle, mais les sites multilingues ne fonctionnent pas.

0
Sohan Jangid

Récemment, j'ai rencontré le même problème et je suis tombé sur une solution de Nice qui décrit la solution dans Drupal comme étant celle de Drupal.

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

La création de nouvelles variables de modèle est effectuée à l'aide d'une fonction de prétraitement. Dans le fichier template.php de votre thème, créez 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();
    }
  }
}

Ensuite, dans le modèle node.tpl.php de votre thème, vous pouvez rendre n'importe quelle région en procédant comme suit:

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

Où sidebar_first est le nom de la région à rendre.

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

0
Prabhat Ranjan