レイアウトlocal.xmlとモジュールレイアウト


7

私は最近local.xml、レイアウトの遊び場としてを使用し始めました。理由があるので、使用することに疑問を感じる前に...
私はそれが利点であることを理解しましたが、今はレンガの壁にぶつかりました。
デフォルトのcatalog.xmlレイアウトファイルには、特定のブロックがあります(名前は重要ではありません)。を使用して、layout.xml他のブロックを配置したい場所に汎用の子ブロックを追加しました。

<reference name="not.important">
    <block type="core/text_list" name="extra.left.menu" as="extra" />
</reference>

ここまでは順調ですね。
しかし、今、私は上記で宣言されたものに子ブロックを追加する必要がある拡張機能を1つ持っています。
この新しいブロックを使用local.xmlすると、うまく機能します。

<block type="core/text_list" name="extra.left.menu" as="extra">
    <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</block>

ただしlocal.xml、この新しい拡張機能は将来的に無効になる可能性があるため、経由する必要はありません。私は経由でそれを行う場合はlocal.xml、拡張子を無効ブロックはもう存在しないので、それは私のログファイルをフラッディングします。
だから私の拡張レイアウトファイルにこれを追加します:

<reference name="extra.left.menu">
    <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</reference>

しかし、この方法では機能しません。これは、local.xmlファイルが最後にロードされたために発生し、モジュールの依存関係を追加できないため、拡張レイアウトファイルがの後にロードされるためと考えられlayout.xmlます。
これにどのように取り組むべきですか?私は何か間違ったことをしましたか?
または、このようにしたい場合catalog.xmlは、テーマにクローンの「古き良き方法」を使用し、この新しいブロックをテーマに追加する必要がcatalog.xmlありますか?


フロントエンドディスプレイのifconfigを無効にしても、ニーズに対応できないと思います
David Manners

@DavidManners。はいといいえ。モジュールが完全に消え、ifconfigが役に立たない場合。しかし、誰かがモジュールを削除すると、dbもクリーンアップされるため、機能する可能性があります。
マリウス

私はこれをざっと見て、これがうまくいくとは思いません。常に新しいノードをブロックに追加して、ブロックの生成方法を変更することもできますが、それはおかしな話です:)
David Manners

回答:


6

