なーお さんの日記
d3forumの後継フォーラム・掲示板モジュール、「xcforum」を作り始めました。
自分にはかなーりハードルが高いのですが、 facebookのグループで色々相談しながらできそうなんで、もしかしたらできるかも。
それに、「factory」という、モジュール自動生成サイトがるのでこれを利用します。
で、今後の参考になるかもしれないので、できるだけメモを残しておきます。
factory サイトで作成。
factoryで作る時
- テーブル作成時に主キーに割り当てられたフィールドは削除せず、必要なら名称変更して使うこと。
status、posttimeは不要でも残しておく? ・・ 要調査
テーブル名の変更
- 出来たファイル群のsql/mysql.phpを、流用対象モジュールのものを使って書き変える。
この時、テーブル名に「-」(アンダースコア)や、その他英数字以外のがあると以下の部分でコケる。 テーブル名は英数字に変更。class/Module.class.php の中の
private function _createAction()1 2 3 4
if(!ctype_alnum($this->mActionName)) { return false; }
- 出来たファイル群のsql/mysql.phpを、流用対象モジュールのものを使って書き変える。
- 上で残したフィールドや、category_idなどのフィールドは上書きしないように注意。。
アクセス者が所属するグループRole
Role 配列
1 |
|
1 |
|
protected function _getTitle()
__EditAction.class.php に、この関数を追記しないと、「title」フィールドが無い場合にNotice。
以後、コメントで続けます。
コメント一覧
投稿ツリー
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/2/11 11:09)
-
Re: Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(mizuki, 2012/2/16 13:39)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/2/16 22:41)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(mizuki, 2012/2/17 0:07)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/2/18 0:41)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/2/28 21:17)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/3/7 12:04)
-
Re: [xoops] フォーラムモジュ-ル「xcforum」製作開始
(なーお, 2012/3/11 13:19)
DB操作を管理画面に移動
factoryで作ったモジュールの、DB操作を管理画面に移動する。 どうやっていいのか最初は全然わからず、迷子になって右往左往。
いくつか注意するところがあるので、メモ。
ファイル名と配置
admin/actions/
- TablenameActionnameAction.class.php
- factoryが作ったActionファイルを、admin内に移動。
- クラス名の変更。途中に「Admin_」を追記。
Class Modulename_Admin_TablenameActionname extends hogefuge
これを忘れると、クラス見つからずリダイレクトされてしまい、どこでリダイレクトされているのか見つけるのに時間をかなり浪費する。 - protected function _setupActionForm() のオーバーライド(アクションがEdit操作の場合)
第3引数に「true」が返らないと、adminフォルダ内のformをロードしてくれないので、関数をオーバーライドしておく。以下の例では、予め $this->mod_isadmin にmod_admin判定値を入れておく例。protected function _setupActionForm() { $this->mActionForm =& $this->mAsset->getObject('form', $this->_getConst('DATANAME'), $this->mod_isadmin, $this->_getActionName()); $this->mActionForm->prepare(); }
admin/forms/
- TablenameActionnameForm.class.php
- TablenameFilterForm.class.php
admin/templates
任意のテンプレートを使うが、actionスクリプト内の function executeViewInput にある行を以下のように直接指定に書き換え。
$render->setTemplateName('your_template_name.html');
class/handler/
- Tablename.class.php
このファイルは移動せず、元の位置に置いておく。
おお、うれしいですね!
可能であれば、画像やテキストキャプチャーなんかでゲスト投稿できるといいな。
画像なんかも簡単にアップできれば・・なんて!
mizukiさん、こんにちは。
書き忘れましたが、xcforumはXCL2.2以上限定になります。まあ今後の新規モジュールなので、それで良いかなと。
可能であれば、画像やテキストキャプチャーなんかでゲスト投稿できるといいな。画像なんかも簡単にアップできれば・・なんて!
画像やテキストキャプチャーって、意味が良く判らないのですがどういったことですか? 参考までに教えてください。
画像については、leimgモジュールなどを使えるようにするつもりです。 また、nao-ponさんがxelfinderモジュールも開発中ですので、そちらとの連携も考えています。 どうぞ楽しみに。
それから、pack2012では将来的に、TokyoPenのように、モジュールのアップデータも実装するべく、開発中です。
書き忘れましたが、xcforumはXCL2.2以上限定になります
ベータ版人柱OKです!
画像やテキストキャプチャーって、意味が良く判らないのですがどういったことですか? 参考までに教えてください。
画像認証 captcha
http://linux.ohwada.jp/modules/wfdownloads/singlefile.php?cid=1&lid=73
テキストキャプチャーっていうのが、ELGGっていうCMS系のプラグインで見たんですが、
3×2
って表示されたら、6という感じで、答えを入力するとか、
日本一高い山は?
って表示されたら、富士山という感じで、答えを入力し、投稿ボタンをクリックする・・とかです。
ちょっと紛らわしかったですね。
factoryで生成されたソースコードの実行順
理解できるまで時間がかかったが、要するに「class/Module.class.php」の public function execute(/*** XCube_Controller ***/ &$controller) に書かれた順番で実行される。
- _createAction()
- prepare()
- _setupObject()
- hasPermission()
- execute()
- getDefaultView()
- 'executeView' . ucfirst($viewStatus)
この順番を変えるにはこのファイル内の記述を変更すれば可能だが、まずそれはしないので、この順番を頭に入れて読むと実行の流れがわかってソースコードを読みやすい!
criteriaで JOINを実現するための、現実的で応用の効く一つの解。(by suinさん)
1 |
|
[xcforum開発] 徐々に進んでます。
壁にぶつかっていたのは、TopicsList表示で 複数テーブルをJOINして複数の検索条件を付加する部分。 JOINせずにロジックを回していたんだけど、長くなるし見通しも悪いコードになりそうな悪寒。。
複数テーブルをJOINすること自体、XoopsObject・criteriaではできない。 そこでfacebook上でヒントをいただき、d3forumの元のSQLで抽出し、 表示だけをfactoryが生成するobjetに放り込む方法を取ることで、解決。 ユーザーがチェック済みの投稿のアイコンを変える部分なども問題無くクリアできた。
ところで、d3forumはフォーラム内に独自の検索があって、このクエリ文字をfactoryで作られたPageNaviに反映する方法が今一つ判らない。今のままだと、実際のクエリ結果とPageNaviの表示がバラバラ。 テンプレート内にはsmartyプラグインが書かれていて、プラグインからpageNaviのオブジェクト内メソッドをあれこれ呼んで作っているので、まあその辺を解析して割り込めれば何とかなると思うんだけど・・
最終的には見た目もBoxNavi的にしたいし、これはd3forumで組み込んだクラスをやっぱり使うのがいいかな。
他方のソート機能はテンプレートにクエリ文字分を付加するだけでOKだったから、そちらは有り難く使わせていただきます!
以下、今回の実装に関連するソースコード部分。
ハンドラクラス
Legacy_AbstractClientObjectHandler を継承したクラス内に、最低限、以下の2つのメソッドを実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
オブジェクトクラス
Xcforum_TopicsObject 内に、オブジェクト内メンバ変数を後処理で初期化するメソッドを追加して、topicsテーブル内にJOINしたテーブルデータや他の諸々のデータも、Object内に格納できるようにする。 呼び元は上記getObject()中にあり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
SQLとgetObjects
そして、肝心のObject取得部分は、以下の感じ。 現時点ではコントローラに書いちゃっているけど、もう少し粒度を細かくして、共通クラスに放り込んでブロックからも使えるようにできるといいかなあ。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
|
factoryが生成するモジュールinstallコードで、notificationがインストールされない問題が発覚したので、 その解決までをメモっておきます。
html/modules/legacy/admin/class/ModuleInstallInformation.class.php の
function _loadNotificationPreferenceInfomations(&$modversion, &$collection)
内の頭に atrace();をしてみたところ、
従来モジュール (GNAViの例)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
factory生成モジュール(xcforumの例)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
ということで、どうやらXcforumInstaller.class.phpが怪しい。
Xcforum_InstallUtils.class.php の 「public static function installAllOfConfigs」の内容を そっくりそのまま、Legacy_ModuleInstallUtils 内の同メソッドを上書きしてみたら、無事にnotificationもインストールできた。
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 |
|
factoryに書かれたコードが、XCL2.2のLegacyモジュールの変更に追い付いていなかったのかな?