43

私はフロントエンドの 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) にブロックが作成されます。このブロックは の 1 レベル下rootに作成されるため、通常は以下を追加してブロックを呼び出します。

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

...to 1column.phtml(または2columns-left/right.phtmlなど3columns.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 before/after not working」についてあちこちでグーグル検索しましたが、これが私だけに起こったのではないかと思い始めました...ブロックを配置するために前/後を使用できる場合と使用できない場合を誰かが説明できますか? 上記の例の何が問題になっていますか?

私はmagento 1.7.0.2にいます(投稿時に入手可能な最新のもの)

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

4

2 に答える 2

87

beforeand属性は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に言っています

ねえマゼント、ブロックのexample_block中に入れて。root

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

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

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

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

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

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

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

そのため、ブロックをに挿入するcontentと、ブロックが自動的にレンダリングされます。

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

于 2013-01-23T18:38:33.330 に答える