MagentoのレイアウトXMLを知る〜blockタグ〜
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
blockタグは、Magentoが出力するHTML文書上に表示するパーツの単位を表しています。
blockタグを理解しておかないと、デザインカスタマイズをする際に正しい方法がとれなくなり、後日のアップデートや追加カスタマイズで困ってしまうことがあるので注意が必要です。
blockタグとは
blockタグは
のように記述します。
定義することで画面のレイアウト上にblockが追加され、テンプレート上から呼び出すことができるようになります。
ところがタグ自体よりも、タグに合わせて定義する属性がわかりにくいので、このエントリでは属性について説明していきます。
blockタグで利用できる属性
blockタグで利用できる属性は以下のとおりです。
- name
- as
- type/class
- before/after
- template
- output
name属性
name属性は必須属性で、1つのレイアウト上の同じ階層でユニークになるように定義します。
ここで指定した値は、テンプレート上で、
echo $this->getChildHtml('my.block.name');
のように呼び出す際に使用します。
name属性の値をどう設定するかはカスタマイズをする人に委ねられているので、何をつけてはいけないということはありません。
as属性
as属性はname属性の別名です。
この属性は必須ではありません。ですが、あまりに長いname属性を指定してしまった場合に短縮するための別名として使用することが多々あります。
as属性を定義した場合は、テンプレート上でblockを呼び出す際にas属性で設定した値を使用します。
name属性の値を指定しても表示されません。
type/class属性
type属性とclass属性はどちらかを定義しなければいけません。
この属性は使用できる値が決まっています。
type/class属性についてはこの後別で説明します。
before/after属性
この2つの属性はどちらかしか指定できません。beforeを指定した場合、afterは無視されます。
before属性は、指定した名称のblockの前に、今定義しようとしているblockの定義を挿入します。
after属性はその逆で、指定した名前のblockの後に、blockを挿入します。
もし、挿入する起点になるblock名を指定しない場合、定義しようとしているblockは、配列の先頭または末尾に追加されます。
template属性
template属性は、そのblockで使用するテンプレートファイル名を指定します。
属性として指定しなくても、actionタグを使用して別に定義することができます。
また、一部のblockではtemplateが使用できないものがあります。
output属性
output属性は、引数に与えたメソッドを自動的に実行して、HTMLパーツを出力します。
標準の値は toHtml() メソッドとなっていて、Mage_Core_Block_Abstractクラスの処理をオーバーライドすることでゆうに定義することができます。
なお、Mage_Core_Block_Abstractクラスを継承したblockを使用する場合でtoHtmlを使用しない場合にだけ指定が必要です。
type/class属性について
よくわかりにくいという声を聞くのがこの2つの属性です。
実はこの2つの属性は全く同じ意味・挙動を示します。どちらを指定しても同じなので、どちらかだけを指定すればよいのです。
引数に何を指定すればよいか
初めてMagentoを触る方が混乱するのがこの属性に与える引数です。
実は2通りの方法があるのです。
クラス名をそのまま書く方法
例えば、Mage_Core_Block_Template と書くことができます。
この場合、Magentoは自動的に、プログラムが格納されているディレクトリに対して検索を行い、
Mage/Core/Block/Template.php
があるかどうかを調べます。
ファイルが有れば自動的にそのクラスを読み込んで、blockを生成します。
ファイルが見つからない場合はエラーになります。
クラス名の別名を書く方法
この方法がMagento1.xではスタンダードな記法です。
例えば、
core/template
と書きます。
こうするとMagentoが自動的に、Mage_Core_Block_Template であると解釈し、プログラムファイルを探しに行きます。ファイルがなければエラーになる点は同じです。
異なる点としては、Magentoが持っている、rewrite機能を利用できるという点です。
core/template という記述は、実はサードパーティ製のエクステンションによって、実体のクラスを置き換えられていることがあります。
この場合、エクステンション側の機能を利用しなければならないシーンが多々出てくるのですが、クラス名を直接している場合は、エクステンション側のクラスを読み込めない事になってしまいます。
そのため、現状のMagento1.xにおいてはクラス名の別名を書く方法が一般的に使用されています。
クラス名の別名とはなにか
「core/template」というのはクラス名の別名です。
Magento内部では全てのエクステンション(Magento本体のコードも同列に扱われます)に対して、別名が設定されています。
例えば、Mage_Coreであれば、core。
Mage_Catalogであればcatalogと言った具合に別名が与えられています。
この定義はそれぞれのエクステンションのetcディレクトリにあるconfig.xmlに書かれていて、エクステンションの開発者が重複しないように自由につけることができます。
別名の書き方
別名は以下のルールに従って記述します。
エクステンションの別名 / Block以下のクラス名をアンダースコア(_)で連結
つまり、Mage_Catalog_Block_Product_View であれば、 catalog/product_view となります。
このルールを知っておけば、比較的簡単にどのクラスが使用されているか、またどのように別名を書けばよいかがわかります。