インストールしてみました。
カテゴリーとか、各モジュールごとにって割とうっとうしいのでいいですね。
http://xoops.trpg-labo.com/modules/wiki/?Menu%2FXCat
見てました。
下記、色々書いた後に過去ログ
[xcube-dev-ja:230] Re: 共通カテゴリモジュール
見たら私が
> で、これを
> XCube_DelegateUtils::call($kili_cat, 'as_array')
> とかで簡単に呼べるといいですねー。
とか書いてて大汗なんですが・・・・・書いたので投稿します。
//デリゲートで Xcat_Cat オブジェクトを取得
XCube_DelegateUtils::call('Module.xcat.Event.GetCatManager',
new XCube_Ref($cat),
$this->mObject->get('cat_id')
);
# 'Module.xcat.Event.GetCatManager'のxcatって dirname ですか?
# ってPreloadみたらそうでもないような。でもHandlerみると xcat 以外のdirnameを
# 意識してたり・・・。
#
# 管理系なので、Duplicateにはしないのかなー?と思ったり。
# でも、管理系なのにユーザー側にEditがあるのは何故?とか :-)
で、他モジュールから呼ばれる時、Delegateを使うことを想定されてますが、
Delegateって「デフォルトの動作が気に入らないから変更してやる!」っていう
感じがあって「この処理系をお願いね~」っていう依頼系の処理はServiceぽいなぁと。
なんとなくですが、権限チェックが
$xcat_dirname = 'xcat';
$xcat_id = intval($_GET['xcat_id']);
$uid = $GLOBALS['xoopsUser']->uid();
$privilege_type = 'VIEW';
$xcat_service =& XCat_Service::getSingleton($xcat_dirname);
if ($xcat_service->getCategory($xcat_id)->checkPermUser($privilege_type, $uid)){
// ここにO.Kの場合の処理
}
見たいな感じの方が「使わせてもらってる側プログラマ」としては分かりやすいかなぁと。
多分、'Module.xcat.Event.GetCatManager'の処理が気に入らないから変える!って人は
あまりいないような。もしいたとしても、checkPermUserメソッド内にDelegateを忍ばせておけば
やる人は勝手にやる・・・みたいな。
すんません、勝手言ってホンマすみません。
伊藤
「共有カテゴリ管理モジュール」 まだ、ページの説明を斜め読みした程度ですが・・・
Delegateを使用されているなど、XCubeならではのモジュール大歓迎です。
で、Delegateなんですが、「共有カテゴリー」って考えた場合に小生が思い浮かぶ
Delegateの使用シーンっていうのは、今回のようにXCatの機能がが呼ばれる形ではなく、
XCat側が呼ぶ形だと思うんですよね。
具体的には、XCatが管理しているカテゴリーを削除した場合に、XCatを使用している
モジュール側のコンテンツで、削除されたカテゴリーに属している場合、
たとえば、Module.xcat.Event.DeleteCategoryなんて名前の、
Delegateのインターフェースを公開しておいて、XCatでカテゴリー削除が
されたタイミングで、このDelegateで使用モジュールに対してマルチキャストして
やれば、各モジュールでは、カテゴリーに属するコンテンツを削除するなり、
カテゴリーに属さないコンテンツにするなりの個別のコンテンツレコードの
変更処理を実行できるなんて事が簡単に実現できると思います。
ご検討いただければ、幸いです。
のぶのぶ さんは書きました:
> で、Delegateなんですが、「共有カテゴリー」って考えた場合に小生が思い浮かぶ
> Delegateの使用シーンっていうのは、今回のようにXCatの機能がが呼ばれる形ではなく、
> XCat側が呼ぶ形だと思うんですよね。
>
> 具体的には、XCatが管理しているカテゴリーを削除した場合に、XCatを使用している
> モジュール側のコンテンツで、削除されたカテゴリーに属している場合、
> たとえば、Module.xcat.Event.DeleteCategoryなんて名前の、
> Delegateのインターフェースを公開しておいて、XCatでカテゴリー削除が
> されたタイミングで、このDelegateで使用モジュールに対してマルチキャストして
> やれば、各モジュールでは、カテゴリーに属するコンテンツを削除するなり、
> カテゴリーに属さないコンテンツにするなりの個別のコンテンツレコードの
> 変更処理を実行できるなんて事が簡単に実現できると思います。
なるほど。他のモジュールからXCatのデータを利用したい時は、XCatのServiceを使う。
XCatがなんか処理する時に乗っかかりたい時は、XCatの方でDelegateを用意してあるのに
乗っかかるという感じですね。
[用意しておく側] [メインの処理側]
XCat(Service) ← 他のモジュール
他のモジュール → (Delegate)XCat
逆に言うと、わざわざDelegateでCallするという処理は、汎用的なモジュール
UserやLegacyなどのBASEじゃないと意味が無いという気がします。
本格的にDelegate/Serviceでモジュール間通信をしようとすると、
Preloadってこれらの登録だけを第3引数を使って行って、
実行コードは別ファイルにしておかないと実行時に使いもしないコードが読み込まれて
メモリ大量消費になっちゃいますね。今、結構Preload内にガッツリ処理を
書いちゃってます。
# 独り言になってしまった
伊藤
> やはり delegate だと本来の使い方とはちょっと違うわけですね。
> service ベースで機能を提供できるよう、作ってみます。
>
> というわけで、もうしばらくお待ちください>利用をお考えの皆様
delegateにせよ、serviceにせよ、何らかの機能を提供する側から見た場合に、
XCatでいうと、「共有カテゴリーオブジェクトの提供」とか「共有カテゴリー一覧の提供」
といったの機能自体が、
「換装の可能性があるか?」
「拡張の可能性があるか?」(自分が機能を持っていない場合も含む)
という問いかけに対して、YESという答えが返ってくる場合にのみ実装すべきだと思うわけです。
No.であれば直接にHandler生成してObjectをgetするAPIの提供だけでも支障は無いと
考えるのですが・・・・・
ただし、Serviceについてはサイト間連携を考える前提で、サイト間共通のカテゴリー管理などの
可能性を考えるのであれば、Serviceとして実装するってことで可能になってきます。
(ただしこの場合には、サイト間で同一のカテゴリーを持つコンテンツを共有するために、
サイト間マルチキャストのような要請が別途出てくる可能性がありますね。)
> 本当は、nobunobuさんが指摘されているようなことを作る前に考え
> 抜いてから実際に作り始められると格好いいのですが、delegate も
> service も分かっていないので、作りながら「なるほど、こう動くのか」
> と理解しているところだったりします(^ ^;。
> (delegateで作っていて、他と使い方が反対だな、とは確かに思った)
今件と直接絡んでという事でもないのですが、
まだ図など入れてないものの、デリゲートの技術的バックボーンなどまとめてみました。
サービスとデリゲートの違いというより、デリゲートとオーバーライドの本質的な類似性と
相違点を低レベルな視点でまとめたものです。
http://xoopscube.wiki.sourceforge.net/The_background_of_XCube_Delegate_mechanism%3Bja
現在これの DelegateManager 版も通勤時間を使ってしこしこと作成中です。;;
すみません、このMLの中には、
「ははあ、お前の取りたい説明アプローチは分かった。しかしこの書き方はどうよ」
という方もいらっしゃると思います。nobunobuさんとか (^▽^) ←名指し期待
適当に編集願います m(__)m
デリゲートに関するドキュメントは他にも未完のものがひとつありますが、
こちらはディープ版としてオモシロ読み物として置いておければと思ってます。
--
minahito (mina...@gmail.com)
> 今件と直接絡んでという事でもないのですが、
> まだ図など入れてないものの、デリゲートの技術的バックボーンなどまとめ
てみました。
> サービスとデリゲートの違いというより、デリゲートとオーバーライドの本
質的な類似性と
> 相違点を低レベルな視点でまとめたものです。
>
> http://xoopscube.wiki.sourceforge.net/The_background_of_XCube_
> Delegate_mechanism%3Bja
わわ、またえらい分かりやすいドキュメントをありがとうございます(あ、名
古屋弁か)。
これはお金を払ってもいいくらいの分かりやすい説明ですね~。
代わりに今後モジュールを作ることでお返しとさせていただきます m(__)m。
XCat は nobunobuさんや伊藤さんのアドバイスをいただいていちおう順調に進
んで
おりまして、Service を使ったモジュール間連携の実装が完了し、テストモ
ジュール
を作って機能を確かめているところです。
ここで作ってるテストモジュールもちょっと変わっているのでついでにご紹介
します。
http://d.hatena.ne.jp/kilica/20080614
opCal (Open Calendar) という、Google Calendar と連携したイベントカレ
ンダ
モジュールで、ひとつのカレンダをあちこちのサイトで共有できるのが特長で
す。
このカレンダで使っている、都道府県、カテゴリ、施設の情報を、XCat から
取得して
います。
以上です。