No Drupal 6, eu podia controlar a visibilidade do bloco usando o código PHP na configuração da interface do usuário do bloco, como:
<?php return MYMODULE_abc() || MYMODULE_def() ; ?>
Essas funções procuraram o nó atual, taxonomia etc. para decidir se o bloco seria exibido. Esta opção do PHP desapareceu no Drupal 8, mas há um $visibility
campo no BlockBase
. Posso usar isso para definir programaticamente a visibilidade em tempo de execução?
Respostas:
Um trecho de código de trabalho como usar
hook_block_access()
. Aqui, recupero a condição de um campo do nó atual:Obrigado @Insasse por compartilhar a seguinte jóia nos comentários. Para blocos personalizados criados por programação, você pode controlar a visibilidade diretamente de dentro da classe de blocos através de
blockAccess()
:Fonte: Como criar programaticamente um bloco no Drupal 8
fonte
Na falta do filtro php no Drupal 8, isso não será mais possível na interface do usuário.
A única opção é usar a API do bloco.
hook_block_access é o seu melhor candidato. A partir daí, você pode verificar
$operation
e devolver um AccessResult com base em suas condições.Assim como na interface do usuário, apenas desta vez colocando o php em um módulo.
fonte
Aqui está a solução Drupal 8: Bloquear páginas de exclusão .
fonte
Para 8.2.x, você precisa criar um Plugin de Condição e implementar o ContextProviderInterface .
Veja um exemplo do DO, mas está desatualizado (porque o BlockEvent e o BlockSubscriberBase foram removidos em favor de um serviço de repositório de contexto).
Seria bom também usar o console do Drupal para gerar o plugin:
fonte
Para ampliar as possibilidades de visibilidade do bloco, você pode tentar este patch:
https://www.drupal.org/project/drupal/issues/923934#comment-12401360
ele introduz o operador de conjunção AND / OR para as condições de visibilidade, para que você possa dizer oh, eu quero esse bloco visível se for do my_content_type OU o usuário tem função administrativa OU o URL começa com meu / path / to / * etc. também as condições pode ser negado para que você possa definir muitas condições nas quais não deseja que seu bloco fique visível
Além disso, se você usar o módulo Drupal Commerce, poderá tentar o acima, instalando o módulo https://www.drupal.org/project/commerce_quick_purchase. Observe que a instalação do módulo expõe essa funcionalidade para todos os blocos do sistema, mesmo que você não t use o bloco fornecido pelo módulo veja mais
https://github.com/drugan/commerce_quick_purchase#block-visibility
Além disso, você pode criar seu próprio plug-in de condição, veja o exemplo no módulo
https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition
fonte