Magento 開発ノート 3_PHP チュートリアル

WBOY
リリース: 2016-07-14 10:07:14
オリジナル
775 人が閲覧しました

このセクションでは、ビュー内のレイアウトとブロックに焦点を当てます。

他の主流の 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}
最後に、Aciton コントローラーはレイアウト プロセスの開始を担当します。次の 2 行のコードを追加します
パブリック関数indexAction() {
//前のエコーを削除
//エコー「こんにちはインデックス!」
;
$this->loadLayout();
$this->renderLayout();
}
キャッシュをクリアして Hello World コントローラー ページをリロードすると、ページの背景が赤になり、HTML ソース コードが simple_page.phtml に対応していることがわかります。
何が起こったのですか?
すべてが神秘的に思えました。このプロセスを詳しく見てみましょう。まず、Layoutviewer モジュールをインストールします。このモジュールは Configviewer に非常に似ています。
インストールしたら、以下のURLを使用できるようになります
http://localhost/magento/helloworld/index/index?showLayout=page
これはリクエストされたページに対応するレイアウト XML です。これは タグと タグで構成されます。 loadLaout メソッドを呼び出すと、
1. レイアウト XML を生成します
2. および の下の Block クラスをインスタンス化します。タグ名属性を検索し、グローバル構成ファイル内で対応する属性を見つけて、それを Layout オブジェクトの external_blocks 配列に保存します。
3. タグに出力属性が含まれている場合、その値は Layout オブジェクトの external_blocks 配列にも追加されます。
このようにして、アクション コントローラーで renderLayout を呼び出すと、Mageno は _blocks 配列内のすべてのブロックを反復し、対応する出力属性をコールバック関数として使用します。これは HTML への変換に相当します。つまり、ブロックのテンプレートが出力の開始点になります。
次の部分には、ブロックのインスタンス化方法、レイアウト ファイルの生成方法、および出力の終了が含まれます。
インスタンス化をブロック
LayoutXml には、URI に相当する または の型があります。
URI はグローバル設定ファイル内のアドレスを指定します。 URI の最初の部分は、グローバル構成ファイルを検索し、Page クラス名を検索するために使用されます。 2 番目の部分は最初の部分に続き、新しいクラスとなり、インスタンス化されます。
page/htmlを例として取り上げます。まず、Magento はグローバル設定ファイル内で次の
を探します。
/グローバル/ブロック/ページ
それから
を見つけてください
<ページ>
<クラス>
Mage_Page_Block
このようにして、MagePageBlock クラスを取得します。次に、URI の 2 番目の部分が追加されて、MagePageBlock_Html になります。このクラスはインスタンス化されます。
ブロックは Magento のグループ クラスでもあり、すべて同様のインスタンス化メソッドを共有します。この部分については後ほど詳しく紹介します。
の違い
の両方が Block をインスタンス化できることについて説明しましたが、それらの違いは何ですか。
先着順
それでは
<レイアウトバージョン="0.1.0">
;
<参照名="ルート">
内部のブロックはブロックを置き換えません。代わりに、既存のブロックに追加または変更します。上の例では、ルートと呼ばれる新しいブロックが既存のルートブロックに挿入されます。これはMagento Layoutでは未定義です。最終的には古いものが置き換えられますが、一貫性を確保するためにこれに依存するのは悪い考えです。
レイアウトファイルの生成方法
これで、レイアウト XML についてより明確に理解できるようになりました。しかし、レイアウト XML はどこから来たのでしょうか?この質問に答えるには、ハンドルとパッケージ レイアウトという 2 つの新しい概念を導入する必要があります。
ハンドル
Magento の各リクエストは、いくつかの異なるハンドルを生成します。 Layoutview モジュールは、URL を使用してこれらを表示できます
http://localhost/magento/helloworld/index/index?showLayout=handles
次のようなものが表示されます
1.デフォルト
2.STORE_bare_us
3. テーマ_フロントエンド_デフォルト_デフォルト
4. Helloworld_index_index
5. 顧客のログアウト
これらのそれぞれはハンドルです。 Magento ではハンドルがさまざまな場所に設定されます。そのうちの 2 つ、default と helloworld_index_index に注意する必要があります。デフォルトのハンドルはリクエストごとに表示されます。 Helloworld_index_indexHandle は、frontName (helloworld)、Actioncontroller (インデックス)、およびアクション コントローラーのアクション メソッド (インデックス) を結合することによって形成されます。これは、各 ActionController メソッドがハンドルに対応する可能性があることを意味します。
「index」はすべてのアクション コントローラーとアクションメソッドに対する Magento のデフォルトであることに注意してください。したがって、以下のリクエストになります
http://localhost/magento/helloworld/?showLayout=handles
ハンドルの名前も生成されます helloworld_index_index
パッケージレイアウト
PackageLayout はグローバル構成と同等であると考えることができます。これは、Magento で可能なすべてのレイアウト構成を含む大きな XML ファイルです。見てみましょう
http://localhost/magento/helloworld/index/index?showLayout=package
読み込みに時間がかかる場合があります。ブラウザが XML の下でスタックしている場合は、テキスト モードに切り替えてください
http://localhost/magento/helloworld/index/index?showLayout=package&showLayoutFormat=text
大きなXMLファイルを表示できます。これがパッケージレイアウトです。これは、現在のテーマのすべての XMLLayout ファイルを組み合わせたものです。デフォルトのインストールは
アプリ/デザイン/フロントエンド/ベース/デフォルト/レイアウト/
グローバル ファイルには セクションがあり、ノードにはロードされるすべての名前が含まれています。設定ファイルで指定されたファイルがマージされると、Magento は前の XML ファイル local.xml にマージされます。これにより、必要な機能を追加できます。
Hanldes とパッケージレイアウトをマージ
パッケージ レイアウトを見ると、 などのいくつかのおなじみのタグが表示されますが、これらはすべて次のようなタグでカバーされています
<デフォルト />
など…
これらはハンドルタグです。リクエストのレイアウトは、リクエストに一致するすべてのハンドルのパッケージ レイアウトから生成されます。したがって、上記の例では、レイアウトは以下のセクションで生成されます
<デフォルト />
<顧客ログアウト/>
注意が必要なラベルがもう 1 つあります。 他のハンドルを含めることができます。たとえば
<顧客アカウントインデックス>
<ハンドル="顧客アカウント"/>を更新します
これは、customeraccountindex をリクエストするときに、 の下に を含める必要があることを意味します。
学んだことを応用する
理論はこれくらいにして、以前の作業を復習しましょう。
<レイアウトバージョン="0.1.0">
これはルートタグを書き換えたことを意味します。 部分は、すべてのリクエストでそれが行われることを保証します。これは私たちが望んでいる効果ではないかもしれません。
他のページにアクセスすると、空白のページまたは赤い背景が表示されます (前の helloworld ページと同様)。そこで、local.xml を改善して、helloworld ページにのみ使用されるようにしましょう。以下のように修正しました
<レイアウトバージョン="0.1.0">
キャッシュをクリアすると、この時点で他のページが復元されるはずです。
その後、googbye Aciton Method に適用します
パブリック関数 GoodbyeAction() { $this->loadLayout() }
この時点で http://localhost/magento/helloworld/index/goodbye をロードします
まだ空白のページであることがわかります。このとき、local.xmlにactionnameを追加する必要があります。内容は次のとおりです
<レイアウトバージョン="0.1.0">
このとき、次の2つのページも同様の効果になります。
http://localhost/magento/helloworld/index/index
http://localhost/magento/helloworld/index/goodbye
出力とgetChildHtmlを開始します
標準構成では、出力は root という名前のブロックから始まります (これが出力の特徴です)。ルートテンプレート template="simple_page.phtml" を書き換えました
テンプレートは、現在のテーマまたはベーステーマのメインディレクトリから取得されます。
アプリ/デザイン/フロントエンド/ベース/デフォルト/テンプレート
通常は、独自のテーマまたはデフォルトのテーマにテンプレートを追加できます
アプリ/デザイン/フロントエンド/デフォルト/デフォルト/テンプレート
アプリ/デザイン/フロントエンド/デフォルト/カスタム/テンプレート
ベース ディレクトリは検索される最後のディレクトリです。magento が他のテーマで見つからない場合は、ベース ディレクトリに戻ります。ただし、前述したように、Magento の更新によってディレクトリが上書きされるため、そのようなディレクトリには追加しないでください。
コンテンツブロックを追加
赤い悲劇は退屈です。それでは、ページにコンテンツを追加してみましょう。 local.xml の を次のように変更します
<参照名="ルート">
ルートに2つの埋め込みブロックを追加しました。 Magentoが配布し、顧客登録用のページを表示します。このブロックをルートに埋め込むには、simple_page.html で明示的に呼び出す必要があります。そこで、次のように Block の getChildHtml メソッドを使用します
キャッシュをクリアしてページをリロードします。この時点では、登録ページが赤い背景で表示されます。以下には、top.links というブロックもあります。以下を追加します
ページをリロードすると、リンクがレンダリングされていることがわかりますが、top.links にはレンダリングがありません。これは、local.xml に追加していないためです。レイアウトでは、getChildHtml には表示されているブロックのみを子ブロックとして含めることができます。これにより、Magento が必要なブロックをインスタンス化できるようになり、表示されたコンテンツに基づいてブロックに異なるテンプレートを設定できるようになります
local.xmlのtop.linksにブロックを追加できます
<参照名="ルート">
この時点でキャッシュをクリアすると、top.links モジュールの効果が確認できます

www.bkjia.com本当http://www.bkjia.com/PHPjc/477872.html技術記事このセクションでは、ビュー内のレイアウトとブロックに焦点を当てます。 他の主流の PHPMVC アーキテクチャとは異なり、magento の ActionController はデータ オブジェクトをビューに渡したり、View オブジェクトを設定したりしません...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート