LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Forum

d3diary開発中

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

投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2009/5/31 16:49 | 最終変更
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
XUGJの皆さん、こんにちは。 naaoです。

プライベートプロジェクトで、いくつかのモジュールのd3comment統合化を実装してきましたが、一番手を入れていたminidiaryモジュールのD3化フォークモジュール開発・配布について、作者のmatoyan様にご了解いただきまして、現在取り組み中です。

minidiaryモジュールについては改めて説明するまでもないとは思いますが、mixiライクな操作感をもち、XSNSコミュニティモジュールの友達機能と連携した公開設定などが可能な、マルチユーザーサイト向けの軽量な日記モジュールです。

これのD3comment統合化・イベント通知機能実装は、minidiaryハックの差分ファイルを公開してきました。 今回はこれをベースに、モジュール自体をD3化し、japaneseだけでなくutf-8ほか多言語化環境への対応、その他追加機能を実装してゆく計画です。

まずは、D3化の部分について、ほぼコンバート作業が終わりましたので、これを機会にログを残す意味で 開発日記を始めました。 初回の本日は、基本的な抜けなどのチェックのために、ディレクトリ・ファイルツリーを掲載してあります。

 d3diary開発日記

ご存知のとおり小生のスキルはまだまだですので、ぜひツッコミなど、こちらのスレか、リンク先で(各日付ページでコメント可能)コメントいただければ幸いです。 もちろん、ガンバレー!というエールをいただけると、とても嬉しいです。

一言でいうなれば、「一般ユーザーも頑張って目指せモジュール開発者への道」という感じで行きたいと思います。 識者の方々、どうぞご指導よろしくお願いします。

なお、この開発の位置づけ、今後の追加機能の予定などは、以下のブログ記事を参照ください。

 なーお'nぶろぐ - [xoops module開発] d3diaryの構想

では、どうぞ今後のd3diaryをよろしくお願いします。
投票数:3 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2009/6/1 7:01 | 最終変更
GIJOE  Admiral 居住地: 2003年4月くらい  投稿数: 3708
naaoさん、こんにちは。

引用:

minidiaryモジュールについては改めて説明するまでもないとは思いますが、mixiライクな操作感をもち、XSNSコミュニティモジュールの友達機能と連携した公開設定などが可能な、マルチユーザーサイト向けの軽量な日記モジュールです。
実は動作を見たこともありませんでした。
なるほど、結構面白そうなモジュールなんですね。


引用:
もちろん、ガンバレー!というエールをいただけると、とても嬉しいです。

ではさっそく「ガンバレー!」


作っていく上での疑問点がありましたら、なんなりとどうぞ。

あと、D3モジュールを作る上での有用なリンクとしては、tokitaさんのD3モジュールジェネレータ、なんてのもありますよ。
もうそのステージは完了してしまったみたいですが
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/6/1 14:14
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
GIJOEさん、こんにちは。

早速、エールをいただきありがとうございます。

引用:
実は動作を見たこともありませんでした。
なるほど、結構面白そうなモジュールなんですね。
mixiライクな操作感なので、初めての人でも簡単なことや、外部ブログ表示なども面白いところです。 この外部ブログ機能をカテゴリ毎に設定できるようになれば、活用の幅がかなり広がりそうです。
(一方で、重くならないようにしないといけないので、思案のしどころです。)

引用:
作っていく上での疑問点がありましたら、なんなりとどうぞ。
ありがとうございます。
いくつか相談に乗っていただきたいこともありますので、追々、投稿します。

引用:
あと、D3モジュールを作る上での有用なリンクとしては、tokitaさんのD3モジュールジェネレータ、なんてのもありますよ。
もうそのステージは完了してしまったみたいですが
おっと、以前聞いたような記憶が脳裏をかすめました。。 残念。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/6/7 11:46 | 最終変更
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
GIJOEさん、こんにちは。

d3diaryのほう、右往左往しながら進めています。 インポート機能も実装できました。
(テスト版の段階にも関わらずダウンロード・テスト協力いただいている方々、ありがとうございます)

