2012年6月29日金曜日

編集時 カテゴリーを変更するとcategory_id.ini.phpがおかしくなる対処

ppBlog 1.8.8


色々とテストなどを行ってinclude_onceが問題なのかもとおもいつつ直接の原因は
utils_admin.phpの292行目あたりの
$CATEGORY_ID[$i] = "$cat|".implode(',', array_filter(explode(',', $ids)));
この赤字の$cat部分。
ここでカテゴリ名だけで書き換えて保存しちゃっているのでアウトでした。
$CATEGORY_ID[$i] = "$_cat|".implode(',', array_filter(explode(',', $ids)));
正しくは$_catで引っ張ってきている元の形で書き込めばいいのです。(直後のロジックでもそうなってる)
やってることはわかるのですが変数名をアンダースコアを多用して混乱を招きやすい変数名で子チョコちょやってるとよくある罠ですね(笑)

しかしinclude_onceの弊害がはっきり出ていないのでコードを修正したままにするかどうか悩みどころですが今回書き換えた部分は
utils_admin.php 277行目あたりのところと
 if($mode=='update' || is_numeric($ontime)){  # 編集後
  //////
  //include_once ($cat_id); // get::$CATEGORY_ID
  include($cat_id); // get::$CATEGORY_ID
  //////
  $index = get_article_index($id, $orgLINES);
  list(,$cat,) = explode('|', $orgLINES[$index], 3);
  if($cat != $category){ // カテゴリーの変更あり
   foreach ($CATEGORY_ID as $i => $catid){
    list($_cat, $ids) = explode('|', $catid);
    list($__cat,) = explode("\t", $_cat);
    if(strpos($catid, $org_id)){
     $ids = str_replace($org_id, '', $ids);
     //////
     //$CATEGORY_ID[$i] = "$cat|".implode(',', array_filter(explode(',', $ids)));
     $CATEGORY_ID[$i] = "$_cat|".implode(',', array_filter(explode(',', $ids)));
     //////
    }
    if($__cat == $category){
     $_ids = array_filter(explode(',', $ids)); array_push($_ids, $_id);
     $CATEGORY_ID[$i] = "$_cat|".implode(',', $_ids);
     }
同じくutils_admin.php最後のファンクション定義の949行あたり
 function make_category_id(){
 global $CATEGORY_LIST;
 $ini = OD.'category_id.ini.php';
 rewrite_ini($ini, '', '$CATEGORY_ID');
 $CATEGORY_ID = array();
 //////
 //include_once (OD.'category.ini.php');
 include(OD.'category.ini.php');
 //////
 foreach ($CATEGORY_LIST as $i => $line){
  list($_cat,) = explode('|', $line, 2);
  list($__cat, $catlink) = explode("\t", $_cat);
  $_articles = get_articles_by_category($__cat);
  $CATEGORY_ID[$i] = array();
  foreach ($_articles as $a){
   list($id,) = explode('|', $a, 2);
   $CATEGORY_ID[$i][] = $id;
  }
  $CATEGORY_ID[$i] = "$__cat\t$catlink".'|'.implode(",", $CATEGORY_ID[$i]);
 } #foreach
 rewrite_ini($ini, $CATEGORY_ID);
}
これでとりあえず記事更新時にカテゴリを変更しても対応できるようになりました。

残る部分としてはカテゴリ名を変更したときにcategory_id.ini.phpが更新されていないので内部的な不一致が起きているところでしょうか。ま、これも一旦category_id.ini.phpを削除して記事更新を行えば正しくなるので気になるまで放置しておきます。

0 件のコメント:

コメントを投稿