このセクションでは、ビュー内のレイアウトとブロックに焦点を当てます。
他の主流の PHPMVC アーキテクチャとは異なり、magento の ActionController はデータ オブジェクトをビューに渡したり、View オブジェクトにプロパティを設定したりしません。 View は、システム モジュールを通じて必要な情報を取得します。
この設計の結果、ビューはブロックとテンプレートに分割されます。ブロックは PHP オブジェクトであり、テンプレートは PHP コードと HTML を組み合わせたものです (PHP をテンプレート言語として使用すると考えることもできます)。各ブロックはテンプレート ファイルにバインドされます。 Phtml ファイルでは、PHP キーワード $this に、テンプレートに対応するブロックへの参照が含まれます。
これが簡単な例です。テンプレート ファイル app/design/frontend/base/default/template/catalog/product/list.phtml を表示します
次のコードが表示されます
getLoadedProductCollection() ?>
count()): ?>
__("選択内容に一致する商品がありません。")?>
getLoadedProudctController は、対応するブロック ファイル内にあります
app/code/core/Mage/Catalog/Block/Product/List.php
パブリック関数getLoadedProductCollection()
{
return$this->_getProductCollection();
}
_getProductCollection はモデルをインスタンス化し、データを対応するテンプレートに取得します。
埋め込みブロック
ブロック/テンプレートの真の力は getChildHtml メソッドです。これにより、メインのブロック/テンプレート (xml 形式) にセカンダリ ブロック/テンプレートを含めることができます
ブロックを呼び出すブロックは、HTML レイアウト全体を形成します。例を見てみましょう
App/design/frotend/base/default/template/page/1column.phtml
getLang() ?>" lang="getLang( )?>"> getChildHtml('head') ?> getChildHtml('content') ?> getChildHtml('before_body_end') ?>
getAbsoluteFooter() ?>
ファイルは長くありませんが、各呼び出しは $this->getChildHtml(…) であり、他のブロックを含めてレンダリングします。これらのブロックは他のブロックを呼び出すこともできます。
レイアウト
ブロックとテンプレートは良いですが、次のような疑問があるかもしれません
1. ページでどのブロックが使用されているかを Magento に伝えるにはどうすればよいですか?
2. Magento にそれが初期であることをどのように伝えるか
3. 各ブロックに次のブロックを呼び出すように指示するにはどうすればよいですか
このとき、Layoutオブジェクトが必要です。 Layout オブジェクトは XML 形式であり、ページにどのブロックが含まれるか、またどのブロックがページのレンダリングを担当するかを定義します。
以前の Hello World プロジェクトはアクション メソッドで直接実行しました。今回は、モジュールを提供するための単純な HTMLtemplate を作成します。
まずファイルを作成します
アプリ/デザイン/フロントエンド/ベース/デフォルト/レイアウト/local.xml
続いて以下の内容を書きます
<レイアウトバージョン="0.1.0">
<参照名="ルート">
参考>
デフォルト>
レイアウト>
次に別のファイルを作成します
app/design/frontend/base/default/template/simple_page.phtml (構成内のテンプレートと一致していることに注意してください)
以下を書きます
無題
ボディ {背景色:#f00}
ボディ>