悩んでいるのは、いつものごとくd3comment統合の関係です。
d3diary内部の問題は解決しているのですが、d3forum側の表示をどうにかできないか、という悩みです。

【背景】
d3diaryでは、minidiaryで実装されていた、ユーザー毎に設定できていた訪問者への閲覧権限(ゲスト許可/不許可/XSNS友人まで/XSNS友人の友人まで)を、更に記事単位で設定可能としています。

この状態でコメント統合すると、完全にコメント閲覧権限規制を行うためには、コメントの元記事ごとに権限チェックを行う必要があります。

minidiaryでd3コメントハックを行った際には、ソース部分には極力手を入れずにテンプレート側でxugJ_blockでカスタムソースを呼ぶような実装をしていましたが、今回はその方法では非効率なため、xoopsコメントの読み出しと同様にソース側で直接d3forumのテーブルにクエリを実行するようにしたところです。

これでd3diary側の表示コントロールは出来ましたし、コメント統合クラスにも表示時に閲覧権限がない場合にリダイレクトするようにしていますが、d3forum側のトピック一覧表示ではコメントタイトル表示に閲覧権限制御が効かないことに気付きました。 (気付くの遅すぎ、ですね。。)

d3forumからモジュール側に、コメント閲覧権限の問い合わせを行う仕組みを組み込む妙案がありましたら、ご教示いただけますでしょうか。
最悪、d3forumのテンプレートでそのフォーラムだけ非表示にしてしまうという手もあるのですが、折角統合したトピックリストを活用できたらと思っています。

よろしくお願いします。 

【追記】
 もう一点、追記ですみません。
d3pipesのブロックジョイントです。d3diary用のジョイントはd3diaryのブロックを参照させますので権限に問題なくできたのですが、 コメント統合先のd3forum用のD3pipesBlockD3forumtopics.class.php でも元記事閲覧権限を連動させたいと考えています。
 タイトルリンクをクリックしても閲覧権限なしでリダイレクトされますが、これをそのままRDF配信するのには抵抗があります。 この場合は、やはり専用のジョイントを作成するしかないでしょうか。 d3diaryとd3forumのジョイントを眺めてみても、どういう風に実現すれば良いのかイメージがでてきません。。
 もし、前記したd3forum側からモジュール側に閲覧権限を参照するような方法があって、それが更にd3pipes用ジョントブロックにも使えるような、美味しい方法があれば最高なんですが。。

 うまい方法なんかなくて、ガシガシ書くべし! ということでしたら、それはそれで結構です。

***
以下、参考までに本日時点のd3diary側のコメントアサイン部分ソース。
openareaというフィールドに権限を設定し、関数「d3diary_check_permission2」で権限チェックを行います。

