suinです。日本語で失礼します。
「カテゴリ同期」する際に、カテゴリの階層がいく層かにかさなると、上位カテゴリが持っている冗長情報のトピック数と投稿数の合計が、下位カテゴリの合計と合わなくなるようです。
大カテゴリ > 中カテゴリ > 小カテゴリ > フォーラム > トピック
このような構造で「カテゴリの同期」を実行すると、小カテゴリまでは冗長情報が同期されるものの、中カテゴリ・大カテゴリでは冗長情報が同期されずトピック数・投稿数ともに0のままです。
そこで include/transact_function.php を次のように直しました。
//修正前
// store redundant informations to a category from its forums
function d3forum_sync_category( $mydirname , $cat_id )
{
$db =& Database::getInstance() ;
$cat_id = intval( $cat_id ) ;
$sql = "SELECT MAX(forum_last_post_id),MAX(forum_last_post_time),SUM(forum_topics_count),SUM(forum_posts_count) FROM ".$db->prefix($mydirname."_forums")." WHERE cat_id=$cat_id" ;
if( ! $result = $db->query( $sql ) ) die( "ERROR SELECT forum in sync category" ) ;
list( $last_post_id , $last_post_time , $topics_count , $posts_count ) = $db->fetchRow( $result ) ;
if( ! $result = $db->queryF( "UPDATE ".$db->prefix($mydirname."_categories")." SET cat_topics_count=".intval($topics_count).",cat_posts_count=".intval($posts_count).", cat_last_post_id=".intval($last_post_id).", cat_last_post_time=".intval($last_post_time)." WHERE cat_id=$cat_id" ) ) die( _MD_D3FORUM_ERR_SQL.__LINE__ ) ;
return true ;
}
//修正後
// store redundant informations to a category from its forums
function d3forum_sync_category( $mydirname , $cat_id )
{
$db =& Database::getInstance() ;
$cat_id = intval( $cat_id ) ;
// get the all categories which belongs to this category.
$categories = d3forum_get_child_categories_for_sync($mydirname, $cat_id);
$categories[] = $cat_id;
$where = " `cat_id` IN (".implode(', ', $categories).") ";
$sql = "SELECT MAX(forum_last_post_id),MAX(forum_last_post_time),SUM(forum_topics_count),SUM(forum_posts_count) FROM ".$db->prefix($mydirname."_forums")." WHERE $where" ;
// $sql = "SELECT MAX(forum_last_post_id),MAX(forum_last_post_time),SUM(forum_topics_count),SUM(forum_posts_count) FROM ".$db->prefix($mydirname."_forums")." WHERE cat_id=$cat_id" ;
if( ! $result = $db->query( $sql ) ) die( "ERROR SELECT forum in sync category" ) ;
list( $last_post_id , $last_post_time , $topics_count , $posts_count ) = $db->fetchRow( $result ) ;
if( ! $result = $db->queryF( "UPDATE ".$db->prefix($mydirname."_categories")." SET cat_topics_count=".intval($topics_count).",cat_posts_count=".intval($posts_count).", cat_last_post_id=".intval($last_post_id).", cat_last_post_time=".intval($last_post_time)." WHERE cat_id=$cat_id" ) ) die( _MD_D3FORUM_ERR_SQL.__LINE__ ) ;
return true ;
}
function d3forum_get_child_categories_for_sync($mydirname, $cat_id, &$categories = array())
{
$db =& Database::getInstance();
$cat_id = intval($cat_id);
$sql = "SELECT cat_id FROM ".$db->prefix($mydirname."_categories")." WHERE pid=$cat_id" ;
if( !$result = $db->query($sql) ) {
die("ERROR SELECT cat_id in sync category.");
}
while ( list($cat_id) = $db->fetchRow($result) ) {
$categories[] = $cat_id;
d3forum_get_child_categories_for_sync($mydirname, $cat_id, $categories);
}
return $categories;
}
以上、ご報告までに書きました。
suinさん、こんにちは。お久しぶりです。
ようやくこれにレスポンスをつけられます
Quote:
suin wrotes:
「カテゴリ同期」する際に、カテゴリの階層がいく層かにかさなると、上位カテゴリが持っている冗長情報のトピック数と投稿数の合計が、下位カテゴリの合計と合わなくなるようです。
大カテゴリ > 中カテゴリ > 小カテゴリ > フォーラム > トピック
このような構造で「カテゴリの同期」を実行すると、小カテゴリまでは冗長情報が同期されるものの、中カテゴリ・大カテゴリでは冗長情報が同期されずトピック数・投稿数ともに0のままです。
実はこれ、仕様だったりします。
例えば、categoriesテーブルにおける、cat_topics_count はあくまで、そのカテゴリー直下のトピック数です。(日本語ではトピック数)
サブカテゴリーも含めてすべて、という用途には、cat_topics_count_in_tree というフィールドを用意しています。(日本語では、総トピック数)
ただ、フィールドが用意してあっても、何もコードを書いてなかったので、suinさんの誤解は当然とも言えます。
0.84になってようやくこの部分のコードを書いたので、'_in_tree' をつけることで、サブカテゴリーも含めた冗長情報が同期されるようになってます。
テンプレートの方も、総トピック数を表示するようにしてみました。
これでsuinさんに指摘いただくような、見た目におかしな状況はなくなると思います。
どうもありがとうございました。