Joomler!.net - Decided on Joomla!

デル株式会社

Jboard is Multiple Board!

Home » Blog » $numtopics
0 votes
Written by:Joomler! 7451 hits Saturday, 15 December 2007 17:01

Fireboardで変更したところ

  • 最近の投稿に表示される記事自体が、Latest Single Subject(単独題名を表示)を有効にしていると同じ題名内ではソートされないのでおかしいです。
  • 最近の投稿のリンクや、最新の投稿のリンクをクリックしてもページをまたぐ場合はその記事に直接飛ばない。
  • 最近の投稿のリンクをクリックしても返信の場合、ヒット数がカウントされない。

ということで変更してみました。

ROOT/components/com_fireboard/template/default/plugin/recentposts/recentposts.php

93~107行目付近

$query = " SELECT u.id, ifnull(u.username, 'Guest') as username, ifnull(u.name,'Guest') as name," . " fb.subject, fb.id as fbid, fb.catid, from_unixtime(fb.time) as date, " . " fb.hits, fb.locked,fb.topic_emoticon, fb.parent, sc.name as catname " . " FROM #__fb_messages AS fb " . " LEFT JOIN #__users AS u ON u.id = fb.userid" . " INNER JOIN #__fb_categories sc on sc.id = fb.catid " . " WHERE " . ($category == '' ? "1=1 " : "(fb.catid IN ($category) or sc.parent IN ($category))") . " AND (sc.pub_access<=$group_id) " . ($replysubject ? "" : " AND fb.parent=0 ") . " AND (sc.published=1)" . ($singlesubject ? " GROUP BY fb.subject" : "") . " ORDER BY fb.time DESC" . " LIMIT $count";

を(MySQLのバージョンがたぶん5以上の場合)

if($singlesubject){
 $query ="SELECT u.id, ifnull(u.username, 'Guest') as username, ifnull(u.name,'Guest') as name, fb.subject, fb.id as fbid, fb.catid, from_unixtime(fb.time) as date, fb.time, fb.thread, fb.hits, fb.locked,fb.topic_emoticon, fb.parent, sc.name as catname"
 . "\n FROM (SELECT * FROM #_fb_messages  ORDER BY time DESC ) AS fb"
 . "\n LEFT JOIN #_users AS u ON u.id = fb.userid"
 . "\n INNER JOIN #_fb_categories sc on sc.id = fb.catid"
 . "\n WHERE ". ($category == '' ? "1=1 " : "(fb.catid IN ($category) or sc.parent IN ($category))"). " AND (sc.pub_access<=0) AND (sc.published=1)". ($replysubject ? "" : " AND fb.parent=0 ")
 . "\n GROUP BY fb.subject"
 . "\n ORDER BY fb.time DESC LIMIT $count"
 ;
} else {
 $query
 = " SELECT u.id, ifnull(u.username, 'Guest') as username, ifnull(u.name,'Guest') as name,"
 . "   fb.subject, fb.id as fbid, fb.catid, from_unixtime(fb.time) as date, fb.time, fb.thread, "
 . "   fb.hits, fb.locked,fb.topic_emoticon, fb.parent, sc.name as catname "
 . " FROM #__fb_messages AS fb "
 . " LEFT JOIN #__users AS u ON u.id = fb.userid"
 . " INNER JOIN #__fb_categories sc on sc.id = fb.catid "
 . " WHERE "
 . ($category == '' ? "1=1 " : "(fb.catid IN ($category) or sc.parent IN ($category))")
 . "  AND (sc.pub_access<=$group_id) "
 . ($replysubject ? "" : " AND fb.parent=0 ")
 . "  AND (sc.published=1)"
 . " ORDER BY fb.time DESC"
 . " LIMIT $count";
}

へ。
注:この変更は、MySQLのバージョン(古い)では、動きません。 対応しないバージョンの方(うちのサーバーもそうです。MySQL4.0.27かな)は、下記にすること。

異なる部分のみしか書いていませんでしたので訂正しました。

