En Drupal 6, pude controlar la visibilidad del bloque usando el código PHP en la configuración de la interfaz de usuario del bloque como:
<?php return MYMODULE_abc() || MYMODULE_def() ; ?>
Estas funciones buscaron el nodo actual, la taxonomía, etc. para decidir si mostrar el bloque. Esta opción PHP desapareció en Drupal 8, pero hay un $visibility
campo en BlockBase
. ¿Puedo usar esto para establecer programáticamente la visibilidad en tiempo de ejecución?
Respuestas:
Un fragmento de código de trabajo sobre cómo usarlo
hook_block_access()
. Aquí recupero la condición de un campo del nodo actual:Gracias @Insasse por compartir la siguiente joya en los comentarios. Para bloques personalizados creados mediante programación, puede controlar la visibilidad directamente desde dentro de la clase de bloque a través de
blockAccess()
:Fuente: Cómo crear un bloque mediante programación en Drupal 8
fuente
Al carecer del filtro php en Drupal 8, esto ya no será posible desde la interfaz de usuario.
La única opción es usar la api de bloque.
hook_block_access es tu mejor canidate. Desde allí puede verificar
$operation
y devolver un AccessResult según sus condiciones.Al igual que en la interfaz de usuario solo esta vez colocando el php en un módulo.
fuente
Aquí está la solución Drupal 8: Bloquear Excluir páginas .
fuente
Para 8.2.x necesita crear un complemento de condición e implementar ContextProviderInterface .
Vea un ejemplo de DO pero de alguna manera está desactualizado (porque BlockEvent y BlockSubscriberBase se eliminaron a favor de un servicio de depósito de contexto).
También sería bueno usar la consola de Drupal para generar el complemento:
fuente
Para ampliar las posibilidades de visibilidad del bloque, puede probar este parche:
https://www.drupal.org/project/drupal/issues/923934#comment-12401360
introduce el operador de conjunción AND / OR para las condiciones de visibilidad para que pueda decir oh, quiero que este bloque sea visible si es de my_content_type O el usuario tiene un rol de administrador O la url comienza con mi / ruta / a / * etc. también las condiciones podría negarse para que pueda establecer muchas condiciones en las que no desea que su bloque sea visible
Además, si usa el módulo Drupal Commerce, puede probar lo anterior instalando el https://www.drupal.org/project/commerce_quick_purchase , tenga en cuenta que al instalar el módulo, se expone esta funcionalidad para todos los bloques del sistema, incluso si no lo hace ' t use el bloque provisto por el módulo ver más
https://github.com/drugan/commerce_quick_purchase#block-visibility
adicionalmente puede crear su propio complemento de condición, ver ejemplo del módulo
https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition
fuente