Как определить, из какого дескриптора макета вызывается метод блока


У меня есть небольшой модуль, который компилирует модули JavaScript. Я хочу добавить функцию, чтобы она компилировала файлы JavaScript, которые добавляются в дескриптор по умолчанию отдельно. Я хочу знать, повысит ли это производительность, потому что модули, общие для каждой страницы, могут быть кэшированы, и только модули, специфичные для каждой страницы, загружаются при каждом запросе.

Лучший способ, который я могу придумать для этого, - использовать тот же интерфейс (в моем блоке есть метод addModule), но чтобы как-то выяснить, был ли он вызван в дескрипторе по умолчанию или нет.

Возможно ли это вообще? Я чувствую, что так и должно быть, но мне трудно понять, где искать, и Интернет не совсем помогает в этом.

Author: Max Bucknell, 2013-12-16

1 answers

Я прошел через это с одним из моих коллег, и он очень помог мне указать правильное направление, и я наконец-то чего-то добился. Magento действительно хранит проанализированную версию своего дерева компоновки, изобилующую дескрипторами. К сожалению, это находится в защищенной переменной.

Я делаю это как одноразовую операцию, которую я буду кэшировать, и это не займет слишком много времени, поэтому я решил, что могу позволить себе снова проанализировать макеты.

Для этого есть удобная публичная функция. Это Mage_Core_Model_Layout_Update::getFileLayoutUpdatesXml($area, $package, $theme, $storeId).

Я назвал его так же, как они называют его в fetchFileLayoutUpdates (который сохраняет свой xml в вышеупомянутой защищенной переменной):

$update = Mage::app()->getLayout()->getUpdate();
$design = Mage::getSingleton('core/design_package');
$layout = $update->getFileLayoutUpdatesXml(
    $design->getArea(),
    $design->getPackageName(),
    $design->getTheme('layout'),
    Mage::app()->getStore()->getId()
);

Это полное дерево xml-макета, которое полезно для многих вещей. Мой модуль определяет блок с именем amdjs_modules, и я хотел знать дескриптор макета, где внутри этого блока вызывался метод. Ну, для этого требуются два разных запроса XPath, если только кто-то, кто изучил XPath раньше, чем вчера, не сможет сказать мне лучше путь.

$modules = $layout->xpath("//block[@name=\"amdjs_modules\"]/action/*|//reference[@name=\"amdjs_modules\"]/action/*");

Это дает массив каждого аргумента, заданного для каждого действия в моем блоке, на который ссылается имя блока или ссылка.

Как только они у вас появятся, сопоставить их с их дескриптором будет легко:

$handleMap = array();
foreach ($els as $el) {
    $handleMap[$el->__toString()] = $el->xpath("ancestor::*[parent::layouts]")[0]->getName();
}

Это работает в предположении, что каждый дескриптор находится непосредственно под корневым узлом.

 1
Author: Max Bucknell, 2013-12-17 11:30:23