Налагодження завантаження XML-макета


36

TL; DR: чи є спосіб налагодити завантаження макета? Як я вважаю, макет одного модуля суперечить іншому.

Пов’язане з попереднім запитанням, яке я задав: Як зробити макет модуля, який відображатиметься на всіх темах

Я успішно завантажив свій модуль у локальне тестувальне середовище (він же мій ПК для розробки), перевірив перемикання між трьома різними темами, і це нормально. Тоді я оновив модуль на тестовому або "передвиробничому" середовищі, яке ми маємо, де є багато різних модулів, деякі власні інші, зроблені нами. У цьому середовищі модуль не показує, що потрібно на передній сторінці продукту. Після деяких тестувань я нарешті дійшов висновку, що проблема повинна полягати в процесі завантаження макета.

Отже, чи є спосіб налагодити завантаження макета, як різні модулі замінюють або додають власні блоки? Моя думка, що я вважаю, що існує принаймні один модуль, який повинен суперечити моєму. І оскільки у нас так багато модулів, я шукаю підхід, який відрізняється відключення модулів один за одним, і я бачу, який є проблематичним.

Мій файл 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.


2
Краще за все було б мати місцевий окр якомога так само , як Pre-Production окр
Від

Це я зараз роблю, але це непросто, у нас є понад 20 сторонніх модулів, і навіть деякі з них не працюють на середовищі передвиробництва, і їх розробники перевіряють код.
Ярослав

4
Мені дуже цікаво знати причини, по яких це питання позначено як закриття, як занадто локалізоване. Питання говорить про загальну налагодження верстки, яка, якщо ви цього не зробили, є досить корисною та широко застосовною.
орієнтири

Мені теж цікаво. Але я думаю, що це може призвести до того, що після кількох редагувань для інших, здається, я просто намагаюся вирішити власну дуже локалізовану проблему. І справді я є, але в той же час я все ще сподіваюся, що за допомогою налагодження процесу генерації макета я зможу знайти, де знаходиться моя помилка. Тому рішення буде корисним для інших.
Ярослав

Відповіді:


55

Ви можете записати складені XML-директиви макета, які використовуються для генерування блоків. Створіть спостерігача controller_action_layout_generate_blocks_before, і в методі спостерігача введіть оновлення XML від транспортованого об'єкта макета:

public function logCompiledLayout($o)
{
    $req  = Mage::app()->getRequest();
    $info = sprintf(
        "\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",
        $req->getRouteName(),
        $req->getRequestedRouteName(),      //full action name 1/3
        $req->getRequestedControllerName(), //full action name 2/3
        $req->getRequestedActionName(),     //full action name 3/3
        implode("\n\t",$o->getLayout()->getUpdate()->getHandles()),
        $o->getLayout()->getUpdate()->asString()
    );

    // Force logging to var/log/layout.log
    Mage::log($info, Zend_Log::INFO, 'layout.log', true);
}

Вихід буде подібний до:

2013-01-23T16:24:26+00:00 INFO (6): 
Request: cms
Full Action Name: cms_index_index
Handles:
    default
    cms_page
    STORE_default
    THEME_frontend_default_default
    cms_index_index
    page_two_columns_right
    customer_logged_out
Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<!-- ... ->

Здається корисним, спробуй це завтра о першій годині
Ярослав

Ваша відповідь була правильною, саме те, що я шукав. Створений журнал видає всі ручки, запити тощо при завантаженні сторінки. Я підтвердив, що моя ручка правильно завантажена в основний масив ручок, але чомусь відповідний блок не завантажується / не відображається.
Ярослав

1
І це має бути легше усунути неполадки тепер, коли макет виключений :-).
орієнтири

Я припускаю, що ви ставите це всередині файлу Action.php? Крім того, як це називається магенто?
Метрополіс

"Створити спостерігача controller_action_layout_generate_blocks_before" - це питання М1.
орієнтири

23

Ви можете отримати всі ручки компонування у контролері, виконавши це:

var_dump($this->getLayout()->getUpdate()->getHandles());

Або в будь-якому місці (поки макет був ініціалізований), використовуючи це:

var_dump(Mage::app()->getLayout()->getUpdate()->getHandles());

Можливо, це допоможе вам налагодити.

EDIT

Ви встановили config.xml для визначення класу блоків?

    <blocks>
        <banners>
            <class>My_Banners_Block</class>
        </banners>
    </blocks>

Як тестовано, моя ручка правильно додана методом спостерігача, але тоді макет не завантажується. Я оновлю своє запитання якимсь кодом, можливо, це допоможе.
Ярослав

@Yaroslav оновив мою відповідь
Рік Куйперс

Так, у мене це в налаштуваннях оновить моє запитання.
Ярослав

@Yaroslav Чи можете ви перевірити, чи завантажується product.phtml при зміні типу блоку core/template? Це лише для того, щоб скасувати помилки в налаштуваннях вашого модуля.
Рік Куйперс

1
@ Ярославу, здається, проблема трохи надто широко розповсюджена і важко налагодити тут на stackexchange. Мені не дуже зрозуміло, що може викликати проблему.
Рік Куйперс

12

Я використовую PhpStorm з Magicento, і тому я подумав, що пристосую @benmarks чудову відповідь до мого використання.

У PhpStorm відкрийте app/code/core/Mage/Core/Controller/Varien/Action.phpі поставте крапку в методі generateLayoutBlocks(). Думаю, сенс вставити його де завгодно $this->getLayout()->generateBlocks();. Я поставив це на попередньому рядку.

Після того, як ви вставите точку розриву, позначену червоною крапкою зліва номером рядка, ви можете клацнути правою кнопкою миші, щоб налаштувати поведінку. Натисніть "Більше" внизу, щоб відкрити всі параметри. введіть тут опис зображення

