Então, eu quero adicionar um identificador de layout personalizado para todas as páginas de exibição de categoria. O identificador que deve ser carregado depende de certos parâmetros de categoria, portanto, o identificador precisa ser adicionado programaticamente com $page->addPageLayoutHandles()
Parece fácil ..? Aparentemente não
O Magento 2 fornece um bom sistema de afterExecute()
plug-ins que eu usaria naturalmente, basta definir um plug-in para ser executado após a categoria original execute()
e enviar todas as atualizações para o objeto Page a partir daí.
Infelizmente, não funciona dessa maneira. O motivo é que o execute()
método original (no final) será executado $page->getConfig()->addBodyClass()
- uma chamada para esse método forçará automaticamente o layout a ser completamente carregado e gerado, portanto, qualquer tentativa subsequente de adicionar novos alças de layout para a página são completamente inúteis. Olhei em volta para encontrar maneiras não tão elegantes de conseguir a mesma coisa (ainda usando plugins) .. não encontrei nenhuma.
Acabei executando meu próprio controlador para exibição de categoria, no entanto, eu não preferiria deixar dessa maneira.
Então, minha pergunta é .. como posso adicionar novos identificadores de layout de página (programaticamente) para exibição de categoria? e faça-o com elegância.
fonte
$page->getConfig()->addBodyClass()
carrega e gera seu layout? Estou tendo uma tarefa semelhante no momento, apenas com páginas do CMS.Respostas:
A maneira XML
Bem, uma maneira fácil é criar o seguinte arquivo na pasta do módulo:
view/frontend/layout/catalog_category_view.xml
com o seguinte conteúdo:Não é mais ou menos elegante do que o modo PHP e, de acordo com o que você achou, é mais seguro.
O jeito PHP
Infelizmente, no seu caso, parece que o PHP é a única maneira de conseguir criar dinamicamente identificadores com base nos parâmetros que a categoria possui.
Via plugins
Em vez de criar um plugin no
execute()
método da sua classe de ação, você pode criar diretamente um plugin noaddPageLayoutHandles()
método deMagento\Framework\View\Result\Page
O principal problema é que ele será chamado toda vez que esse método for chamado e você terá que adicionar algumas condições no código do plug-in para garantir que você esteja em uma página de visualização por categoria.
Via preferências
Outra maneira de fazer isso seria usar preferências para a classe de ação de exibição de categoria:
Em sua classe de controlador personalizado, você simplesmente substitui o
execute()
método copiando / colando o método original e adicionando suas modificações diretamente nesse método.O principal problema é que, quando você atualizar sua instalação do Magento, se forem adicionadas alterações à classe de ação original do Magento, ela não será refletida na sua classe de ação personalizada.
fonte
Eu tive um problema parecido. para categorias que não mostram listagens de produtos, eu precisava de uma alça extra. depois de não adicionar o identificador através do XML de layout personalizado da categoria, acabei adicionando-o em um observador no
layout_load_before
evento:há um pequeno impacto no desempenho envolvido, pois o observador é chamado para todas as visualizações de página. infelizmente, todos os eventos relacionados a 'category_view' parecem muito cedo (categoria ainda não carregada) ou muito tarde (layout já processado).
fonte
\Magento\Cms\Controller\Page\View::execute()
e\Magento\Framework\View\Result\Page::addPageLayoutHandles() or render()
não funcionou. Essa solução de último recurso foi a única solução que funcionou para mim.Vamos tentar observar o evento layout_load_before. A função de execução será a mesma:
Espero que isso ajude
fonte