if($singlesubject){
        $query = "SELECT MAX(fb.id) AS id FROM #__fb_messages AS fb"
        . "\n INNER JOIN #__fb_categories AS sc ON sc.id = fb.catid"
        . "\n WHERE ". ($category == '' ? "1=1 " : "(fb.catid IN ($category) or sc.parent IN ($category))")
        . "\n AND (sc.pub_access<=$group_id) ". ($replysubject ? "" : " AND fb.parent=0 "). "  AND (sc.published=1)"
        . "\n GROUP BY fb.subject"
        . "\n LIMIT $count";
        $database->setQuery($query);
        $J_ids = $database->loadResultArray();
        $J_IDquery = '';
        if(!empty($J_ids)){
                $J_IDquery = "\n WHERE fb.id IN(". implode(',', $J_ids). ")";
        }
        $query ="SELECT u.id, ifnull(u.username, 'Guest') as username, ifnull(u.name,'Guest') as name, fb.subject, fb.id as fbid, fb.catid, from_unixtime(fb.time) as date, fb.time, fb.thread, fb.hits, fb.locked,fb.topic_emoticon, fb.parent, sc.name as catname"
        . "\n FROM #__fb_messages AS fb"
        . "\n LEFT JOIN jos_users AS u ON u.id = fb.userid"
        . "\n INNER JOIN jos_fb_categories sc on sc.id = fb.catid"
        . $J_IDquery
        . "\n ORDER BY fb.time DESC"
        ;
} else {
 $query
 = " SELECT u.id, ifnull(u.username, 'Guest') as username, ifnull(u.name,'Guest') as name,"
 . "   fb.subject, fb.id as fbid, fb.catid, from_unixtime(fb.time) as date, fb.time, fb.thread, "
 . "   fb.hits, fb.locked,fb.topic_emoticon, fb.parent, sc.name as catname "
 . " FROM #__fb_messages AS fb "
 . " LEFT JOIN #__users AS u ON u.id = fb.userid"
 . " INNER JOIN #__fb_categories sc on sc.id = fb.catid "
 . " WHERE "
 . ($category == '' ? "1=1 " : "(fb.catid IN ($category) or sc.parent IN ($category))")
 . "  AND (sc.pub_access<=$group_id) "
 . ($replysubject ? "" : " AND fb.parent=0 ")
 . "  AND (sc.published=1)"
 . " ORDER BY fb.time DESC"
 . " LIMIT $count";
}


ここからは、どのバージョンでも必要です。

さらに同じく176行目付近

$link = sefRelToAbs("index.php?option=com_fireboard&func=view&id=$row->fbid" . "&catid=$row->catid#$row->fbid");


$J_limitquery = '';
$database->setQuery( "SELECT COUNT(id) FROM #__fb_messages WHERE  thread = $row->thread AND time < ($row->time+1)" );
$J_count = $database->loadResult();
$J_limit = (int)$fbConfig['messages_per_page'];
if($J_limit < $J_count){
 $J_limitstart = (int)((int)($J_count / $J_limit ) * $J_limit );
 if($J_limitstart == $J_count){
  $J_limitstart = $J_limitstart - $J_limit;
 }
 $J_limitquery = "&limit=$J_limit&limitstart=$J_limitstart";
}
$link = sefRelToAbs("index.brush:php;?option=com_fireboard&func=view&id=$row->fbid" . "&catid=$row->catid$J_limitquery"). "#$row->fbid";

へ。
そしてさらに
ROOT/components/com_fireboard/template/default/listcat.php

177行目

$database->setQuery("SELECT c.*,m.subject, mm.catid as lastcat, m.name as mname, m.userid, u.username, u.name as uname FROM #__fb_categories as c


$database->setQuery("SELECT c.*,m.subject, m.thread as thread, mm.catid as lastcat, m.name as mname, m.userid, u.username, u.name as uname FROM #__fb_categories as c

へ。さらに548行目~付近

if ($numtopics != 0) { ?> <td class = "td-5" align="left"> <div class = "<?php echo $boardclass ?>latest-subject fbm"> <a href = "<?php echo sefRelToAbs(JB_LIVEURLREL.'&func=view&catid='.$singlerow->lastcat.'&id='.$latestid).'#'.$latestid;?>"><?php echo $latestsubject; ?></a> </div>


if ($numtopics != 0)
{
 $J_limitquery = '';
 $database->setQuery( "SELECT COUNT(id) FROM #__fb_messages WHERE  thread = $singlerow->thread" );
 $J_count = $database->loadResult();
 $J_limit = (int)$fbConfig['messages_per_page'];

 if($J_limit < $J_count){
    $J_limitstart = (int)((int)($J_count / $J_limit ) * $J_limit );
    if($J_limitstart == $J_count){
   $J_limitstart = $J_limitstart - $J_limit;
    }
  $J_limitquery = "&limit=$J_limit&limitstart=$J_limitstart";
 }

?>

 <td class = "td-5" align="left">
  <div class = "<?brush:php; echo $boardclass ?>latest-subject fbm">
   <a href = "<?brush:php; echo sefRelToAbs(JB_LIVEURLREL.'&func=view&catid='.$singlerow->lastcat.'&id='.$latestid. $J_limitquery).'#'.$latestid;?>"><?brush:php; echo $latestsubject; ?></a>
  </div>

へ。

最後に
ROOT/components/com_fireboard/template/default/view.php
123行目付近

if ($this_message->userid != $my->id) { $database->setQuery("UPDATE #__fb_messages SET hits=hits+1 WHERE id=$thread AND parent=0"); $database->query(); }


if ($this_message->userid != $my->id) {
 $database->setQuery("UPDATE #__fb_messages SET hits=hits+1 WHERE id=$this_message->id AND thread=$thread");
 $database->query();
}

へ。

などと変更してみました。

書き忘れがあるかもしれない・・・。

抜けてるところや間違い、もっと良い方法など求む。

 

JContentPlus for Joomla!1.5 powered by Joomler!.net

デル株式会社
joomler.net is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla!(R) name is used under a limited license from Open Source Matters in the United States and other countries.
joomler.net is not affiliated with or endorsed by Open Source Matters or the Joomla! Project.