Как определить, из какого дескриптора макета вызывается метод блока
У меня есть небольшой модуль, который компилирует модули JavaScript. Я хочу добавить функцию, чтобы она компилировала файлы JavaScript, которые добавляются в дескриптор по умолчанию отдельно. Я хочу знать, повысит ли это производительность, потому что модули, общие для каждой страницы, могут быть кэшированы, и только модули, специфичные для каждой страницы, загружаются при каждом запросе.
Лучший способ, который я могу придумать для этого, - использовать тот же интерфейс (в моем блоке есть метод addModule), но чтобы как-то выяснить, был ли он вызван в дескрипторе по умолчанию или нет.
Возможно ли это вообще? Я чувствую, что так и должно быть, но мне трудно понять, где искать, и Интернет не совсем помогает в этом.
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();
}
Это работает в предположении, что каждый дескриптор находится непосредственно под корневым узлом.