Після цього відкрийте прапорець "Журнал повідомлення до консолі" (необов'язково) та "Журнал оцінюваного вираження" (там, де відбувається магія). Потім скопіюйте вставте цю адаптацію коду орієнтиру в текстове поле. Єдине, що я змінив - це написання $requestзмінної, як і Mage::app()->getRequest()кожного разу, і зміна $oзмінної на $this(б / с ми тут не в контексті спостерігачів).

sprintf("\nRequest: %s\nFull Action Name: %s_%s_%s\nHandles:\n\t%s\nUpdate XML:\n%s",Mage::app()->getRequest()->getRouteName(),Mage::app()->getRequest()->getRequestedRouteName(),Mage::app()->getRequest()->getRequestedControllerName(),Mage::app()->getRequest()->getRequestedActionName(),implode("\n\t",$this->getLayout()->getUpdate()->getHandles()),$this->getLayout()->getUpdate()->asString())

Отже, тепер це виглядає так: Зображення показує розширені настройки точки розриву

Після запуску програми (використовуючи xdebug або zend debugger) ви зупинитесь на точці розриву і побачите це в журналі:

Update XML:
<block name="formkey" type="core/template" template="core/formkey.phtml"/>
<label>All Pages</label>
<block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">
   <block type="page/html_head" name="head" as="head">
      <action method="addJs">
         <script>jquery/jquery-migrate-1.2.1.min.js</script>
      </action>
      <action method="addJs">
         <script>jquery/jquery-ui/jquery-ui.min.js</script>
      </action>
      <action method="addJs">
         <script>prototype/prototype.js</script>
      </action>
      <action method="addJs" ifconfig="dev/js/deprecation">
         <script>prototype/deprecation.js</script>
      </action>
      <action method="addJs">
         <script>lib/ccard.js</scrip

Здається, існує обмеження розміру для записів журналу, яке може бути визначене idea.cycle.buffer.sizeвластивістю у idea.propertiesфайлі для PhpStorm відповідно до цього . Ви можете змінити це, або просто клацніть правою кнопкою миші на вікні коду та виберіть у спадному меню пункт «Оцінити вираз» та скопіюйте та вставте код для виконання у ньому, і ви отримаєте повний вихід.

У спливаючому вікні "Оцінити вираз" ви можете натиснути правою кнопкою миші (Windows) на результат і вибрати "Скопіювати значення", щоб отримати весь вихід і вставити його десь для аналізу.

PhpStorm - копія з спливаючого вікна Evaluate Expression


5

Ми використовуємо розширення Alan Storm Commerce Bug і вважаємо його незамінним для налагодження різноманітних речей у Magento, включаючи проблеми з компонуванням. Для макетів ви можете бачити, які ручки макета активні на кожній сторінці, а які конфігурації макета xml застосовуються до сторінки.

Це не безкоштовно, але заощадить багато часу на налагодження подібних речей.

Примітка: Я жодним чином не пов'язаний з Alan Storm або Commerce Bug, просто щасливий клієнт.


9
Я є партнером з Аланом Штормом (в тому, що я його), і я просто хотів зазначити, що Commerce Bug 2 також дає вам можливість створювати спрямовану графічну діаграму своїх макетів. alanstorm.com/find_magento_block_name
Alan Storm

Ми також щасливі клієнти комерційної помилки Alan Storm. Але в системі, де у мене виникають ці проблеми, вона не встановлена, і у нас немає достатньої кількості ліцензій для всіх тестових і передвиробничих систем. І до речі, @AlanStorm, так, можемо отримати оновлення для Commerce Bug 2?
Ярослав

1
@Yaroslav Зв’яжіться зі службою підтримки, і ми допоможемо вам розібратися з оновленнями та оновленнями pulsestorm.net/contact-us
Alan Storm

3

Дякую Бен Маркс! Це моя версія реєстратора файлів xml, який ви описали.

Це дуже довгий файл, тому я зробив з нього XML ... :-) Ви можете відкрити звичайний редактор ....

    <?php

class Gn_Optimization_Model_Debug_Layout {
  public function logCompiledLayout($o) {
    $req = Mage::app()->getRequest();

    $routeName = $req->getRouteName();
    $fullname = $req->getRequestedRouteName() . '_' . $req->getRequestedControllerName() . '_' . $req->getRequestedActionName();

    $info = sprintf(
      "\nRequest: %s\nFull Action Name: %s\nHandles:\n\t%s\n",
      $routeName, $fullname, implode("\n\t", $o->getLayout()->getUpdate()->getHandles())
    );

    Mage::log($info, Zend_Log::DEBUG, 'debug.'.$routeName.'.layout.log', true);
    file_put_contents(Mage::getBaseDir('log').DS.'debug.'.$routeName.'.layout.xml',
                      '<?xml version="1.0" encoding="utf-8"?>'.PHP_EOL
                      .'<layout>'.PHP_EOL.
                      $o->getLayout()->getUpdate()->asString().
                      '</layout>');
  }
}

І мій config.xml виглядає так у вузлі:

<events>
  <controller_action_layout_generate_blocks_before>
    <observers>
      <gn_optimization_controller_action_layout_generate_blocks_before>
        <type>singleton</type>
        <class>gn_optimization/debug_layout</class>
        <method>logCompiledLayout</method>
      </gn_optimization_controller_action_layout_generate_blocks_before>
    </observers>
  </controller_action_layout_generate_blocks_before>
</events>

Тепер я сподіваюся, що мій дизайнер може все це пояснити ... \ o /


0

Ви можете додати це до дії контролера. Він покаже ручки більш акуратним способом, ніж var_dump.

Zend_Debug::dump($this->getLayout()->getUpdate()->getHandles());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.