1: 2009-05-24 (日) 10:25:27 なーお ソース 現: 2019-08-17 (土) 07:11:56 なーお ソース
Line 1: Line 1:
-* 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」で取得するトピックの本文が、最新のコメントではなく、毎回トピ説明が同じように繰り返されます。 ここはやはり、「新着コメント」のほうの本文を通知してほしいものです。
Line 10: Line 10:
** 問題の箇所 [#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-){{
Line 34: Line 38:
}} }}
- なお、以下の説明は私も勉強しながら知った身なので言うことが間違っているかもしれません。 +** 改善案 [#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-){{
Line 45: Line 47:
{ {
    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を取得
Line 71: Line 73:
     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']);
    }     }
Line 100: Line 102:
     " 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){
Line 129: Line 131:
     }      }
     }      }
 +    
     //$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
Line 149: Line 151:
     $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']),
Line 164: Line 168:
     ),      ),
     );      );
 +    
     $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' ;
Line 180: Line 184:
} }
}} }}
 +
 +** その他 [#qd1d6611]
 + コメントを編集したときに、トピックの更新日時も更新されてしまいます。 これは考え方の違いだと思うのですが、ユーザーがタイプミスを修正したり追記をしたりした時でも更新と判断されてしまいますので、私は「edit_execAction.php」の当該箇所をコメントアウトしました。 103行目付近と、121行目付近の
 +
 + //'r_datetime' => $r_datetime, // naao 編集時に、トピ日時を更新しない
 +
 +ただ、これは現状の仕様のほうが適切なのかもしれず、何とも悩ましいところですね。


トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 1713, today: 1, yesterday: 0