function d3diary_assign_commentlist($mydirname, $req_uid, $uid, $maxnum=30){
	global $xoopsDB, $xoopsTpl,$myts, $xoopsModuleConfig;
	
	// module id
	$module_handler =& xoops_gethandler('module');
	$this_module =& $module_handler->getByDirname($mydirname);
	$mid = $this_module->getVar('mid');

	$com_dirname = $xoopsModuleConfig['comment_dirname'];
	$com_forum_id = intval($xoopsModuleConfig['comment_forum_id']);
	

	// at first, get recent diary's bid
    	if (intval($req_uid)>0) $whr_uid="WHERE d.uid=".intval($req_uid);
    
	$sql = "SELECT d.bid, d.uid, d.create_time, d.openarea AS openarea_entry, c.openarea as openarea
			  FROM ".$xoopsDB->prefix($mydirname.'_diary')." d LEFT JOIN "
			  .$xoopsDB->prefix($mydirname.'_config')." c ON d.uid=c.uid "
	         .$whr_uid." ORDER BY d.create_time DESC LIMIT 0,50"; // get recent max.50 entries
	
	$result = $xoopsDB->query($sql);
	while ( $dbdat = $xoopsDB->fetchArray($result) ) {
		if(d3diary_check_permission2($mydirname, $dbdat['uid'], $uid, $dbdat['openarea'], $dbdat['openarea_entry']) == true){
			$bids[]=$dbdat['bid'];
		}
	}

    	if($com_dirname && ($com_forum_id > 0)){
    	// d3comment integration
    
		$whr_forum = 'f.forum_id='.$com_forum_id ;
		$whr_bid=" t.topic_external_link_id IN (".implode(',',$bids).")";
		$q_order = 'p.post_time DESC';

		$sql = "SELECT p.post_id, p.subject, p.post_time, p.post_text, p.uid, p.guest_name, u.uname,
			f.forum_id, f.forum_title, t.topic_external_link_id FROM "
			.$xoopsDB->prefix($com_dirname."_posts")." p LEFT JOIN "
			.$xoopsDB->prefix($com_dirname."_topics")." t ON p.topic_id=t.topic_id 	LEFT JOIN "
			.$xoopsDB->prefix($com_dirname."_forums")." f ON f.forum_id=t.forum_id 	LEFT JOIN "
			.$xoopsDB->prefix('users')." u ON p.uid=u.uid 
			WHERE ! t.topic_invisible AND ($whr_forum) AND ($whr_bid) ORDER BY $q_order LIMIT 0,".$maxnum;

		$result = $xoopsDB->query($sql);
		while ( $dbdat = $xoopsDB->fetchArray($result) ) {
			$yd_comment['com_id']  =  $dbdat['post_id'];
			$yd_comment['title'] = $myts->makeTboxData4Show(mb_substr($dbdat['subject'],0,20));
			$yd_comment['year']  = date("Y", $dbdat['post_time']);
			$yd_comment['month'] = date("m", $dbdat['post_time']);
			$yd_comment['day']   = date("d", $dbdat['post_time']);
			$yd_comment['time']  = date("H:i", $dbdat['post_time']);
			$yd_comment['bid']  =  $dbdat['topic_external_link_id'];
			if ($dbdat['uid']) {
				$yd_comment['uname']  =  $dbdat['uname'];
			} else {
				$yd_comment['uname']  =  $dbdat['guest_name'];
			}
			$xoopsTpl->append("yd_comment", $yd_comment);
		}
			$xoopsTpl->assign("yd_com_key", "#post_id");

    	} else {
    	//xoops comment
    
		$whr_bid=" or com_itemid IN (".implode(',',$bids).")";

		$sql2 = "SELECT com.com_id, com.com_title, com.com_created, diary.bid, usr.uname
			  FROM ".$xoopsDB->prefix('xoopscomments')." com,
			   ".$xoopsDB->prefix('users')." usr,
			   ".$xoopsDB->prefix($mydirname.'_diary')." diary
	          	WHERE com.com_modid='".$mid."' and com.com_uid=usr.uid and com.com_itemid=diary.bid and (0 "
	          	.$whr_bid." ) ORDER BY com_created DESC LIMIT 0,".$maxnum; // 最近30件分のコメント

		$result = $xoopsDB->query($sql2);
		while ( $dbdat = $xoopsDB->fetchArray($result) ) {
			$yd_comment['com_id']  =  $dbdat['com_id'];
			$yd_comment['title'] = $myts->makeTboxData4Show(mb_substr($dbdat['com_title'],0,20));
			$yd_comment['year']  = date("Y", $dbdat['com_created']);
			$yd_comment['month'] = date("m", $dbdat['com_created']);
			$yd_comment['day']   = date("d", $dbdat['com_created']);
			$yd_comment['time']  = date("H:i", $dbdat['com_created']);
			$yd_comment['bid']  =  $dbdat['bid'];
			$yd_comment['uname']  =  $dbdat['uname'];
			$xoopsTpl->append("yd_comment", $yd_comment);
		}
			$xoopsTpl->assign("yd_com_key", "#comment");
    	}

}

テンプレートの当該表示部分
<{section name=num loop=$yd_comment}>
<tr>
<td class="even" style="white-space:nowrap;width:200px;">
<img src="images/pencil.gif" border=0 />
<{$yd_comment[num].year}><{$smarty.const._MD_DATE_YEAR}><{$yd_comment[num].month}><{$smarty.const._MD_DATE_MONTH}>
<{$yd_comment[num].day}><{$smarty.const._MD_DATE_DAY}>&nbsp;<{$yd_comment[num].time}>
</td>
<td class="even" style="white-space:nowrap;">
<a href="<{$xoops_url}>/modules/<{$mydirname}>/index.php?page=detail&amp;bid=<{$yd_comment[num].bid}><{$yd_com_key}><{$yd_comment[num].com_id}>">
<{$yd_comment[num].title}></a> (<{$yd_comment[num].uname}>)
</td></tr>
<{/section}>
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/6/19 14:25 | 最終変更
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
こんにちは。

d3diaryの開発、以下の新機能を同梱し、リリース間近まで漕ぎ着けました。

 d3diary開発日記


1、 minidiary、d3diaryからのインポート機能(報告済)
2、 記事毎の権限設定(外部公開/内部/友人の友人まで/友人まで) (報告済)
  追加で「下書き」機能を盛込み。
3、 友人機能モジュール連携先として、XSNSのほか、myfriendsモジュールを選択可能とした。
4、 カテゴリ毎の外部ブログ表示機能
5、 記事執筆者(ブロガー)指定の、本文と統合コメントのイベント通知機能。 (xoopsコメントは今のところ通知できず・・)
6、 カテゴリ毎にRSS配信
7、 タグ機能。氷川kilicaさんのモジュールを参考にさせていただきました。 どうもありがとうございます。
8、 本ツリーの別コメントで言及した、d3pipesのコメント統合ブロックジョイントを追加。 この際、d3diary元記事権限に連動した統合コメントのみを表示する、postsブロック、topicsブロックもd3diary側に追加実装し、それを参照することで元記事権限に連動させました。 (ブロックジョイント1つでtopics/postsを選択する方法としてみました)
9、 携帯用テンプレート編集、ほぼ終了。 (テスト版をモジュール本体パッケージに同梱済み。リリース後はモバイルテンプハウスで配布予定)
10、(追記)言語はjapaneseのほか、utf-8に対応済。englishも手元では作成済み、次回の版で同梱。

 以上、当初検討していた機能はほぼ網羅しましたので、あとはバグを潰して正式リリースしたいと思います。

 また、以下の件が懸案として残っておりますので、識者の方、どうぞご教示ください。

A)上記5、のブロガー指定イベント通知の、xoopsコメントの通知における、日記記事本文の閲覧権限フィルターの実装方法。 d3コメント統合の場合は、d3diaryのコメント統合クラス内の onupdateメソッド内でキャッチし、権限チェック後、Altsysのイベント通知プロシジャをコールする方法を取っています。
 これを、xoopsコメントで実現する方法があればご教示いただけますでしょうか。

