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?
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;
?>
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
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.
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;
vient de tester dans drupal 7 et il fonctionne:
$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
bonne chance!
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
Pour une raison quelconque, 151910920" ne fonctionne pas pour moi, mais ce n':
<?php
$block = module_invoke('block', 'block_view', '1');
echo $block['content'];
?>
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'];
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'))))); ?>
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
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
cela fonctionne pour moi pour imprimer le bloc de menu.
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.
regardez comment Drupal est-il dans _block_render_blocks . Le résultat de cette fonction est passé à drupal_render .
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
module_invoke fonctionne bien pour le bloc de rendu dans le fichier template, mais il ne fonctionne pas les sites multilingues.