Crear un bloque programáticamente en un módulo de Drupal
Los bloques en Drupal 8 son instancias de plugins de bloque.
El Administrador de bloques de Drupal escanea tus módulos en busca de clases que contengan la anotación @Block.
El siguiente ejemplo de código usa la anotación @Block junto con las propiedades "id" y "admin_label" para definir un bloque personalizado.
Crea el archivo src/Plugin/Block/HelloBlock.php dentro de la estructura de tu módulo previamente creada y añade el siguiente código.
Para que tu sitio Drupal reconozca esta nueva clase, debes limpiar la caché.
<?php namespace Drupal\hello_world\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Proporciona un bloque 'Hello'. * * @Block( * id = "hello_block", * admin_label = @Translation("Hello block"), * category = @Translation("Hello World"), * ) */ class HelloBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return [ '#markup' => $this->t('Hello, World!'), ]; } }
Para añadir el "Hello block", puedes ir a Estructura -> Diseño de bloques (admin/structure/block) y hacer clic en el botón "Colocar bloque" junto a cada región disponible.
Al hacer clic en "Colocar bloque" para cualquier región, aparecerá un diálogo emergente "Colocar bloque" con la lista de todos los bloques disponibles. Para encontrar rápidamente tu bloque, simplemente usa la opción "Filtrar por nombre de bloque" o desplázate para localizar "Hello block". Así, puedes añadir cualquier cantidad de instancias de tu bloque personalizado en cualquier lugar del sitio.
Solución de problemas
- El nombre de la clase y el nombre del archivo deben coincidir exactamente (clase HelloBlock y /src/Plugin/Block/HelloBlock.php). Si el nombre de la clase difiere, el bloque aparecerá en la lista de bloques disponibles, pero no podrás añadirlo.
- Verifica cuidadosamente todas las rutas y nombres de archivos. Tu archivo .php debe estar en el directorio correcto (/src/Plugin/Block/) o Drupal no lo detectará.
- Si tu bloque no se coloca en la región sin errores visibles, revisa los registros de errores de PHP/Apache.
- Si no ves tu bloque en la lista, asegúrate de limpiar las cachés de Drupal (por ejemplo, con drush cr).
- Asegúrate de que el nombre de tu módulo use minúsculas. Algunos usuarios reportan que los bloques no aparecen en módulos con nombres en camelCase. Por ejemplo, myModule no mostrará ciertos bloques, mientras que my_module sí. Esto fue comprobado por última vez en Drupal 8.8.1.
Nota: Uso de plantillas Twig con bloques personalizados
1. Añade un hook_theme en tu archivo .module.
Nota: no nombres la función de tema como 'block__...' porque no pasará variables a las plantillas de bloques. En lugar de eso, usa el nombre del módulo como prefijo.
2. Usa la propiedad «#theme» en el arreglo de renderizado dentro del método build() y pasa variables al mismo nivel que «#theme» con nombres como «#varname».
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.