ストーリー #104: ページの任煮の場所に挿入したり、任意の場所を置き換えたりできるようにするモジュール「page_replacer」
ちょっと考えてみた¶
- たとえばこういうことはよくある
- create_account画面の「姓」、「名」の入力欄の次に、姓(カタカナ)、名(カタカナ)という項目を追加したい、みたいな
- ページのメイン部分ど真ん中にmoduleをaddonしたい、ということ
- addon_modulesの仕組みのみでは、テンプレートを書き換えなければこの「セイ(カタカナ)」と「メイ(カタカナ)」を埋め込むことはできない
- この埋め込みを実現する「page_replacer」というaddon_modulesモジュールについて考えた
- まずこのカナを追加するモジュール「furigana」について考える
- 「furigana」は「page_replacer」に依存するaddon_modulesモジュールとして作る
- page_replacerは、次の2つのblockを提供する
- block_ob_start: これを全ページのmain_topに埋め込む
- block_ob_end : これを全ページのmain_bottomに埋め込む
- page_replacerは、次のメソッドを提供する
- 「furigana」は管理画面の設定画面で設定項目として次を提供する
- 「furigana」はmodule.php内のコンストラクタで次のように実行
- 「furigana」はmodule.php内の_update_page_replacerメソッドで次のように記述
- blockと同様に、テンプレートを用意してそれを使って出力できればなおよし
- create_account画面を表示
- main_bottomの描画時期が訪れる
- page_replacerの「main_top」に埋め込んでおいた「block_ob_start」が呼び出され、ob_start()が実行される
- メイン部分が普通に描画されるがこれはob_start()により標準出力には出力されない。
- page_replacerの「main_bottom」に埋め込んでおいた「block_ob_end」が呼び出される。
- block_ob_endでは
- ob_get_contetsでメイン部分のHTMLを取得
- その対象ページにattachされていたオブサーバーそれぞれに対して
- 指定しされていたHTMLがマッチするかチェック
- マッチした場合、そのオブサーバークラスの_update_for_page_replacer()メソッドを呼び出す
- そのメソッドの戻り値で、マッチしたHTMLを置き換え(or その前後に挿入)する。この処理のタイプは「$sActionType」の値に応じて変更
- 最後に「block_ob_end」は置き換えや挿入などがすべて行われたHTMLを標準出力に出力する
- block_ob_startはmain_topの一番最後、block_ob_endはmain_bottomの一番最初にセットする必要がある
- そもそも、main_topとmain_bottomがtemplate_layoutで定義されている必要がある
- 置換位置を判定するHTMLが変わってしまえば、マッチングしなくなる。(ま、その辺はその前後に挿入されてたものが挿入されなくなれば気が付くか)
- これ作れば、より配布やインストールがしやすいモジュールがつくれるぞ!
カテゴリ: ZenCartJP開発情報
バグ #103: 高い優先度でini処理をさせることができない
バグではなく要望ですが、
- 現状1000番で実行されますが、それ以前の処理に割り込むこともできるようだといいな、と。
カテゴリ: ZenCartJP開発情報