B)本ツリー内の別投稿で相談させていただいた、d3forumメインページ表示topics一覧への、統合元モジュール閲覧権限フィルターの実装方法。 

C)グローバル検索をかけた時の、検索コメントの統合元モジュール閲覧権限フィルターの実装方法。 

以上です。 特に大きな問題が出なければ、このまま今月中にリリースする予定です。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/6/20 17:00 | 最終変更
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
懸案3件のうちの、1件 
「B:d3forumメインページ表示topics一覧への、統合元モジュール閲覧権限フィルターの実装」を片付けました。

ただ、これはd3forumのハック無しにはできないうえ、あまりに場当たり的な気がしますので、GIJOEさんへのご意見伺い・ご相談ということでお願いします。

1、「D3commentAbstract.class.php」
 このクラスに、function canDisplay を追加定義します。

function needApprove の下あたりに以下を追記。
// can display
// override it if necessary
function canDisplay( $link_id , $original_flag )
{
	return $original_flag ;
}

2、d3diaryのコメント統合クラス「d3diaryD3commentContent.class.php」
function canDisplay( $link_id , $original_flag )
{	//(d3diaryの元記事権限チェック。ここでは詳細は省略します)
		if( $permission != true ) {
			return false ;
		} else {
			return $original_flag ;
		}
}

