XML-Дескриптор обновления макета - Обновление
Я пытаюсь изменить дескриптор макета для определенных страниц CMS в серверной части.
Для этого я пытаюсь использовать следующее в Дизайне ->Макет страницы ->XML обновления макета
<update handle="store_page" />
Моя цель - написать конкретный макет в local.xml, вставляя другие блоки только для тех страниц CMS, которые помечены как страница магазина.
Однако, когда я вставляю этот код, он не обновляет дескриптор страницы CMS - может ли кто-нибудь предложить какую-либо помощь в том, где я могу быть что-то идет не так или возможно ли это? Есть ли лучший способ достичь этого?
2 answers
Ты не можешь этого сделать. В частности, вы не можете использовать тег <update/>
в XML-поле обновления макета страницы CMS.
Magento обрабатывает узлы <update/>
при первоначальной загрузке файлов обновления макета и обновлений макета из таблицы core_layout_update
. Это делается с помощью функции fetchRecursiveUpdates
.
#File: app/code/core/Mage/Core/Model/Layout/Update.php
public function fetchPackageLayoutUpdates($handle)
{
//...
$this->fetchRecursiveUpdates($updateXml);
//...
return true;
}
public function fetchDbLayoutUpdates($handle)
{
//...
$this->fetchRecursiveUpdates($updateXml);
//...
}
//...
public function fetchRecursiveUpdates($updateXml)
{
foreach ($updateXml->children() as $child) {
if (strtolower($child->getName())=='update' && isset($child['handle'])) {
$this->merge((string)$child['handle']);
// Adding merged layout handle to the list of applied hanles
$this->addHandle((string)$child['handle']);
}
}
return $this;
}
Страница CMS, однако, отображается позже с помощью вспомогательного метода. Рендеринг страницы CMS включает в себя этот код
#File: app/code/core/Mage/Cms/Helper/Page.php
$action->loadLayoutUpdates();
$layoutUpdate = ($page->getCustomLayoutUpdateXml() && $inRange)
? $page->getCustomLayoutUpdateXml() : $page->getLayoutUpdateXml();
$action->getLayout()->getUpdate()->addUpdate($layoutUpdate);
$action->generateLayoutXml()->generateLayoutBlocks();
Вызов loadLayoutUpdates
является стандартной загрузкой макет, включая fetchRecursiveUpdates
, упомянутый выше.
Затем Magento ищет обновление XML пользовательского макета, установленное на объекте страницы CMS
$layoutUpdate = ($page->getCustomLayoutUpdateXml() && $inRange)
? $page->getCustomLayoutUpdateXml() : $page->getLayoutUpdateXml();
И добавляет его непосредственно в список обновлений для применения
$action->getLayout()->getUpdate()->addUpdate($layoutUpdate);
Это означает, что сканирование тега update
никогда не выполняется.
Если бы я пытался реализовать что-то подобное, я бы добавил новый блок в XML-файле обновления макета страницы CMS, а затем программно добавил общие элементы макета в блоки _prepareLayout
метод. (не уверен, что у меня в голове, сработает ли это без учета времени, но именно с этого я бы начал)
Директива <update />
добавляет дескриптор (и его директивы) в текущую область визуализации; он не заменяет текущий дескриптор.