1

Magentoの初心者です。レンダリングされる前にコードxmlをレイアウトxmlに動的に挿入するモジュールを構築しようとしています-CMS>ページが構築された方法に似ています。

ページのデザインセクション(admin> cms> page)でレイアウトxmlを指定する方法と同じように、モジュールを介してlayout.xmlに挿入したいと思います。

基本的には

  • フォームからレイアウトコードを入力してデータベースに保存できる管理セクションがあります-この部分を理解しました
  • レイアウトファイルが集約されて解釈される前に、Magentoにデータベースに保存されているこれらのコードをプルしてxmlファイルを作成させます。-この部分を作成できません。

どんな助けでもいただければ幸いです。

4

2 に答える 2

5

ちょっとした啓蒙オブザーバーを使用してこれらのレイアウトxmlを追加できます。たとえば、xmlが生成される前にこれらのレイアウトxmlを追加したいとします。

イベントが利用できますcontroller_action_layout_generate_xml_before

これがサンプルコードです(でconfig.xml

<frontend>
    <events>
        <controller_action_layout_generate_xml_before>
            <observers>
                <add_new_layout>
                    <class>test/observer</class>
                    <method>addNewLayout</method>
                </add_new_layout>
            </observers>
        </controller_action_layout_generate_xml_before>
    </events>
</frontend>

これがObserver.php

public function addNewLayout($observer){
    $layout = $observer->getEvent()->getLayout();
    $update = $layout->getUpdate();

    //$action = $observer->getEvent()->getAction();
    //$fullActionName = $action->getFullActionName();
    //in case you're going to add some conditional (apply these new layout xml on these action or other things, you can modify it by yourself)

    //here is the pieces of layout xml you're going to load (you get it from database)
    $xml = "<reference name='root'><remove name='footer'></remove></reference>";
    $update->addUpdate($xml);

    return;
}
于 2012-08-04T17:23:15.377 に答える
0

もう1つの可能性は、core_layout_update_updates_get_after-eventとプレースホルダー(存在しない)レイアウトxmlを使用することです。

<frontend>
    <layout>
        <updates>
            <foobar>
                <file>foo/bar.xml</file>
            </foobar>
        </updates>
    </layout>
    <events>
        <core_layout_update_updates_get_after>
            <observers>
                <foobar>
                    <type>singleton</type>
                    <class>foobar/observer</class>
                    <method>coreLayoutUpdateUpdatesGetAfter</method>
                </foobar>
            </observers>
        </core_layout_update_updates_get_after>
    </events>
</frontend>

オブザーバーでのPHPの例:

/**
 * Event dispatched when loading the layout
 * @param Varien_Event_Observer $observer
 */
public function coreLayoutUpdateUpdatesGetAfter($observer)
{
    /** @var Mage_Core_Model_Config_Element $updates */
    if (Mage::getStoreConfig('foobar/general/enabled')) {
        $file = Mage::getStoreConfig('foobar/general/layout_xml');
        if (!empty($file)) {
            $updates = $observer->getUpdates();
            if ($updates->foobar) {
                $updates->foobar->file = $file;
            }
        }
    }
}
于 2015-10-20T08:04:36.823 に答える