1: 2009-05-24 (日) 10:25:27 なーお  |
現: 2019-08-17 (土) 07:11:56 なーお  |
- | * XSNSモジュールの新着トピックで新着コメントを取得したい [#t844a559] | + | * XSNSモジュールのd3pipesジョイントで新着コメント本文を取得したい [#t844a559] |
- | XSNSモジュールを使用させていただいています。 | + | XSNSモジュール-1.1.1を使用させていただいています。 |
| 本格的に使い始めたところで、ちょっと問題に直面しまして解決させたので、役に立つ場面もあるかと思い、記事にしておきます。 | | 本格的に使い始めたところで、ちょっと問題に直面しまして解決させたので、役に立つ場面もあるかと思い、記事にしておきます。 |
| | | |
| ** 概要 [#if89ed49] | | ** 概要 [#if89ed49] |
- | - XSNSで新着トピブロックを使ったとき、ブロックに表示される新着リンクをクリックしても、トピックの頭の説明にジャンプします。mixiでもトピの頭に飛ぶので同様の仕様と言えなくもありませんが、これを最新記事にジャンプさせたいと思いました。 | + | - XSNSで新着トピブロックを使ったとき、ブロックに表示される新着リンクをクリックしても、トピックの頭の説明にジャンプします。mixiでもトピの頭に飛ぶので同様の仕様と言えますが、これを最新記事にジャンプさせたいと思いました。 |
| - XSNSのd3pipesブロックジョイントクラス「D3pipおesBlockXsnstopiclist.class.php」で取得するトピックの本文が、最新のコメントではなく、毎回トピ説明が同じように繰り返されます。 ここはやはり、「新着コメント」のほうの本文を通知してほしいものです。 | | - XSNSのd3pipesブロックジョイントクラス「D3pipおesBlockXsnstopiclist.class.php」で取得するトピックの本文が、最新のコメントではなく、毎回トピ説明が同じように繰り返されます。 ここはやはり、「新着コメント」のほうの本文を通知してほしいものです。 |
| | | |
| | | |
| ** 問題の箇所 [#p67a389b] | | ** 問題の箇所 [#p67a389b] |
| + | 以下の説明は私も勉強しながら知った身なので言うことが間違っているかもしれません。 |
| + | 下のSQL文で、GROUP BY tidでトピックIDでグループ化して抽出、MAX(tc.number)、MAX(tc.r_datetime)で各最大値を取得する、までは良いのですが、そこに様々な他のフィールドを検索取得するような指定を並べてます。 |
| + | この方法は、[[結果を保証されない方式であるとの情報:http://q.hatena.ne.jp/1213899211#a836594]]もありますし、最新コメントのbodyが得られそうで実際には得られていません。 |
| + | |
| 「(trust)/modules/blocks/block_functions.php」の25行目付近 | | 「(trust)/modules/blocks/block_functions.php」の25行目付近 |
| #code(php,25-){{ | | #code(php,25-){{ |
| }} | | }} |
| | | |
- | なお、以下の説明は私も勉強しながら知った身なので言うことが間違っているかもしれません。 | + | ** 改善案 [#v759a24d] |
- | | + | |
- | 上のSQL文で、GROUP BY tidでトピックIDでグループ化して抽出、MAX(tc.number)、MAX(tc.r_datetime)で各最大値を取得する、までは良いのですが、そこに様々な他のフィールドを検索取得するような指定を並べてます。 | + | |
- | この方法は、[[結果を保証されない方式であるとの情報:http://q.hatena.ne.jp/1213899211#a836594]]もありますし、最新のsubjectが得られそうで実際には得られていません。 | + | |
| そこで、自分なりに見やすいクエリ2つに分割しました。 | | そこで、自分なりに見やすいクエリ2つに分割しました。 |
| + | また、飛び先のURLのトピ内コメントアンカー番号にジャンプするようにしてあります。 :-) |
| + | (&font(Red){090525修正};:リンク先にページ開始番号が抜けていたので追加しました。) |
| | | |
| #code(php,1-){{ | | #code(php,1-){{ |
| { | | { |
| global $xoopsUser, $xoopsUserIsAdmin; | | global $xoopsUser, $xoopsUserIsAdmin; |
| + | |
| require_once dirname(dirname(__FILE__)).'/include/common_functions.php'; | | require_once dirname(dirname(__FILE__)).'/include/common_functions.php'; |
| + | |
| $db =& Database::getInstance(); | | $db =& Database::getInstance(); |
| $myts =& MyTextSanitizer::getInstance(); | | $myts =& MyTextSanitizer::getInstance(); |
| + | |
| $mydirname = empty($options[0]) ? 'xsns' : $options[0]; | | $mydirname = empty($options[0]) ? 'xsns' : $options[0]; |
| $item_limit = empty($options[1]) ? 5 : intval($options[1]); | | $item_limit = empty($options[1]) ? 5 : intval($options[1]); |
| + | |
| if( preg_match( '/[^0-9a-zA-Z_-]/' , $mydirname ) ) die( 'Invalid dirname' ) ; | | if( preg_match( '/[^0-9a-zA-Z_-]/' , $mydirname ) ) die( 'Invalid dirname' ) ; |
| + | |
| $constpref = '_MB_'.strtoupper($mydirname); | | $constpref = '_MB_'.strtoupper($mydirname); |
| + | |
| $block = array(); | | $block = array(); |
| $perm_arr = array(); | | $perm_arr = array(); |
| + | |
| $own_uid = is_object($xoopsUser) ? $xoopsUser->getVar('uid') : -1; | | $own_uid = is_object($xoopsUser) ? $xoopsUser->getVar('uid') : -1; |
| + | |
| // naao from | | // naao from |
| //各トピの最新コメントIDを取得 | | //各トピの最新コメントIDを取得 |
| return array(); | | return array(); |
| } | | } |
| + | |
| while ( $dbdat = $db->fetchArray($result)){ | | while ( $dbdat = $db->fetchArray($result)){ |
- | $com_num[] = $dbdat['com_id']; | + | $com_num[] = intval($dbdat['com_id']); |
| } | | } |
| | | |
| " ORDER BY r_datetime DESC"; | | " ORDER BY r_datetime DESC"; |
| // naao to | | // naao to |
| + | |
| $rs = $db->query($sql); | | $rs = $db->query($sql); |
| if(!$rs || $db->getRowsNum($rs) < 1){ | | if(!$rs || $db->getRowsNum($rs) < 1){ |
| return array(); | | return array(); |
| } | | } |
| + | |
| $today = date('Y-m-d'); | | $today = date('Y-m-d'); |
| $item_count = 0; | | $item_count = 0; |
| require_once dirname(dirname(__FILE__)).'/userlib/utils.php'; | | require_once dirname(dirname(__FILE__)).'/userlib/utils.php'; |
| + | |
| while($row = $db->fetchArray($rs)) { | | while($row = $db->fetchArray($rs)) { |
| + | |
| if($item_limit <= $item_count){ | | if($item_limit <= $item_count){ |
| break; | | break; |
| } | | } |
| + | |
| // check community permission | | // check community permission |
| if($row['cflag']==3 && !$xoopsUserIsAdmin && $row['cadmin']!=$own_uid && $row['csubadmin']!=$own_uid){ | | if($row['cflag']==3 && !$xoopsUserIsAdmin && $row['cadmin']!=$own_uid && $row['csubadmin']!=$own_uid){ |
| } | | } |
| } | | } |
| + | |
| //$date_arr = explode(' ', XsnsUtils::getUserDatetime($row['max_r_datetime']), 2); | | //$date_arr = explode(' ', XsnsUtils::getUserDatetime($row['max_r_datetime']), 2); |
| $date_arr = explode(' ', XsnsUtils::getUserDatetime($row['r_datetime']), 2); //naao | | $date_arr = explode(' ', XsnsUtils::getUserDatetime($row['r_datetime']), 2); //naao |
| $r_time = $r_time_arr[1]. constant($constpref.'_MONTH'). $r_time_arr[2]. constant($constpref.'_DAY'); | | $r_time = $r_time_arr[1]. constant($constpref.'_MONTH'). $r_time_arr[2]. constant($constpref.'_DAY'); |
| } | | } |
| + | |
| + | $comment_index = intval(intval($row['comment_count'])/20)*20; //naao |
| + | |
| $block['topic_list'][] = array( | | $block['topic_list'][] = array( |
- | 'link' => XOOPS_URL.'/modules/'.$mydirname.'/?p=topic&tid='.intval($row['tid']).'#'.intval($row['comment_count']), //naao | + | 'link' => XOOPS_URL.'/modules/'.$mydirname.'/?p=topic&tid='.intval($row['tid']).'&s='.$comment_index.'#'.intval($row['comment_count']), //naao |
| 'title' => $myts->htmlSpecialChars($row['tname']), | | 'title' => $myts->htmlSpecialChars($row['tname']), |
| 'body' => $myts->htmlSpecialChars($row['tcbody']), | | 'body' => $myts->htmlSpecialChars($row['tcbody']), |
| ), | | ), |
| ); | | ); |
| + | |
| $item_count++; | | $item_count++; |
| } | | } |
| + | |
| if(empty($options['disable_renderer'])){ | | if(empty($options['disable_renderer'])){ |
| require_once XOOPS_ROOT_PATH.'/class/template.php' ; | | require_once XOOPS_ROOT_PATH.'/class/template.php' ; |
| } | | } |
| }} | | }} |
| + | |
| + | ** その他 [#qd1d6611] |
| + | コメントを編集したときに、トピックの更新日時も更新されてしまいます。 これは考え方の違いだと思うのですが、ユーザーがタイプミスを修正したり追記をしたりした時でも更新と判断されてしまいますので、私は「edit_execAction.php」の当該箇所をコメントアウトしました。 103行目付近と、121行目付近の |
| + | |
| + | //'r_datetime' => $r_datetime, // naao 編集時に、トピ日時を更新しない |
| + | |
| + | ただ、これは現状の仕様のほうが適切なのかもしれず、何とも悩ましいところですね。 |