Magentoでレイアウトをレンダリングすると、いくつかのステップが発生します。

  1. ハンドルが定義されています(デフォルト、catalog_product_viewなど)。
  2. すべてのXMLファイルが読み込まれ、1つの巨大なXMLファイルにマージされます。そのファイルはキャッシュのどこかに保存されます。
  3. すべてのハンドルの内容が読み込まれ、1つのpage-xmlファイルにマージされます。
  4. XMLファイルが読み込まれる順序はアルファベット順で、local.xmlが最後に読み込まれます(後で読み込まれるデータベースレイアウトの更新もあります。(ソースhttps://github.com/OpenMage/magento-mirror/blob/magento -1.9 / app / code / core / Mage / Core / Model / Layout / Update.php#L433-L438
  5. 最後に、XMLが解析され、ブロックが開始されます。

なぜあなたの例はうまくいかないのですか?これは、モジュールのXMLファイルがlocal.xmlファイルの前に読み込まれるためです。何が起きるかは、システムが最初に、まだ存在しない参照に(ブロックへの)ブロックを追加しようとすることです。

問題を解決するには:更新を使用できます。更新は、呼び出されるハンドルの前に配置されます。

<default>
    <update handle="awesome_new_container_handle"/>
</default>

<awesome_new_container_handle>
    <reference name="not.important">
        <block type="core/text_list" name="extra.left.menu" as="extra" />
    </reference>
</awesome_new_container_handle>

そして、あなたの他のモジュールファイルにあなたがしたようにブロックを追加してください。

<default>
    <reference name="extra.left.menu">
        <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
    </reference>
</default>

このソリューションが機能することを100%確信していますか?これは機能しないだろうと私は強く感じています。更新はdefaultハンドル経由local.xmlで行わdefaultれ、カスタムレイアウトXMLファイルでレイアウトハンドル自体を参照しているためです。そのファイルで別のレイアウトハンドルを使用している場合は、機能します。私は正しいですか?
Rajeev K Tomy

これは正確には機能しませんでした。しかし、それは私にアイデアを与え、それを機能させました。2つのレイアウトハンドルを使用しました。そのためlocal.xml、1つのハンドルにマークアップを追加local_xml_handleし、別のハンドルに拡張レイアウトファイルのマークアップを追加しましたextension_layout_handle。それから私はそれらをlocal.xml次々に両方で使用しました。したがって、拡張機能のレイアウトハンドルは、最初のハンドルの後に適用され<default><update handle="local_xml_handle" /><update handle="extension_layout_handle" /></default>ます。拡張機能を無効にすると、extension_layout_handle何もロードされないため、何もロードされません。ありがとう。
マリウス

ああ、そしてレイアウトファイルフローのすばらしい説明に感謝します。将来の読者もこれに感謝するでしょう。
マリウス

1

これは、LAYOUT XML FILESを介して行うことはやや不可能です。local.xmlついにファイルがロードされるからです。そのため、local.xmlファイル内で「定義」されたブロックは、他のレイアウトファイルを通じて「参照」できません。

通常、私はそのような状況でブロックを追加するために任意のオブザーバーを使用します。

ただし、別の方法が存在すると思います。ファイルをdefault介してハンドルでそのブロックを定義できlocal.xmlます。これで、Magentoによるレイアウトハンドルlayout handlesを考慮して使用する機会が開かdefaultれます。ブロックはdefaultハンドルを介して含まれるため、独自のレイアウトxmlファイルを介して別のレイアウトハンドルを介してブロックを参照している場合、local.xmlファイルを介して追加された場合でも、Magentoはブロックを認識します。

local.xml

<default>
    <reference name="not.important">
        <block type="core/text_list" name="extra.left.menu" as="extra" />
    </reference>
</default>

your_layout.xml

<custom_handle> <!-- anything except `default` -->
    <reference name="extra.left.menu">
        <block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
    </reference>
</custom_handle>

編集

まず第一に、私はあなたのために過ごすのに十分な時間があります:-)

デモを作成してコードをテストしました。これは私が試したものです。このコードをlocal.xmlファイルに追加しました

<layout>
    <default>
        <reference name="content">
            <block type="core/text_list" name="extra.left.menu" as="extra" />
        </reference>
    </default>
</layout>

次に、以下のコードをcatalog.xmlファイル内に直接追加しました。

<catalog_category_layered translate="label">
        ....

        <reference name="content">
            <reference name="extra.left.menu">
                <block type="core/template" template="test.phtml" as="some_name" name="some_name" />
            </reference>
            ......
        </reference>
</catalog_category_layered>

次に、階層化されたカテゴリをロードすると、test.phtmlそのようなコンテンツが表示されます。(core/templateこのテストの目的で子ブロックとしてブロックを使用しないでください。しかし、あなたの場合、それはあなた自身のブロックで置き換えられます。しかし、それはまったく問題ではありません。どちらの場合も多少同じです)

私はここにいます

つまり、この方法は確実に機能します。私は以前にこのトリックを何度も使用したことがあり、magentoレイアウトの私の究極の達人は@alanstorm :-)であるため、この点について確信しています。


これは機能しませんでした。しかし、時間を割いていただきありがとうございます。
マリウス

試していただきありがとうございます。回答を更新しました。それをお知らせするためだけに、私の方法は間違っていません。
Rajeev K Tomy

あなたがそれがうまくいくと言ったら私はあなたを信じます それは私がそれを正しくしなかったことを意味します。もう一度やってみます。
マリウス

あなたの答えを待っています。自分の時間をかけてテストしてください:-)
Rajeev K Tomy 14年

奇妙なこと。extra.left.menuブロックをブロックに直接追加すると機能しcontentます。しかし、contentまたはの子である他のブロック内に追加した場合はそうではありませんleft。これは+1に値すると思います。とにかく、これにこれ以上時間を費やさないでください。私は2つのレイアウトハンドルを使用するアプローチを好みます。この回答のコメントの1つで説明したように、magento.stackexchange.com / a / 41624 / 146です。どういうわけかそれは私にとってよりきれいな縫い目です。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.