手前味噌となりますが・・・・
XCLのXoopsSimpleObjectクラスとXoopsObjectGenericHandlerクラスではないですが、
拙作のWordPressモジュール開発時に作成した、XoopsObjectとXoopsObjectHandlerを
継承した、XoopsTableObjectとXoopsTableObjectHandlerでは、別途、
XoopsJoinCriteriaというJOIN専用Criteriaクラスをを用意しています。
参考にされたい場合には、
http://www.kowa.org からRelease 0.6.0 Alphaの最新スナップショットを
取得いただき、/modules/wordpress/class/xoopstableobject.php
を見ていただければと思います。
JOINを含むQuery作成例としては、/modules/wordpress/wp-blog-header.php
でGETパラメータを元に抽出条件を設定している長大(笑)なソースがあります。
なお、残念ながらこのxoopstableobject自体は、現在はメンテしておらず、
これをベースにした、別途の仕組みを開発しています。
こちらは、やはり拙作のMyGmapのV2以降で使用しているNBFrameという
フレームワークもどきです。(MyGmap1.0.0ではxoopstableobjectを使用していました)
このNBFrame中にxoopstableobjectを土台にした、DB操作クラスを用意しています。
こちらは如何にしてD3互換のモジュール開発で、手を抜けるかを主眼においています。
(たとえサーバに負荷が余計にかかったとしても(^^;;;)
ので、オブジェクトにテーブルのフィールド定義を書かなくても、テーブル構造を元にして
勝手に作成してくれるなどの機能も含んでいます。
(こちらは、Objectクラスだけの単体使用は難しくなっていますので、痛し痒しですが・・)
ご興味があれば、MyGmap Release 2.5.0 のスナップショットを
ダウンロードいただければと思います。
(最近はNBFrame側の機能追加修正で頻繁に修正コミットしていますので、
場合によると一部動かない場合もあるかもしれませんが・・・)
ロジックは、すべてxoops_trust_path下にあり、NBFrameは、libs/NBFrame下に
MyGmapの基本ロジックは、moudles/mygmap下に存在します。
html下のモジュールフォルダの内容は、NBFrameを使用するモジュールでは、
基本的にはmytrustdirname.php以外は共通です)
ご参考まで。
08/02/06 に ouka<ouka...@gmail.com> さんは書きました:
> ただいまXoops Cube Legacyでのモジュール開発を行っております。
>
> XoopsSimpleObjectクラスとXoopsObjectGenericHandlerクラスを使い、
> 直接SQL文を書かなくてもデータベー
> スからデータを取る方法は理解しました。ただ、目的とする仕様では
> SQL文を結合させたいため、XoopsSimpleObjectクラスと
> XoopsObjectGenericHandlerクラスでは限界を感じております。
結合のさせ方にもよりますが、XCLDB p.141「複数のテーブルオブジェ
クトを作る」にあるような方法で、ある程度はカバーできると思います。
僕は exFrame の後継である Cubson というツールを使ってモジュール
を作成していますが、だいたいは XCLDB にあるのと同様の方法で
複数のテーブルのデータをくっつけています。
Cubsonについては、
http://xoops-shade.sourceforge.jp/wiki/index.php?cubson
http://d.hatena.ne.jp/kilica/20070807
あたりを参照いただくといいと思います。
サンプルモジュールとしては、
http://xc-tokai.net/modules/xhnewbb/viewtopic.php?topic_id=20&post_id=
47#forumpost47
「Bm」(ブックマーク)と「Tag」の二つのテーブルからなるモジュールで、
ひとつのBmレコードに対して複数のTagレコードが紐づく「1対多」の
関係になっています。
たとえば、このモジュールの、actions/BmListAction.class.php の中の
$this->mObjects[$key]->loadTag();
という行では、あるBmレコード($this->mObjects[$key])に対して、
関係するTagレコードを取ってきています。
※loadTag() は、class/handler/Bm.class.php で定義しています。
以上、簡単ですが。
ORマッパーの話題ですね。
>> ただいまXoops Cube Legacyでのモジュール開発を行っております。
>>
>> XoopsSimpleObjectクラスとXoopsObjectGenericHandlerクラスを使い、
>> 直接SQL文を書かなくてもデータベー
>> スからデータを取る方法は理解しました。ただ、目的とする仕様では
>> SQL文を結合させたいため、XoopsSimpleObjectクラスと
>> XoopsObjectGenericHandlerクラスでは限界を感じております。
Xoopsなんで割とXoopsObject(もしくはそのサブクラスを)使ってるって
人は多いと思いますが、正直他のORマッパーを使うと二度と使いたく
なくなる代物かと思います。
# というか、XoopsObjectはSQL直書きと大差ない。
S2DaoとかDB_DataObjectなんかありますけど、できの良いフレームワークに
くっついているのも使ってもいいですよね。X2はともかくXCLはフレームワークと
親和性高いと思います。ホダ塾ディストリではEthna使ってるモジュールあるので
探ってみてください。
ただ、学習コストはそれなりに高いかと。
あと、ORMはプログラマが楽するためのものなんでSQL直書きの方が
もちろん速度は出ます。でも、一度使ってしまうと便利で・・・。
HIKAWA Kilica wrote:
> 僕は exFrame の後継である Cubson というツールを使ってモジュール
> を作成していますが、だいたいは XCLDB にあるのと同様の方法で
> 複数のテーブルのデータをくっつけています。
やっぱORMだと、(少なくとも雛形は)テーブル構造を自動取得して
マッピング定義を作って欲しいですよね。
コンストラクタで $this->initVar() とか耐えられない・・・・
伊藤
XoopsObject系はちょっと勧められないですね。正直なところ、未だに
このクラスを使用しているモジュールがあったり、話題に挙がってくるのが
不思議なくらいです。僕自身ももう何年も前から使用していませんし^^
> 追記、折角ですがお送りいただいたソースコードは今の私にはぱっとみでは読めません。出直してきます。
私も読めないコードがあった場合、とりあえず置いておきます。
ただ、そのコードが色々と勉強する要素を含んでいるな・・・と思ったら必ず見返します。
PHPコードを書き続けてると、ある日それが読めているようになったことは何度かあるので。
XOOPSCube Legacyのコードもようやく少し読めるのに1年以上かかっています。
まだレンダリングの部分がほとんど読めてません。まぁ、この程度のレベルです。
でも、絶対読んでやろうと思ってます。
で、Marijuanaさんのコードを私なりに読むと、
これは、XoopsSimpleObjectの(サブクラスを扱う)Handlerのメソッドとして使うんだと思います。
public static function getSelectObject($sql)
{
$root = XCube_Root::getSingleton();
$rootを取っているのは、XoopsCubeのプログラミングでは基本ですよね。
ここからデータベースコネクションとか、モジュール情報とか取れますから。
$db = $root->mController->mDB;
で、データベースオブジェクトを取ってます。
$char = array('STRING', 'CHAR', 'VARCHAR');
......
$float = array('REAL', 'DOUBLE', 'FLOAT', 'DECIMAL', 'NUMERIC');
......
if ( in_array($ftype, $char) ) {
......
}
$fdata[$fname] = $type;
}
までで、今回のSELECTで使ったテーブルのフィールドの情報(それが文字列フィールドなのか、
整数値フィールドなのか等等)を規定しています。
なんでこんなことするかというと、XoopsObjectを使うにはXoopsObjectのコンストラクタで
$this->initVar()しないといけないのですが、initVarの引数にはフィールドの型情報が
必要ですから。
で、
$ret = array();
$n = 0;
while ($row = $db->fetchArray($result)) {
...............
}
whileの中で、1つずつXoopsSimpleObjectを作って、それをinitVarして
(XoopsSimpleObjectの(サブクラスの)コンストラクタに書くか、HandlerでinitVarするかどっちでも良い)
作ったXoopsObjectにassignVars()でSELECT値を入れてます。これで、1つのテーブルカラムに
相当するデータオブジェクトの出来上がりです。whileなんで、SELECTで取ってきた分だけ
XoopsSimpleObjectを作っています。
汎用性を持たせたいなら、XoopsSimpleObjectをnewするのではなく、そのサブクラス
を1枚かませてnewするのかなと思います。実際に使うなら更にそのサブクラスをnew
することになるでしょう。
class Mari_XoopsSimpleObject extends XoopsSimpleObject
{
..........
}
class Pricetable_Mari_XoopsSimpleObject extends Mari_XoopsSimpleObject
{
..........
}
みたいな感じで。
正直、コード書いて更にここまで説明する人は居ないと思います。
コード書けばまぁ分かるかなという気持ちで実例を示してくれたMarijuanaさんは
それだけでもすごく親切だと思います。
なぜなら、oukaさんのもともとの質問にコードは1行も無いからです。
そのゼロの状態からコードを起こすのは大変です。
私を含めて何人か観念的な話でレスしましたが、それより実際のコードを持ってくる
Marijuanaさんのほうが100倍分かりやすくて効果的だと思いました。
それを
> 投げかけた質問に対して返す第一声がこの一行
最初の1行だけで
> 追記、折角ですがお送りいただいたソースコードは今の私にはぱっとみでは読めません
と捨て台詞を吐かれるのは、もったいなくて我慢できないので私なりの説明を
試みてみました。コード読解の一助となれば幸いです。
また、
> またマルチポストと受け止められるのであればそれはご迷惑をおかけしたと反省します。
であれば、せめてXOOPS Cube日本サイトの当該スレッドにおいてこのXDGJのスレッドへ
ポインタでも示しておいていただけないでしょうか。
伊藤