¿Cómo coloco un bloque mediante programación?

10

Desde la interfaz de usuario, puede agregar un bloque en una región de esa manera:

  1. Vaya a Admin -> Estructura -> Diseño de bloque (/ admin / structure / block).
  2. Haga clic en el botón "Colocar bloque" junto al nombre de la región.

Quiero hacer lo mismo pero programáticamente. ¿Cómo agrego un bloque existente a una región y lo guardo? Este bloque debería mostrarse en esa región y estar disponible en la página de diseño del bloque .

usuario3554770
fuente
Después de crear el bloque, puede reorganizar la posición del bloque desde: site_name / admin / structure / block
Crazyrubixfan
Supongo que escribiste mal "asignar un bloque a una región".
cilefen
@IcecreamJelly lo que estoy tratando de hacer es hacer esto mediante programación. cilefen, sí, eso es lo que quiero decir% -)
jmzea
@ShawnConn gracias, eso es similar, pero no exactamente lo mismo. He encontrado la respuesta en otro lugar.
jmzea

Respuestas:

9

Para proporcionar un bloque de complemento , puede crear una matriz de configuraciones y pasarla \Drupal\block\Entity\Block::create()para crear el objeto Bloquear y guardar la instancia.

Por ejemplo, si desea agregar un bloque Devel Execute PHP al tema 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
fuente
Hola necesito ayuda He creado un bloque personalizado usando la interfaz de usuario y quiero colocarlo en la región del pie de página mediante programación para fines de prueba. No sé cómo obtener el complemento de los bloques personalizados creados por la interfaz de usuario ... gracias
Mudassar Ali
Haz esto como otra pregunta. Los comentarios no son para hacer preguntas.
Shawn Conn
Ya está allí. drupal.stackexchange.com/questions/207042/…
Mudassar Ali
¿Cuál es la identificación aquí? ¿Es lo mismo que el nombre del bloque?
Crazyrubixfan
@RubberDuckIsKing Creo que puedes nombrar idlo que quieras siempre que sea único. Por ejemplo, es posible que desee comenzar con el nombre del módulo en el que está.
Parag
7

Puede usar el módulo Twig tweak :

El módulo Twig Tweak proporciona una extensión Twig con algunas funciones y filtros útiles que pueden mejorar la experiencia del desarrollador.

Y luego en su región de plantilla de ramita:

{{ drupal_block('block_id') }}
rpayanm
fuente
El problema con esta solución es que los ajustes de ramitas aún requieren que coloque el bloque y luego lo 'deshabilite'.
tóxico
6

Cada instancia de un bloque (que "tipo de bloque", la configuración y la colocación) es una entidad config: \Drupal\block\Entity\Block. Entonces, todo lo que tiene que hacer es crear una nueva instancia de esta entidad con los detalles correctos y ya está.

Esto se puede hacer, pero es una locura compleja, necesitaría comprender el sistema de complementos, bloquear el sistema de complementos y mucho más.

Puede echar un vistazo \Drupal\block\BlockForm::submitFormpara tener una idea de esto o \Drupal\simpletest\BlockCreationTrait::placeBlock. Es posible que desee pensar si esto es algo que realmente necesita, la visibilidad del bloque es bastante compleja.

googletorp
fuente
44
Aparte de las condiciones de visibilidad, no creo que sea tan complicado. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () es probablemente un mejor ejemplo para mirar, también puede importar algunos archivos de configuración exportados.
Berdir el
@ Berdir Gracias por el enlace al rasgo de prueba, lo agregó. Dado que Drupal 8 todavía es muy joven, mucha gente no sabe mucho sobre el sistema de complementos y la documentación podría usar más casos de uso, etc., lo que puede dificultar a muchos desarrolladores trabajar con él.
googletorp
Felix Eve tiene la mejor respuesta. No es un complejo loco.
kratos
@kratos La respuesta que Felix ha proporcionado no está resolviendo la cuestión de cómo colocar un bloque "mediante programación", sino que utiliza archivos de configuración. La configuración solo se puede importar a través de drush, la interfaz de sincronización de configuración o la instalación del módulo. Si tiene que suceder, durante el tiempo de ejecución, fx post save de un tipo de nodo de portada de sección, etc., sería inútil usar esta estrategia :)
googletorp
4

Solo estoy aprendiendo D8, pero parece que he encontrado una manera mucho más fácil de colocar un bloque mediante programación (¡Parecía bastante intimidante después de leer la respuesta de googletorp!)

Cuando habilité mi módulo personalizado que definía el bloque, quería que el bloque se colocara automáticamente en la región correcta. Los pasos que usé para lograr esto son:

  1. Habilite el módulo y coloque el bloque usando la interfaz de usuario en /admin/structure/block
  2. Vaya a la página de exportación de configuración de Elemento único en admin/config/development/configuration/single/export
  3. Seleccione el bloque de tipo de configuración y para el nombre de configuración, seleccione el bloque que acaba de colocar con la interfaz de usuario y luego copie el código generado.
  4. En tu módulo crea la carpeta /config/install/
  5. Debajo del área de texto del código generado, le indica el nombre de archivo que necesita usar. Cree este archivo en el /config/installdirectorio y copie el código allí.
  6. Ahora, cuando desinstale su módulo y luego lo vuelva a habilitar, el bloque se colocará automáticamente.
Víspera de felix
fuente
¿no tendría que eliminar UUID para que esto funcione para otros desarrolladores o entornos?
powpow12
Sí, eliminar el UUID sería una buena idea.
Felix Eve
También podría usar la consola Drupal, que se encarga de automatizar algunas de estas tareas: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau
2

El ejemplo anterior está lo suficientemente cerca pero aún no es correcto. La idea es que tiene que encontrar su propia identificación de la instancia de bloque (en mi caso devel_execute_php_1112 (tal vez porque intenté hacerlo funcionar 1112 veces, seguirá siendo un misterio)) y luego la identificación de bloque real (la que se declara para los bloques personalizados en la anotación) y el tema. Luego simplemente configura la región y listo. Creó una instancia de un bloque debajo de la región deseada.

$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: Realmente revisé más tarde el comentario anterior, y es correcto. Simplemente no está claro que la identificación es algo con lo que tienes que pensar. Como canje por mi comentario poco convincente, publicaré una solución sobre cómo crear una instancia de bloque de una entidad de bloque personalizada:

$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');

básicamente lo mismo, pero para un complemento escribes block_content: uuid_of_custom_block_entity_instance

Nikolay Borisov
fuente