ストーリー #104
ページの任煮の場所に挿入したり、任意の場所を置き換えたりできるようにするモジュール「page_replacer」
| Status: | 担当 | Start: | 2009-08-05 | |
| Priority: | 通常 | Due date: | ||
| Assigned to: | 志田 | % Done: | 0% |
|
| Category: | - | Spent time: | - | |
| Target version: | - | |||
Description
ちょっと考えてみた¶
- たとえばこういうことはよくある
- create_account画面の「姓」、「名」の入力欄の次に、姓(カタカナ)、名(カタカナ)という項目を追加したい、みたいな
- ページのメイン部分ど真ん中にmoduleをaddonしたい、ということ
- addon_modulesの仕組みのみでは、テンプレートを書き換えなければこの「セイ(カタカナ)」と「メイ(カタカナ)」を埋め込むことはできない
- この埋め込みを実現する「page_replacer」というaddon_modulesモジュールについて考えた
page_replacerのしくみ¶
- まずこのカナを追加するモジュール「furigana」について考える
- 「furigana」は「page_replacer」に依存するaddon_modulesモジュールとして作る
- page_replacerは、次の2つのblockを提供する
- block_ob_start: これを全ページのmain_topに埋め込む
- block_ob_end : これを全ページのmain_bottomに埋め込む
- page_replacerは、次のメソッドを提供する
$global['page_replacer']->attach($oObserver, $sPage, $sHtml, $sActionType); * $oObserver : 埋め込んだり置き換えたりする文字列を返すメソッド「_update_for_page_replacer」を実装するクラスのインスタンス * $sPages : 埋め込んだり置き換えたりする文字列が存在するページの名前 * $sHtml : HTML文字列。ここで指定したHTMLと一致したらそれを置き換え(or その前後に挿入) * $sActionType : 'before'=> 指定したHTMLの前に挿入、'after'=> 指定したHTMLの後に挿入、'replace'=> 指定したHTMLそのものを置き換え
- 「furigana」は管理画面の設定画面で設定項目として次を提供する
ユーザー登録ページ(create_accout)でフリガナが埋め込まれる位置
ユーザー登録ページでフリガナが埋め込まれる位置を指定してください。
指定したHTMLの [後に挿入 ▼]
HTML |<label class="inputLabel" for="lastname">名:</label> |
|<input id="lastname" type="text" maxlength="32" size="33" name="lastname"/> |
|<span class="alert">*</span> |
|<br class="clearBoth"/> |
- 「furigana」はmodule.php内のコンストラクタで次のように実行
$global['page_replacer']->attach($this,
'create_accout',
MODULE_FURIGANA_CREATE_ACCOUNT_REPLACE_HTML,
'after');
- 「furigana」はmodule.php内の_update_page_replacerメソッドで次のように記述
function _update_for_page_replacer() {
return $sHtml // フリガナのHTML
}
- 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が変わってしまえば、マッチングしなくなる。(ま、その辺はその前後に挿入されてたものが挿入されなくなれば気が付くか)
まとめ¶
- これ作れば、より配布やインストールがしやすいモジュールがつくれるぞ!