Na interface do usuário, você pode adicionar um bloco em uma região dessa maneira:
- Vá para Admin -> Estrutura -> Layout do bloco (/ admin / structure / block).
- Clique no botão "Inserir bloco" ao lado do nome da região.
Eu quero fazer a mesma coisa, mas programaticamente. Como adicionar um bloco existente a uma região e salvá-lo? Esse bloco deve ser exibido nessa região e estar disponível na página de layout do bloco .
Respostas:
Para fornecer um bloco de plug - in, você pode criar uma matriz de configurações e transmiti-lo
\Drupal\block\Entity\Block::create()
para criar o objeto Block e salvar a instância.Por exemplo, se você deseja adicionar um bloco PHP de Execute Devel ao tema Seven:
fonte
id
que quiser, desde que seja único. Por exemplo, você pode querer começar com o nome do módulo de seu no.Você pode usar o módulo Twig tweak :
E então na sua região de modelo de galho:
fonte
Cada exemplo de um bloco (que "tipo bloco", a configuração e o posicionamento) é uma entidade de configuração:
\Drupal\block\Entity\Block
. Então, tudo que você precisa fazer é criar uma nova instância desta entidade com os detalhes corretos e pronto.Isso pode ser feito, mas é muito complexo, você precisa entender o sistema de plugins, bloquear o sistema de plugins e muito mais.
Você pode dar uma olhada
\Drupal\block\BlockForm::submitForm
para ter uma idéia disso ou\Drupal\simpletest\BlockCreationTrait::placeBlock
. Você pode pensar se isso é algo que você realmente precisa, a visibilidade do bloco é bastante complexa.fonte
Estou apenas aprendendo D8, mas parece que encontrei uma maneira muito mais fácil de colocar um bloco programaticamente (pareceu bastante intimidador depois de ler a resposta do googletorp!)
Quando ativei meu módulo personalizado que definiu o bloco, queria que o bloco fosse automaticamente colocado na região correta. As etapas que eu usei para conseguir isso são:
/admin/structure/block
admin/config/development/configuration/single/export
/config/install/
/config/install
diretório e copie o código lá.fonte
Encontrei a resposta graças a Como manipular uma Entidade: Bloquear programaticamente no Drupal 8 .
fonte
O exemplo acima está próximo o suficiente, mas ainda não está correto. A idéia é que você precise criar seu próprio ID da instância do bloco (no meu caso devel_execute_php_1112 (talvez porque tentei fazê-lo funcionar 1112 vezes, ele permanecerá um mistério)) e, em seguida, o ID do bloco real (aquele que é declarado para os blocos personalizados na anotação) e o tema. Em seguida, basta definir a região e você estará pronto para ir. Criou uma instância de um bloco na região desejada.
edit1: Na verdade, verifiquei mais tarde o comentário acima - e está certo. Simplesmente não está claro que o id seja algo que você precise criar. Como redenção do meu comentário coxo, publicarei uma solução sobre como criar uma instância de bloco de uma entidade de bloco personalizada:
basicamente o mesmo, mas para um plug-in você escreve block_content: uuid_of_custom_block_entity_instance
fonte