Comment placer par programme un bloc?

10

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 des blocs .

user3554770
la source
Après avoir créé le bloc, vous pouvez réorganiser la position du bloc à partir de: nom_site / admin / structure / block
Crazyrubixfan
Je suppose que vous avez mal tapé "attribuer un bloc à une région".
cilefen
@IcecreamJelly ce que j'essaie de faire, c'est de le faire par programme. cilefen, oui c'est ce que je veux dire% -)
jmzea
@ShawnConn merci, c'est similaire, mais pas exactement le même. J'ai trouvé la réponse ailleurs.
jmzea

Réponses:

9

Pour fournir un bloc de plug - in, vous pouvez créer un tableau de paramètres et le transmettre à \Drupal\block\Entity\Block::create()pour créer l'objet Block et enregistrer l'instance.

Par exemple, si vous souhaitez ajouter un bloc Devel Execute 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();
Shawn Conn
la source
Salut, j'ai besoin d'aide. J'ai créé un bloc personnalisé à l'aide de l'interface utilisateur et je souhaite le placer dans la région de pied de page par programme à des fins de test. Je ne sais pas comment obtenir le plugin à partir de blocs personnalisés créés par l'interface utilisateur .. merci
Mudassar Ali
Posez ceci comme une autre question. Les commentaires ne sont pas destinés à poser des questions.
Shawn Conn
c'est déjà là. drupal.stackexchange.com/questions/207042/…
Mudassar Ali
Quel est l' identifiant ici? est-ce le même que le nom du bloc?
Crazyrubixfan
@RubberDuckIsKing Je crois que vous pouvez nommer idtout ce que vous voulez tant qu'il est unique. Par exemple, vous voudrez peut-être le démarrer avec le nom du module son in.
Parag
7

Vous pouvez utiliser le module Twig Tweak :

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

Et puis sur votre région de modèle de brindille:

{{ drupal_block('block_id') }}
rpayanm
la source
Le problème avec cette solution est que twig tweaks vous oblige toujours à placer le bloc, puis à le «désactiver».
lexicant
6

Chaque instance d'un bloc (qui « type de bloc », la configuration et le 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 y jeter un œil \Drupal\block\BlockForm::submitFormpour avoir une idée de ceci 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.

googletorp
la source
4
Mis à part peut-être les conditions de visibilité, je ne pense pas que ce soit si compliqué. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () est probablement un meilleur exemple à regarder, vous pouvez également simplement importer certains fichiers de configuration exportés.
Berdir
@Berdir Merci pour le lien vers le trait de test, l'a ajouté. Étant donné que Drupal 8 est encore si jeune, beaucoup de gens ne savent pas grand-chose sur le système de plugins et la documentation pourrait utiliser plus de cas d'utilisation, etc., ce qui peut compliquer la tâche de nombreux développeurs.
googletorp
Felix Eve a la meilleure réponse. Ce n'est pas un complexe fou.
kratos
@kratos La réponse fournie par Felix ne résout pas réellement la question de savoir comment placer un bloc "par programme", mais utilise plutôt des fichiers de configuration. La configuration ne peut être importée que via Drush, l'interface de synchronisation de configuration ou l'installation de module. Si cela devait se produire, lors de l'exécution, fx post save d'un type de noeud de première page de section, etc., il serait inutile d'utiliser cette stratégie :)
googletorp
4

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'un article à l'adresse admin/config/development/configuration/single/export
  3. Sélectionnez le bloc Type de configuration et pour le 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/installrépertoire et copiez-y le code.
  6. Maintenant, lorsque vous désinstallez votre module, puis le réactivez, le bloc sera automatiquement placé.
Felix Eve
la source
ne seriez-vous pas obligé de supprimer l'UUID pour que cela fonctionne pour d'autres développeurs ou environnements?
powpow12
Oui - la suppression de l'UUID serait une bonne idée.
Felix Eve
Vous pouvez également utiliser la console Drupal, qui se charge d'automatiser certaines de ces tâches: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau
2

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

Nikolay Borisov
la source