LOGIN ID Password Auto Login Register Now! Lost Password?
Xoops Q&A

xCCKを使ってクロス表を表示したい

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 | 投稿日時 2016/5/17 23:39
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
xCCKを使って、勤務管理表を作ってます。
入力系と検索表示まではナントカできたんですが、せっかくなのでグループ内メンバー全員の勤怠を全部表示するというのが出来ないかとトライアル中です。
#うそうそ、まだまだ手をつけてないに等しい。。

今のところまでは、オリジナルのxCCKのモジュールでテンプレートを変更するだけで出来ました。
でも1ヶ月分のレコードを拾って、1行のデータに直してレンダラーに渡さないといけないかと思って、さすがにソースレベルで手を入れないと出来ないかと思っています。

・検索系は出来ている:検索条件は「年月」+「社員番号」
・出し方はこれに似ている:「年月」は指定して絞り込み、「社員番号」毎に、「日」を横に並べる
ので、
・検索結果をそのまま返すのではなく、「日」に相当する列を生成して、そこに同一キーのデータを横に並べて返す
・項目名(定義情報)も並べて返す
とすればいけるかも。。。

ということで、新しいアクション「cross」を前提に、
PageSearchAction.class.phpのサブクラスとしてPageCrossAction.class.phpを書いてみた
SearchFilterForm.class.phpのサブクラスとしてCrossFilterForm.class.phpを書いてみた

テンプレートに
<{assign var="searchd" value='Ym'|date}>

<a href="<{xoops_cooluri dirname=$dirname dataname=page action=list query="show=all"}>">&gt;&gt;<{$smarty.const._MD_XCCK_LANG_SHOW_ALL}></a><br>
<a href="<{xoops_cooluri dirname=$dirname dataname=page action=cross query=$searchq}>">&gt;&gt;クロス検索</a><br>
と入れてみた(上記は、若干編集)。
#まるっきり見よう見まねですね。

でも、このactionに指定したキーワード「cross」とその先のXOOPS側の処理の関係が分かっていないので、PageCrossAction.class.phpがどうやって呼ばれるのか?どこかに対応付けの表を持っているのか?特定の命名規約で呼出されるのかなど、よく分かりません。

何もしなくてもactionまで繋がるんでしょうか?

基本的な質問で申し訳ありませんが、教えてください。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2016/5/18 1:22 | 最終変更
kamezou  1st Class 居住地: 2013~  投稿数: 47
オリジナルのxCCKのモジュールでテンプレートを変更するだけで出来ると思いますよ。

正しく書いてあれば、URL の action= に記述されたものが呼び出されると思いますが、それに対応するテンプレートを用意する必要があるのではないかと思います。
(私はまだモジュールを作ったことがないので、違っていたらごめんなさい。)


多分、次のコードでファイル名を生成して呼び出しています。(/trust_path/modules/xcck/class/Module.class.php 383行~)
		$fileName = ($this->mAdminFlag ? '/admin' : '')
			. '/actions/' . ucfirst($this->mActionName) . 'Action.class.php';
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2016/5/18 9:10
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
なるほど!!

actionに指定されているキーワードでgrepかけてもそれっぽいソースがでてこなかったんで、どうやって関連づけているのかと思ったんですが、ファイル名(の一部)を指定していると言うことなんですね。

ありがとうございました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2016/5/21 12:26 | 最終変更
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
引用:

・検索結果をそのまま返すのではなく、「日」に相当する列を生成して、そこに同一キーのデータを横に並べて返す
・項目名(定義情報)も並べて返す
とすればいけるかも。。。

ということで、新しいアクション「cross」を前提に、
PageSearchAction.class.phpのサブクラスとしてPageCrossAction.class.phpを書いてみた
SearchFilterForm.class.phpのサブクラスとしてCrossFilterForm.class.phpを書いてみた

で、実際のデータの検索をどこでやっているのかと思ったんですが、delegateに飛んでいくように見えるものの、こいつの実態がどこにあるのかよく分かりません。

SearchFilterForm.class.php:93line
        XCube_DelegateUtils::call('Module.'.$dirname.'.FetchSearchFilter', $this);

SQLの実行はとりあえずそのままで、帰ってきたレコードセットを小細工したいんですが、どうするべきなんでしょうか?


#今日一日、XOOPSとdelegateの情報を探し回ったけど、未だに理解できず。。情けない。。。。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2016/5/21 21:49
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
ついでに以下の観点で、「スマートな」やり方を教えてください。

データの投入・検索は、
・複数メンバーがザクザクやっている
・複数グループのメンバーが使う予定
にもかかわらず、今のところ
・年月と社員番号を入力しないと検索できない
・複数メンバーを並べて表示できない
と言う状況です。

「並べて表示」をクリアしたくって「クロス表示」などというキーワードで機能と実現方式を検討中です。

「社員番号を入力」を避けるために「メンバー個々の検索アンカー」を全員分表示してしまえば良いかと思ってます。(暫定かも)
で、
「自分が所属するグループの全メンバーの社員番号を取ってくる」
「それらすべてについて、検索機能へのURLを貼付けたアンカーをxcck_inc_menu.htmlに表示する」
と言う感じを考えて居ます。

xCCKは、直接的にユーザ情報とかグループ情報とか持っていないですが、そこら辺を検索しつつ、xcckのテンプレート内で参照するにはどうしたら良いんでしょう?


投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2016/5/23 13:24 | 最終変更
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
引用:

kyd02776さんは書きました:
で、実際のデータの検索をどこでやっているのかと思ったんですが、delegateに飛んでいくように見えるものの、こいつの実態がどこにあるのかよく分かりません。

SearchFilterForm.class.php:93line
        XCube_DelegateUtils::call('Module.'.$dirname.'.FetchSearchFilter', $this);

delegateのコールバックルーチンの登録箇所が見当たらなかったので、もしかしてと思い、この行をコメントアウトしてみたんですが、変わらずに動きますね。登録がないので何もしないで終了している?

実際にデータを検索しているのは違う箇所みたいですね。
メソッド名がfetchなので、データの取出までしているのかと思ったんですが。

お騒がせしました。

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2016/5/27 0:15
kamezou  1st Class 居住地: 2013~  投稿数: 47
「スマートな」やり方かどうかはともかかく、

私なら、まず、グループを格納するフィールドを追加し、自動入力&検索指定します。
グループの取得は、Smarty小ネタ の 「特定のグループにのみ表示」 を参照。(テーマ用ですが、テンプレート内でも使用できます。)

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2016/6/1 21:46
kyd02776  1st Class 居住地: ☆☆  投稿数: 39
そうですね、最初は私も「データにグループを持つ」方針にしようかと思ったんですが、途中でメンバーが移動した場合に追随できないので、どうしようかなぁ、と思いました。

なので、
・検索時にグループを指定する。
・検索実行時に、グループからIDのリストを取り出して、それを「and ID in グループのIDリスト」としてWhere句に書き足すような感じがシンプルかなぁと思っています。

XOOPSのhandlerの概念って、単テーブルには簡単だけど、複数テーブルになると面倒な感じなので、JOINにならないで、そんなにSQLのコストを上げない方法だとこんな感じかと。

どうでしょう?

#クロス表が意外にサクッと出来たので、ちょっと気をよくして、Query側に手を染めようとしている。。。。
投票数:0 平均点:0.00
  条件検索へ

Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities