web-dev-qa-db-ja.com

前/後を使用してブロックを配置するMagento XMLはほとんど機能しません

私はフロントエンドのMagento開発者であり、私自身のテーマをかなり構築しました。MagentoのXMLブロックのポジショニングをより良く理解したいです...

私は通常local.xmlファイルを使用してすべてを操作します。ブロックを次のように定義できます。

<cms_index_index>
   <reference name="root">
      <block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/>
   </reference>
</cms_index_index>

これにより、ホームページ(cms_index_index)にブロックが作成され、ブロックはrootの1レベル下に作成されるため、通常は以下を追加してブロックを呼び出します。

<?php echo $this->getChildHtml('exampleBlock') ?>

... 1column.phtml(または2columns-left/right.phtml3columns.phtmlなど)へ。適切なページタグをcms_index_indexに置き換えることにより、ブロックを任意のページに配置できます。

コアXMLファイル全体およびチュートリアルには、次のようなものがあります。

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

contentはmagentoの一般的なページ構造の一部であるブロックであり、私が理解していることから、before="content"getChildHtml('exampleBlock')を使用せずに、あなたが期待する場所に配置すべきです。とても良い...しかし、前/後はほとんど役に立たないようです。私は頻繁にバックアップとしてgetChildHtmlメソッドに頼っています。これは必ずしも理想的ではなく、必要以上の.phtmlファイルを編集することを意味します。

私はもう試した:

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

何も表示されません...

<reference name="root">
   <block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/>
</reference>

まだ何もありません...私は、before="-"またはafter="-"を使用して、親ブロック内のすべての前に何かを配置することも知っています。私は時々それでいくらか運がありますが、一般的には混乱して欲求不満になります。

私は「動作しない前/後のmagento xml」の場所をグーグルで検索し、それが私だけに起こるのだろうかと疑問に思い始めています...ブロックを配置するために前/後を使用できる場合とできない場合は誰でも説明できますか?上記の例の何が問題になっていますか?

私はmagento 1.7.0.2にいます(投稿時の最新版)

これの主な動機は、getChildHtml()を追加するために編集する必要があるコア.phtmlファイルの数を減らすことです。したがって、これを回避する別の(XML)方法がある場合、知りたいと思います...

41
mike-source

beforeおよびafter属性は、次の2つの場合のいずれかでのみ機能します。

  1. core/text_listブロックに挿入するとき
  2. テンプレートブロックがパラメーターなしでgetChildHtmlを呼び出すとき

あなたが言う時

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

あなたはMagentoに言っている

ちょっとMagento、rootブロックの中にexample_blockを入れてください。

親の中にいくつかの異なるブロックを配置すると、それらのブロックには暗黙的な順序があります。テンプレートブロックの場合、これらのブロックは明示的にレンダリングされるため、この順序は重要ではありません。

<?php echo $this->getChildHtml('example_block') ?>

ただし、順序が重要な場合が2つあります。まず、電話をかけると

<?php echo $this->getChildHtml() ?>

テンプレートから、Magentoはall子ブロックを順番にレンダリングします。

第二に、「テキストリスト」と呼ばれる特別なタイプのブロックがあります(core/text_list/Mage_Core_Block_Text_List)。これらのブロックは、すべての子を再び順番に自動的にレンダリングします。 contentブロックはこの例です

<block type="core/text_list" name="content"/>

これが、ブロックをcontentに挿入して、自動的にレンダリングできる理由です。

したがって、上記の例では、rootブロックにブロックを挿入しています。 rootブロックは、phtmlテンプレートが明示的なパラメーターでgetChildHtml呼び出しを使用するテンプレートブロックです。したがって、before属性とafter属性は、あなた(および私を含む他の多くの人)が望んでいたことを行いません。

86
Alan Storm