web-dev-qa-db-fra.com

Comment placer par programme un bloc?

Depuis l'interface utilisateur, vous pouvez ajouter un bloc dans une région de cette façon:

  1. Allez dans Admin -> Structure -> Disposition des blocs (/ admin/structure/block).
  2. Cliquez sur le bouton "Placer un bloc" à côté du nom de la région.

Je veux faire la même chose mais par programme. Comment ajouter un bloc existant à une région et l'enregistrer? Ce bloc doit ensuite être affiché dans cette région et être disponible dans la page Disposition du bloc.

10
user3554770

Pour fournir un bloc de plugin , vous pouvez créer un tableau de paramètres et le transmettre à \Drupal\block\Entity\Block::create() to créez l'objet Block et enregistrez l'instance.

Par exemple, si vous vouliez ajouter un bloc Devel Exécuter PHP au thème Seven:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();
9
Shawn Conn

Vous pouvez utiliser Twig Tweak module:

Le module Twig Tweak fournit une extension Twig avec quelques fonctions et filtres utiles qui peuvent améliorer l'expérience du développeur.

Et puis sur votre twig région du modèle:

{{ drupal_block('block_id') }}
7
rpayanm

Chaque instance d'un bloc (quel "type de bloc", configuration et placement) est une entité de configuration: \Drupal\block\Entity\Block. Donc, tout ce que vous avez à faire est de créer une nouvelle instance de cette entité avec les détails corrects et vous avez terminé.

Cela peut être fait mais c'est un complexe fou, vous devez comprendre le système de plugins, le système de plugins et bien plus encore.

Vous pouvez jeter un œil à \Drupal\block\BlockForm::submitForm pour en savoir plus ou \Drupal\simpletest\BlockCreationTrait::placeBlock. Vous voudrez peut-être penser si c'est quelque chose dont vous avez vraiment besoin, la visibilité du bloc est assez complexe.

6
googletorp

J'apprends juste D8 mais il me semble avoir trouvé un moyen beaucoup plus facile de placer un bloc par programme (cela semblait assez intimidant après avoir lu la réponse de googletorp!)

Lorsque j'ai activé mon module personnalisé qui définissait le bloc, je voulais que le bloc soit automatiquement placé dans la bonne région. Les étapes que j'ai utilisées pour y parvenir sont les suivantes:

  1. Activez le module et placez le bloc à l'aide de l'interface utilisateur à /admin/structure/block
  2. Accédez à la page d'exportation de configuration d'élément unique à admin/config/development/configuration/single/export
  3. Sélectionnez Type de configuration bloc et pour Nom de la configuration sélectionnez le bloc que vous venez de placer à l'aide de l'interface utilisateur, puis copiez le code généré.
  4. Dans votre module, créez le dossier /config/install/
  5. Sous la zone de texte du code généré, il vous indique le nom de fichier que vous devez utiliser. Créez ce fichier dans le /config/install répertoire et copiez-y le code.
  6. Maintenant, lorsque vous désinstallez votre module, puis le réactivez, le bloc sera automatiquement placé.
4
Felix Eve

J'ai trouvé la réponse grâce à Comment manipuler une entité: bloquer par programmation dans Drupal 8 .

use Drupal\block\Entity\Block;

$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();
3
jmzea

L'exemple ci-dessus est assez proche mais n'est toujours pas correct. L'idée est que vous devez trouver votre propre identifiant de l'instance de bloc (dans mon cas, devel_execute_php_1112 (peut-être parce que j'ai essayé de le faire fonctionner 1112 fois, cela restera mystérieux)), puis l'ID de bloc réel (celui qui est déclaré pour les blocs personnalisés dans l'annotation) et le thème. Ensuite, définissez simplement la région et vous êtes prêt à partir. Créé une instance d'un bloc sous la région souhaitée.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1: J'ai en fait vérifié plus tard le commentaire ci-dessus - et c'est vrai. Il n'est tout simplement pas clair que l'ID soit quelque chose que vous devez trouver. En échange de mon commentaire boiteux, je publierai une solution sur la façon de créer une instance de bloc d'une entité de bloc personnalisée:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

essentiellement le même mais pour un plugin, vous écrivez block_content: uuid_of_custom_block_entity_instance

2
Nikolay Borisov