TL; DR: existe uma maneira eu posso depurar o carregamento do layout? Como acredito que o layout de um módulo está em conflito com outro.
Relacionado a uma pergunta anterior que fiz: Como criar um layout de módulo para ser mostrado em todos os temas
Carreguei meu módulo com sucesso no meu ambiente de teste local (também conhecido como PC de desenvolvimento), testei a alternância entre três temas diferentes e está tudo bem. Atualizei o módulo no ambiente de teste ou "pré-produção" que possuímos, onde existem muitos módulos diferentes, alguns proprietários outros criados por nós. Nesse ambiente, o módulo não mostra o que é necessário na página inicial do produto. Após alguns testes, finalmente chego à conclusão de que o problema deve estar no processo de carregamento do layout.
Então, existe uma maneira de depurar o carregamento do layout, como diferentes módulos substituem ou adicionam seus próprios blocos? O que quero dizer é que acredito que há pelo menos um módulo que deveria estar em conflito com o meu. E como temos tantos módulos, estou procurando uma abordagem diferente para desativar os módulos um por um e ver qual é o problemático.
Meu arquivo config.xml é:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Dts_Banners>
<version>0.1.0</version>
</Dts_Banners>
</modules>
<global>
<blocks>
<banners>
<class>Dts_Banners_Block</class>
</banners>
</blocks>
....
<events>
<controller_action_layout_load_before>
<observers>
<attributesethandle>
<class>Dts_Banners_Model_Observer</class>
<method>addAttributeSetHandle</method>
</attributesethandle>
</observers>
</controller_action_layout_load_before>
</events>
</global>
....
</config>
Meu arquivo Observer:
<?php
class Dts_Banners_Model_Observer
{
/**
* Checks if the search text on the list of active campaigns (dts_banners_admin table) has some of the comma separated text on the product name
* If text found, add a layout handle PRODUCT_CAMPAIGN_BANNER after PRODUCT_TYPE_<product_type_id> handle
* This handle is handled on the banners.xml layout file that triggers the use of the Front.php frontend block
*
* Event: controller_action_layout_load_before
*
* @param Varien_Event_Observer $observer
*/
public function addAttributeSetHandle(Varien_Event_Observer $observer) {
$product = Mage::registry('current_product');
if (!($product instanceof Mage_Catalog_Model_Product)) return;
....
....
}
Este é o meu arquivo de layout:
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<default>
<reference name="content">
<block type="banners/front" name="banners.front" as="banners_front" template="banners/product.phtml" before="-"/>
</reference>
</default>
</layout>
Anteriormente tinha um pouco diferente, onde em vez de <default></default>
eu tinha <Product_Campaign_Banner></Product_Campaign_Banner>
. Também funcionou.
Meu arquivo product.phtml:
<div class="visual">
<?php echo $this->showCampaign(); ?>
</div>
O product.phtml
arquivo não é carregado e, portanto, o showCampaign
não é executado e é aí que todo o HTML necessário é criado.
Respostas:
Você pode registrar as diretivas XML de layout compiladas usadas para gerar blocos. Crie um observador
controller_action_layout_generate_blocks_before
e, no método observador, registre o XML de atualização a partir do objeto de layout transportado:A saída será semelhante a:
fonte
controller_action_layout_generate_blocks_before
" - esta é uma pergunta M1.Você pode recuperar todas as alças de layout no seu controlador, fazendo o seguinte:
Ou em qualquer lugar (desde que o layout tenha sido inicializado) usando este:
Talvez isso ajude você a depurar.
EDITAR
Você configurou seu config.xml para especificar a classe de bloco?
fonte
core/template
? Isso é apenas para cancelar erros nas configurações do seu módulo.Estou usando o PhpStorm com Magicento e, por isso, pensei em adaptar a @benmarks ótima resposta ao meu uso.
No PhpStorm, abra
app/code/core/Mage/Core/Controller/Varien/Action.php
e coloque um ponto de interrupção no métodogenerateLayoutBlocks()
. Eu acho que o objetivo é inseri-lo em qualquer lugar antes$this->getLayout()->generateBlocks();
. Coloquei na linha anterior.Depois de inserir o ponto de interrupção, indicado pelo ponto vermelho à esquerda pelo número da linha, você pode clicar com o botão direito do mouse para personalizar o comportamento. Clique em "Mais" na parte inferior para abrir todas as opções.
Depois de abrir, marque a caixa de seleção "Mensagem de log para console" (opcional) e "Expressão avaliada por log" (onde a mágica acontece). Em seguida, copie e cole esta adaptação do código da benmark na caixa de texto. A única coisa que mudei é soletrar a
$request
variável comoMage::app()->getRequest()
sempre, e alterei a$o
variável para$this
(b / c, não estamos no contexto do observador aqui).Então agora fica assim:
Depois de executar o programa (usando o xdebug ou o zend debugger), você irá parar no ponto de interrupção e verá isso no log:
Parece haver um limite de tamanho para as entradas de log que podem ser determinadas pela
idea.cycle.buffer.size
propriedade noidea.properties
arquivo do PhpStorm, de acordo com isso . Você pode mudar isso, ou apenas clicar com o botão direito do mouse na janela de código e selecionar "Avaliar Expressão" no menu suspenso, copiar e colar o código para executar lá e obterá a saída completa.No pop-up "Avaliar expressão", você pode clicar com o botão direito do mouse (Windows) no resultado e selecionar "Copiar valor" para obter toda a saída e colá-la em outro lugar para análise.
fonte
Utilizamos a extensão Commerce Bug de Alan Storm e consideramos indispensável a depuração de várias coisas no Magento, incluindo problemas de layout. Para layouts, é possível ver quais identificadores de layout estão ativos em cada página e quais configurações xml de layout estão sendo aplicadas à página.
Não é gratuito, mas economizará muito tempo depurando esse tipo de coisa.
Nota: não sou afiliado ao Alan Storm ou ao Commerce Bug, mas apenas um cliente satisfeito.
fonte
Thanx Ben Marks! Esta é a minha versão do logger de layout xml que você descreveu.
É um arquivo muito longo, então eu criei XML dele ... :-) Você pode abrir com um editor normal ....
E meu config.xml se parece com isso no nó:
Agora, espero que meu designer possa explicar tudo isso ... \ o /
fonte
Você pode adicionar isso à sua ação do controlador. Ele mostrará alças de maneira mais elegante que var_dump.
fonte