Передумови
Я взяв на себе розробку MagentoПідприємницький веб-сайт із власною темою. Коли створювалася спеціальна тема, використовувались базові шаблони за замовчуванням, а не шаблони корпоративних за замовчуванням, і тому тема не має жодної корпоративної функціональності.
Я налаштував ванільну установку Magento Enterpriseякий відповідає номеру версії, що використовується на цьому веб-сайті (1.11.1.0), і я повільно працюю, розрізняючи два сайти та додаючи функціональність назад в один модуль за раз.
Однак я зіткнувся з перешкодами щодо того, як працює функція банера, і тому у мене виникають проблеми при спробі налагодити те, чого не вистачає в користувацькій темі, щоб вони працювали правильно.
Що я знаю
Функціонал чудово працює на моєму веб-сайті vanilla Enterprise.
Для банера немає файлів XML-макетамодуль, що має сенс, оскільки вони створюються динамічно в розділі адміністратора, що дозволяє вибрати сторінку / блок, в який ви хочете вставити віджети банера.
Використовуючи комерційну помилку та дивлячись на скомпільований макет сторінки XML, банери XML-вузли, безумовно, вставляються, тому не створюються програмно (через PHP) в інших шаблонах або блоках.
Я переглянув модуль банерів та спостереження / події, але не бачу нічого, що має якесь відношення до того, як вставляються вузли.
Здається, це пов'язано з модулем Enterprise CMS.
Я знайшов посилання на банери в модулі FPC, але FPC не використовується на цьому веб-сайті, і ці методи не вражаються, коли FPC вимкнено.
Я двічі перевірив, і вихід модуля не вимкнено в Admin Advanced.
Я використовую модуль DesignFallbacks з підприємством / за замовчуванням, і це теж не допомогло.
Я встановив деякі банери точно так само, як на власному сайті, як і на ванільному корпоративному сайті, однак у складеному XML немає вставлених вузлів банерів.
Я шукав у Google та Stack Overflowале інформація про Enterprise Banners дуже обмежена, і те, що я міг знайти, говорить лише про розділ адміністратора, а не про те, як вони функціонують з рівня коду.
Усе це тепер веде до ...
Що я хотів би знати
Як / де банери XML-вузли проникають у макет XML.
Відповіді:
3 для відповіді № 1The Mage_Core_Model_Layout_Update
клас на app/code/core/Mage/Core/Model/Layout/Update.php
містить код, відповідальний за завантаження макета пакета XML. Зазвичай більша частина цього обробляється в fetchFileLayoutUpdates
метод
Однак у цьому класі існує менш відомий метод fetchDbLayoutUpdates
. Цей метод завантажує XML оновлення макета з бази даних і зливає його з макетом пакунка.
public function fetchDbLayoutUpdates($handle)
{
$_profilerKey = "layout/db_update: ".$handle;
Varien_Profiler::start($_profilerKey);
$updateStr = Mage::getResourceModel("core/layout")->fetchUpdatesByHandle($handle);
if (!$updateStr) {
return false;
}
$updateStr = "<update_xml>" . $updateStr . "</update_xml>";
$updateStr = str_replace($this->_subst["from"], $this->_subst["to"], $updateStr);
$updateXml = simplexml_load_string($updateStr, $this->getElementClass());
$this->fetchRecursiveUpdates($updateXml);
$this->addUpdate($updateXml->innerXml());
Varien_Profiler::stop($_profilerKey);
return true;
}
The Mage::getResourceModel("core/layout")
Модель ресурсу відповідає core_layout_update
таблиця. У Magento Enterprise в цій таблиці зберігаються оновлення макета, пов’язані з банерами.
mysql> select * from core_layout_updateG
*************************** 1. row ***************************
layout_update_id: 1
handle: cms_index_index
xml: <reference name="top.container"><block type="enterprise_banner/widget_banner" name="b6d24980179958bad81911d80bce5f36" template="banner/widget/block.phtml"><action method="setData"><name>display_mode</name><value>fixed</value></action><action method="setData"><name>banner_ids</name><value>1</value></action><action method="setData"><name>unique_id</name><value>e2fb0962e605ed01d3759cf531402534</value></action></block></reference>
sort_order: 0
*************************** 2. row ***************************
layout_update_id: 2
handle: cms_index_index
xml: <reference name="footer.before"><block type="enterprise_banner/widget_banner" name="2b2de5c74183936eb4514e860a09e265" template="banner/widget/block.phtml"><action method="setData"><name>display_mode</name><value>fixed</value></action><action method="setData"><name>banner_ids</name><value>2</value></action><action method="setData"><name>unique_id</name><value>1760872fb38c6042c8aee848bf86bf59</value></action></block></reference>
Ця таблиця не спеціально для оновлення банерів - це просто те, що розробники модуля Enterprise_Banner вирішили використовувати функціональність fetchDbLayoutUpdates
реалізувати їх особливості.