3、d3forumのトピック一覧コントローラーと、テンプレート
(1)listtopics.php
・while( $topic_row ループの外
	// d3comment object
	if( ! empty( $forum_row['forum_external_link_format'] ) ) $d3com =& d3forum_main_get_comment_object( $mydirname , $forum_row['forum_external_link_format'] ) ;
	else $d3com = false ;
・ループの中
	// d3comment overridings
	if( is_object( $d3com ) ) $can_display = $d3com->canDisplay( $topic_row['topic_external_link_id'] , true ) ;
	else $can_display = true;
 :(略)
$topics[] = array(
		'can_display' => intval( $can_display ) ,
 :(略)
	) ;

(2)listtopics_over_categories.php
・while( $topic_row ループの外
// get all "forum"s
$sql = "SELECT forum_id, forum_external_link_format FROM ".$db->prefix($mydirname."_forums") ;
$frs = $db->query( $sql ) ;
$d3com = array() ;
while( $forum_row = $db->fetchArray( $frs ) ) {
	// d3comment object
	$temp_forum_id = intval($forum_row['forum_id']);
	if( ! empty( $forum_row['forum_external_link_format'] ) ) $d3com[$temp_forum_id] =& d3forum_main_get_comment_object( $mydirname , $forum_row['forum_external_link_format'] ) ;
	else $d3com[$temp_forum_id] = false ;
}
・ループの中
	// d3comment overridings
	if( is_object( $d3com[intval($topic_row['forum_id'])] ) ) $can_display = $d3com[intval($topic_row['forum_id'])]->canDisplay( $topic_row['topic_external_link_id'] , true ) ;
	else $can_display = true;
// topics array
$topics[] = array(
 :(略)
		'can_display' => intval( $can_display ) ,
	) ;

(3)main_listtopics.html, main_listtopics_over_categories.html
<{foreach item=topic from=$topics}>
  <{if $topic.can_display}>
 :(略)
  <{/if}>
<{/foreach}>

以上で、テストサイトでは無事にフィルタリングできています。 ご指導よろしくお願いします。

また、残る懸案A、Cについても引き続きお願いします。

(追伸)
統合コメントブロックについては、d3diary専用に元記事権限フィルタ済みブロックを作っていましたが、 他の掲示板とのアグリゲーション表示をしたい場合の対応を、下記のページにまとめました。
[d3diary] d3forumトピックブロックとの集約表示

(訂正)その後、この部分もd3diaryブロックのほうに機能を取り込みました。
d3diary開発日記/2009-06-22 統合コメント表示ブロックの改良

d3forumのブロックではできなかった、categoryとforumのOR指定を可能としてみました。どちらか片方だけ入力すると、他方は無視、両方入力でOR条件、両方空欄で全forumが対象となります。
forumの閲覧権限フィルターも通す必要があるので、ロジックが面倒でしたが、d3diary元記事権限の分だけ複雑になったSQLを少し整理できました。 d3forumのテーブルにはクエリ一発で検索しています。

合わせてご確認いただければ幸いです。

(運用中サイト)
テストサイトではなく、以下の実運用中のサイトで、フルバージョンで使用中です。 
 塩ビ管スピーカー別館
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/6/30 0:15 | 最終変更
naao  Commander 居住地: 2006年10月頃~  投稿数: 509
先ほど、正式にリリースしました。

d3diary

携帯用テンプレートも、モバイルテンプハウスにアップ済みです。

今後のバグ報告等は、XUGJの掲示板か、 なーお'nWEBのd3diaryサポート板まで、お願いします。
投票数:0 平均点:0.00
  条件検索へ

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