Il existe deux types de blocs et la méthode de rendu des deux est un peu différente:
Blocs de contenu
Les blocs de contenu sont des blocs que vous créez dans l'interface. Ils ressemblent beaucoup à des structures de données configurables par nœuds, avec des champs, etc.
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
Blocs de plugin
Les blocs peuvent également être des plugins, définis dans différents modules. Un exemple pourrait être le bloc de fil d'Ariane. Si vous voulez les rendre, vous devrez utiliser le gestionnaire de plugins de blocs.
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
Entités de configuration
Les blocs sont partagés pour les deux types, c'est qu'une fois que vous les insérez dans une région, vous allez créer une entité de configuration qui possède tous les paramètres du bloc. Dans certains cas, il sera plus utile de gérer les entités de configuration. Étant donné que le même bloc peut être placé dans plusieurs régions avec et avec une configuration différente, il peut être plus difficile d'utiliser les entités de configuration de bloc. La bonne chose est que vous pourriez vouloir rendre un bloc avec une configuration spécifique, la mauvaise chose est que les identifiants de configuration peuvent changer en jouant avec l'interface, de sorte que le code pourrait ne pas fonctionner après avoir laissé les utilisateurs utiliser l'interface de bloc.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
Pour afficher uniquement votre bloc dans vos modèles avec prétraitement, la meilleure façon est
Et dans votre
page.html.twig
ounode.html.twig
ouxxx.html.twig
utilisez votre variable My_region comme ceci:Et dans un tableau rendable (module personnalisé) par exemple dans un contrôleur personnalisé dans content ():
En utilisant
n'est pas utile car Drupal assume déjà le rendu en D8 et c'est obsolète . Vous devez utiliser à ladrupal_render
\Drupal::service('renderer')->renderRoot()
place.C'est un peu lourd, il vaut mieux utiliser le système de surface maximale et n'ajoute pas de bloc de charge du pré-processus. Dans le cas de l'utilisation d'un contrôleur dans vos modules, cela semble une utilisation justifiée.
la source
element-content
propriété dans un tableau de rendu. Savez-vous où c'est documenté?\Drupal\block\Entity\Block::load
ne retourne pas tout le temps un bloc. Il ne renvoie quelque chose que si le bloc que je charge est placé dans la vue dans la disposition des blocs . S'il n'est pas placé, il renvoie null.\Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
En plus de la première réponse ... Si vous voulez rendre un bloc à partir d'une vue, vous devrez peut-être faire les choses un peu différemment.
(nom d'affichage par exemple -> block_1)
Puisque nous allons le passer à twig, nous n'avons pas besoin de rendre (en utilisant le service de rendu).
Vous pouvez donc simplement le passer en tant que variable à twig (pour cet exemple, c'est le retour d'un Controller):
dans votre module vous avez besoin d'un hook_theme () pour votre variable:
Et enfin dans votre modèle de brindille:
la source
J'avais besoin d'obtenir le code HTML d'un bloc personnalisé et je l'ai obtenu en utilisant:
la source
__toString()
.la source
drupal_render
ou le service de rendu.drupal_render
est déprécié mais returing un rendu un tableau avec le contenu rendu est assez mauvais, vous devriez retourner à la$block_content
place, le tableau de rendu peut être modifié avant le rendu réel et vous devriez laisser Drupal faire le rendu autant que possible à la place ou le faire vous-même.Fondamentalement, il existe deux types de rendus.
Lorsqu'il existe une instance existante du bloc dans la présentation. le bloc peut être rendu en brindille en utilisant un prétraitement comme
$ block = Block :: load ('BLOCK_ID'); $ variables ['social_links'] = \ Drupal :: entityTypeManager () -> getViewBuilder ('block') -> view ($ block);
Il n'y a aucune instance ou configuration pour le bloc. Ensuite, dans le préprocesseur, nous devons créer l'instance, construire le bloc puis le rendre
$ block_manager = \ Drupal :: service ('plugin.manager.block'); $ config = []; $ plugin_block = $ block_manager-> createInstance ('farmjournal_social_sharing', $ config); $ render = $ plugin_block-> build (); $ variables ['farmjournal_social_sharing'] = render ($ render);
la source
Semble que cela fonctionne pour les blocs de plugins ..
la source
Vous obtenez une sortie de bloc:
Et puis vous pouvez renvoyer la sortie de différentes manières:
ou:
la source
\Drupal::service ('renderer')->render ($block_content)
peut être fait cardrupal_render ($block_content)
Cependant ce dernier est déprécié dans Drupal 8.drupal_render
ou le service de rendu.drupal_render
est déprécié mais returing un rendu un tableau avec le contenu rendu est assez mauvais, vous devriez retourner à la$block_content
place, le tableau de rendu peut être modifié avant le rendu réel et vous devriez laisser Drupal faire le rendu autant que possible à la place ou le faire vous-même. Ce que vous retournez doit être rendu à nouveau, ce qui rend le rendu réel inutileSur la base de mes recherches, vous pouvez baser le code de Comment rendre un bloc par programme dans drupal 8 . Vous pouvez également changer
en quelque chose d'aussi simple que:
pour l'attacher par exemple dans la variable de retour d'une page.
la source
drupal_render
ou le service de rendu.drupal_render
est déprécié mais returing un rendu un tableau avec le contenu rendu est assez mauvais, vous devriez retourner à la$block_content
place, le tableau de rendu peut être modifié avant le rendu réel et vous devriez laisser Drupal faire le rendu autant que possible à la place ou le faire vous-même.