динамическое добавление xml-файлов обновлений макета


В расширении, над которым я работаю, у меня есть этот раздел в модуле config.xml-

<config>
    <frontend>
        <layout>
            <updates>
                <packagename_modulename module="packagename_modulename">
                    <file>packagename_modulename</file>
                </packagename_modulename>
            </updates>
        </layout>
    </frontend>
</config>

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

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

РЕДАКТИРОВАТЬ

Просто чтобы уточнить, я хочу, чтобы мое расширение работало точно так, как если бы эта конфигурация присутствовала в файле config.xml, но я хочу добавить ее из кода php вместо config.xml.

Для переписывания блоков и моделей я собираюсь как-

<config>
    <global>
        <blocks>
            <payment>
                <rewrite>
                    <form_cc>PackageName_ModuleName_Block_Form_Cc</form_cc>
                </rewrite>
            </payment>
        </blocks>
    </global>
</config>

ОБНОВЛЕНИЕ

Итак, воспользовавшись предложением Фабиана, я добился еще большего прогресса. Я ничего не снимал с config.xml , я использовал Mage::app()->getConfig()->setNode('path_to_config', '') внутри наблюдателя controller_action_layout_load_before, и он правильно настраивает конфигурацию. Это позволило мне отменить все перезаписи моделей и блоков, которые я сделал из конфигурации моего модуля. Затем с маршрутизатора я смог отменить перезапись контроллера, которая была добавлена модулем.

Теперь здесь осталась только одна проблема. Файл макета один раз загруженный кэшируется. Вышеупомянутое решение работает до тех пор, пока кэш макета отключен администратором magento. Итак, есть ли какой-нибудь способ "не кэшировать мое конкретное расширение"? Это только для конкретного случая использования, поэтому было бы нормально, если бы я мог сделать это, отредактировав основной файл

Author: Mridul Aggarwal, 2013-04-30

3 answers

Чтобы добавить файл макета:

Mage::app()->getLayout()->loadFile($file);

Чтобы добавить дескриптор:

Mage::app()->getLayout()->getUpdate()->addHandle('your_handle_name');

Чтобы изменить настройки в конфигурации:

Mage::getConfig()->setNode(
    'global/helpers/core/encryption_model',
    'Ikonoshirt_Pbkdf2_Model_Stub_EE'
);
 10
Author: Fabian Blechschmidt, 2014-02-01 11:15:30

В то время как ваша логика может быть реализована с помощью XML-макета, есть два четких варианта: реализовать адаптивный дизайн (может не работать в зависимости от ваших потребностей) или использовать отдельный поддомен с собственными настройками темы. Условный подход, который вы используете в настоящее время, потребует, чтобы вы добавили свое условие ко многим ключам кэша, и тогда вы окажетесь в той же лодке, что и раньше.

 2
Author: benmarks, 2013-05-09 13:43:37

Решение, которое я, наконец, использовал, состоит в том, чтобы отменить все перезаписи моделей и блоков, которые у меня были в модуле config.xml в наблюдателе controller_action_layout_load_before, и после этого перейти к администратору magento и отключить Block HTML & Layout тайник.

 1
Author: Mridul Aggarwal, 2013-05-09 14:08:04