TL; DR: ¿hay alguna forma de depurar la carga del diseño? Como creo, el diseño de un módulo está en conflicto con otro.
Relacionado con una pregunta anterior que hice: Cómo hacer que un diseño de módulo se muestre en todos los temas
Cargué con éxito mi módulo en mi entorno de prueba local (también conocido como mi PC de desarrollo), probé el cambio entre 3 temas diferentes y está bien. Luego actualicé el módulo en el entorno de prueba o "preproducción" que tenemos, donde hay muchos módulos diferentes, algunos patentados y otros creados por nosotros. En este entorno, el módulo no muestra lo que se necesita en la página principal del producto. Después de algunas pruebas, finalmente llegué a la conclusión de que el problema debería estar en el proceso de carga de diseño.
Entonces, ¿hay alguna manera de depurar la carga del diseño, cómo los diferentes módulos reemplazan o agregan sus propios bloques? Mi punto es que creo que hay al menos un módulo que debería estar en conflicto con el mío. Y como tenemos tantos módulos, estoy buscando un enfoque diferente a deshabilitar los módulos uno por uno y ver cuál es el problemático.
Mi archivo config.xml es:
<?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>
Mi archivo de observador:
<?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 es mi archivo de diseño:
<?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 tenía uno ligeramente diferente en lugar de que <default></default>
yo tenía <Product_Campaign_Banner></Product_Campaign_Banner>
. También funcionó.
Mi archivo product.phtml:
<div class="visual">
<?php echo $this->showCampaign(); ?>
</div>
El product.phtml
archivo no se carga y, por lo tanto, showCampaign
no se ejecuta y allí es donde se crea todo el HTML necesario.
Respuestas:
Puede registrar las directivas XML de diseño compiladas que se utilizan para generar bloques. Cree un observador
controller_action_layout_generate_blocks_before
y, en el método de observador, registre el XML de actualización del objeto de diseño transportado:La salida será similar a:
fuente
controller_action_layout_generate_blocks_before
" : esta es una pregunta M1.Puede recuperar todos los controladores de diseño en su controlador haciendo esto:
O en cualquier lugar (siempre que el diseño se haya inicializado) usando esto:
Quizás eso te ayude a depurar.
EDITAR
¿Ha configurado su config.xml para especificar la clase de bloque?
fuente
core/template
? Esto es solo para cancelar errores en la configuración de su módulo.Estoy usando PhpStorm con Magicento, así que pensé en adaptar la excelente respuesta de @benmarks a mi uso.
En PhpStorm, abre
app/code/core/Mage/Core/Controller/Varien/Action.php
y pon un punto de quiebre en el métodogenerateLayoutBlocks()
. Creo que el punto es insertarlo en cualquier lugar antes$this->getLayout()->generateBlocks();
. Lo puse en la línea anterior.Después de insertar el punto de interrupción, indicado por el punto rojo a la izquierda por el número de línea, puede hacer clic con el botón derecho para personalizar el comportamiento. Haga clic en "Más" en la parte inferior para abrir todas las opciones.
Una vez que lo abra, marque la casilla "Registrar mensaje en la consola" (opcional) y "Registrar expresión evaluada" (donde ocurre la magia). Luego copie y pegue esta adaptación del código de benmark en el cuadro de texto. Lo único que he cambiado es deletrear la
$request
variable comoMage::app()->getRequest()
siempre, y cambié la$o
variable a$this
(b / c no estamos en el contexto del observador aquí).Entonces ahora se ve así:
Después de ejecutar el programa (usando el depurador xdebug o zend), se detendrá en el punto de interrupción y verá esto en el registro:
Parece que hay un límite de tamaño para las entradas de registro que puede determinar la
idea.cycle.buffer.size
propiedad en elidea.properties
archivo para PhpStorm, de acuerdo con esto . Puede cambiar eso, o simplemente haga clic derecho en la ventana de código y seleccione "Evaluar expresión" en el menú desplegable, y copie y pegue el código para ejecutarlo allí y obtendrá la salida completa.En la ventana emergente "Evaluar expresión", puede hacer clic con el botón derecho (Windows) en el resultado y seleccionar "Copiar valor" para obtener el resultado completo y pegarlo en otro lugar para su análisis.
fuente
Usamos la extensión Commerce Bug de Alan Storm , y la encontramos indispensable para depurar una variedad de cosas en Magento, incluidos los problemas de diseño. Para los diseños, puede ver qué controladores de diseño están activos en cada página y qué configuraciones xml de diseño se están aplicando a la página.
No es gratis, pero ahorrará mucho tiempo depurando este tipo de cosas.
Nota: no estoy afiliado a Alan Storm o Commerce Bug de ninguna manera, solo soy un cliente satisfecho.
fuente
Gracias Ben Marks! Esta es mi versión del registrador de diseño xml que describiste.
Es un archivo muy largo, así que hice XML con él ... :-) Puede abrir con un editor normal ...
Y mi aspecto config.xml es así en el nodo:
Ahora, espero que mi diseñador pueda explicar todo esto ... \ o /
fuente
Puede agregar esto a la acción de su controlador. Mostrará manejadores de una manera más ordenada que var_dump.
fuente