XML-Дескриптор обновления макета - Обновление


Я пытаюсь изменить дескриптор макета для определенных страниц CMS в серверной части.

Для этого я пытаюсь использовать следующее в Дизайне ->Макет страницы ->XML обновления макета

<update handle="store_page" />

Моя цель - написать конкретный макет в local.xml, вставляя другие блоки только для тех страниц CMS, которые помечены как страница магазина.

Однако, когда я вставляю этот код, он не обновляет дескриптор страницы CMS - может ли кто-нибудь предложить какую-либо помощь в том, где я могу быть что-то идет не так или возможно ли это? Есть ли лучший способ достичь этого?

Author: 7ochem, 2013-05-24

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 метод. (не уверен, что у меня в голове, сработает ли это без учета времени, но именно с этого я бы начал)

 6
Author: Alan Storm, 2013-05-24 18:00:51

Директива <update /> добавляет дескриптор (и его директивы) в текущую область визуализации; он не заменяет текущий дескриптор.

 2
Author: benmarks, 2013-05-24 12:13:34