TL; DR: есть ли способ отладить загрузку макета? Как я полагаю, макет одного модуля конфликтует с другим.
Связанный с предыдущим вопросом, который я задал: Как сделать макет модуля, который будет отображаться на всех темах
Я успешно загрузил свой модуль в моей локальной тестовой среде (он же мой компьютер для разработки), проверил переключение между 3 различными темами, и это нормально. Затем я обновил модуль в имеющейся у нас тестовой среде или среде «предварительного производства», где есть много различных модулей, некоторые проприетарные, сделанные нами. В этой среде модуль не показывает, что нужно на главной странице продукта. После некоторых испытаний я наконец пришел к выводу, что проблема должна заключаться в процессе загрузки макета.
Итак, есть ли способ отладки загрузки макета, как разные модули заменяют или добавляют свои собственные блоки? Я хочу сказать, что есть хотя бы один модуль, который должен конфликтовать с моим. И поскольку у нас так много модулей, я ищу подход, отличный от отключения модулей один за другим, и посмотрим, какой из них проблемный.
Мой файл 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>
Файл моего наблюдателя:
<?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;
....
....
}
Это мой файл макета:
<?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>
Раньше был немного другой, где вместо <default></default>
меня <Product_Campaign_Banner></Product_Campaign_Banner>
. Это тоже сработало.
Мой файл product.phtml:
<div class="visual">
<?php echo $this->showCampaign(); ?>
</div>
product.phtml
Файл не загружен и , следовательно, showCampaign
не выполняются , и там, где создаются все необходимый HTML.
Ответы:
Вы можете записать XML-директивы скомпилированного макета, которые используются для генерации блоков. Создайте наблюдателя
controller_action_layout_generate_blocks_before
и в методе наблюдателя зарегистрируйте XML-файл обновления из транспортируемого объекта макета:Вывод будет похож на:
источник
controller_action_layout_generate_blocks_before
» - это вопрос М1.Вы можете получить все маркеры макета в вашем контроллере, выполнив это:
Или в любом месте (если макет был инициализирован), используя это:
Возможно, это поможет вам отладить.
РЕДАКТИРОВАТЬ
Вы установили свой config.xml, чтобы указать класс блока?
источник
core/template
? Это просто для устранения ошибок в настройках вашего модуля.Я использую PhpStorm с Magicento, и поэтому я подумал, что смогу приспособить @benmarks отличный ответ для своего использования.
В PhpStorm откройте
app/code/core/Mage/Core/Controller/Varien/Action.php
и установите точку останова в методеgenerateLayoutBlocks()
. Я думаю, что смысл в том, чтобы вставить его в любом месте, прежде чем$this->getLayout()->generateBlocks();
. Я поставил это на предыдущую строку.После того, как вы вставите точку останова, обозначенную красной точкой слева номером строки, вы можете щелкнуть ее правой кнопкой мыши, чтобы настроить поведение. Нажмите «Еще» внизу, чтобы открыть все варианты.
Как только вы откроете это, вы устанавливаете флажок «Записать сообщение на консоль» (необязательно) и «Записать вычисленное выражение» (где происходит волшебство). Затем скопируйте и вставьте эту адаптацию кода в текстовое поле. Единственное, что я изменил, - это прописал
$request
переменную как всегдаMage::app()->getRequest()
и изменил$o
переменную на$this
(b / c, мы здесь не в контексте наблюдателя).Итак, теперь это выглядит так:
После запуска программы (с использованием xdebug или zend debugger) вы остановитесь на точке останова и увидите это в журнале:
Похоже, что существует ограничение на размер записей журнала, которое может определяться
idea.cycle.buffer.size
свойством вidea.properties
файле для PhpStorm, в соответствии с этим . Вы можете изменить это или просто щелкнуть правой кнопкой мыши в окне кода и выбрать «Выразить выражение» из выпадающего меню, скопировать и вставить код для выполнения там, и вы получите полный вывод.Во всплывающем окне «Оценка выражения» можно щелкнуть правой кнопкой мыши (Windows) на результате и выбрать «Копировать значение», чтобы получить весь вывод и вставить его в другое место для анализа.
источник
Мы используем расширение Commerce Bug от Alan Storm и считаем его незаменимым для отладки различных вещей в Magento, включая проблемы с макетом. Для макетов вы можете видеть, какие маркеры макета активны на каждой странице, и какие конфигурации макета XML применяются к странице.
Это не бесплатно, но сэкономит много времени на отладку подобных вещей.
Примечание: я никоим образом не связан с Alan Storm или Commerce Bug, я просто счастливый клиент.
источник
Спасибо Бен Маркс! Это моя версия регистратора разметки xml, которую вы написали.
Это очень длинный файл, поэтому я сделал из него XML ... :-) Вы можете открыть с помощью обычного редактора ....
И мой config.xml выглядит так в узле:
Теперь я надеюсь, что мой дизайнер сможет объяснить все это ... \ o /
источник
Вы можете добавить это к вашему действию контроллера. Он покажет дескрипторы более аккуратно, чем var_dump.
источник