XCDM#1でも発表したネタなのですが、XCL2.1ではpreload一発で、レンダラーのかなり大きな部分をフックすることができます。
preloadでフックするべきデリゲート名は、おなじみ 'XoopsTpl.New' です。
まずはソースコードを見てください。
フック処理が来た直後に、
XOOPS_TRUST_PATH/libs/smartyplugins
を、Smartyプラグイン用ディレクトリとして挿入してます。
「これ、どこかで見たことあるな」と思った人は勘がいいです。まさに、
http://ryus.co.jp/modules/wordpress/index.php?p=57
と同じですから。
でも、ryusSmartyPluginsEx との違いは、追加ではなく挿入していることです。
ユーザディレクトリから先に探すことにより、デフォルトのSmartyプラグインを乗っ取ることができるのです。
そして、乗っ取って一番面白いのは、やはり resource.db.php でしょう。XOOPS_TRUST_PATH/libs/smartyplugins/resource.db.php にDBリソースの見つけ方を記述することで、テンプレートの動作を自由にコントロールできます。(その具体例は次回)
このpreloadにおける hook()メソッドでは、それ以外に、コンパイルIDの指定を行っています。これによって、テーマ毎に異なるコンパイルキャッシュを生成するようになり、テーマを切り替えたけどテンプレートは切替前のテーマ付属のテンプレートのまま、というトラブルを避けることができます。
このあたりは、本家版コアのパクリですが、コアの構成ファイルを一切おきかえずとも、このような重要な仕様改善ができるというのは、まさにXCL2.1の真骨頂でしょう。
XCDM#1 参加してきました。
技術よりの話かと思ったら、そんなのはまったくなくて、「自分はOSSに対して何ができるか」を確認する作業でした。密室の中でチームになって、プロジェクトに対して貢献できることをリストアップしていく作業……。これって、新興宗教のオルグ? とかちょっと思いました
確かに、XOOPSというOSSもどきを、ちゃんとしたOSSにするためには、なんらかの洗脳が必要なのかもしれません。
そんな中、なぜか私一人だけが技術話をしたのですが、それについては、おいおい書いていきます。
あと、Marijuanaさんから、「XOOPS Cube Legacy デベロッパーズバイブル」をいただきました!
ありがとうございます。これから読みます。
もう一つくらい実例を挙げようかと思ったのですが、なかなか時間がとれないので、忘れないうちに仕様を一通り書いておきます。
いずれのプラグインも、メール送信先追加や確認メールを送るといった動作変更を、プラグインに対する引数で指定することができます。
いずれの引数も省略可能で、テキスト関連の引数が省略された場合は、言語ファイル内の定義が用いられます。
「WYSIWYG Editor搭載」
なんて売り文句を見る度に眉をひそめてきた私ですが、いろいろとテストした限り、HTMLPurifierを信用して良さそうなので、最新の d3forum-0.77 でfckxoopsを利用できるようにしてみました。
それもあえてこのサイトで運用してます。(自信の顕れ? 無謀な挑戦? )
HTML allowed FORUM
http://xoops.peak.ne.jp/md/d3forum/index.php?forum_id=12
このフォーラムでのみ、WYSIWYGエディタが有効になっており、HTML許可の投稿が出来ます。そして、HTML許可の場合は、無条件で、HTMLPurifierを通過します。
(当たり前ですが、d3forumでは、フォーラム毎に、それらの設定を細かくコントロールできます。フォーラムオプションでの指定法は記事の最後を参照のこと)
プレビューとかでいろいろ試してみるのも良いかもしれません。
試しに投稿しちゃっても良いですよ。但し、残しておく保証はありません。(fckxoopsの画像も同じ)
"HTMLでValidateするフォームメール" という記事を何回か連続で書いてきましたが、この意味がなかなか判りづらいかもしれません。「POSTデータ処理を行うための基準を、HTMLフォームそのものに求める」と書いても、判らない人には判らないでしょう。
というわけで、もう少し判りやすい実例で行きましょう。
その1
「商品説明コンテンツに、共通の問い合わせフォームを埋め込む」
picoを使ってカテゴリーごとに商品ページを作ったとしましょう。それらの一つ一つに、問い合わせフォームを埋め込んでいくなんて、それこそナンセンスです。
こんな用途では、formmailプラグインとpicoプラグインの組み合わせでバッチリです。
商品説明ページはこんな感じで作ります。(SmartyフィルターをONにすること)
(商品説明部分)
<{capture}>
<{pico id="(フォームを記述したコンテンツ番号)"}>
<{/capture}>
<{formmail4fleamarket mail_body_pre="以下の商品について問い合わせがありました。\nいずれかの連絡先までご連絡ください。\n\n" from_name="商品問い合わせ担当" cc_field_name="youremail" cc_mail_subject="確認メール" cc_mail_body_pre="お問い合わせありがとうございました。\n以下が確認内容です。\n"}>
<form>
お名前: <input type="text" name="お名前" class="required" /><br />
email: <input type="text" name="youremail" class="email" />
<input type="submit" />
</form>