mmochiです。
ちょっと気になったので調べました。
(メタタグあんまり触らないために知識が不足してたのでついでw)
まず、誤解の無いように先に書きますが、この症状はzen-deraさんのケータイパックにおけるバグではありません。
ZenCartデフォルトのバグです。下記の操作を行ってみてください。皆さん再現すると思います。
1.カテゴリのメタタグを全ての入力欄を空欄で登録する。
2.再度同一カテゴリのメタタグ欄を空欄で登録する。
3.デュプリケートエラー。
原因はadmin/categories.php 244行目付近 // bof: categories meta tags から // eof: categories meta tagsの間の記述です。
コード:
// bof: categories meta tags
case 'update_category_meta_tags':
// add or update meta tags
//die('I SEE ' . $action . ' - ' . $_POST['categories_id']);
$categories_id = $_POST['categories_id'];
if (zen_get_category_metatags_keywords($categories_id, (int)$_SESSION['languages_id']) or zen_get_category_metatags_description($categories_id, (int)$_SESSION['languages_id'])) {
$action = 'update_category_meta_tags';
} else {
$action = 'insert_categories_meta_tags';
}
$languages = zen_get_languages();
for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
$language_id = $languages[$i]['id'];
$sql_data_array = array('metatags_title' => zen_db_prepare_input($_POST['metatags_title'][$language_id]),
'metatags_keywords' => zen_db_prepare_input($_POST['metatags_keywords'][$language_id]),
'metatags_description' => zen_db_prepare_input($_POST['metatags_description'][$language_id]));
if ($action == 'insert_categories_meta_tags') {
$insert_sql_data = array('categories_id' => $categories_id,
'language_id' => $language_id);
$sql_data_array = array_merge($sql_data_array, $insert_sql_data);
zen_db_perform(TABLE_METATAGS_CATEGORIES_DESCRIPTION, $sql_data_array);
} elseif ($action == 'update_category_meta_tags') {
zen_db_perform(TABLE_METATAGS_CATEGORIES_DESCRIPTION, $sql_data_array, 'update', "categories_id = '" . (int)$categories_id . "' and language_id = '" . (int)$language_id . "'");
}
}
zen_redirect(zen_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $categories_id));
break;
// eof: categories meta tags
この部分のinsertとupdateの分岐がまずいです。
コード:
if (zen_get_category_metatags_keywords($categories_id, (int)$_SESSION['languages_id']) or zen_get_category_metatags_description($categories_id, (int)$_SESSION['languages_id'])) {
$action = 'update_category_meta_tags';
} else {
$action = 'insert_categories_meta_tags';
}
このように「キーワード」と「ディスクリプション」の有無だけで分岐しています。
「空欄」のままで登録した場合もTABLE_METATAGS_CATEGORIES_DESCRIPTIONに該当カテゴリが登録されますので、上記のようなフィールドの有無のみで判定してしまうと空欄がある状態で登録されたカテゴリに対してもinsertに分岐してしまいます。
言語ごとに判定しないのもまずいです。(デフォルトでは管理画面の表示言語でしか判定していない。)
対策は「空欄での登録をNGにする」か「判定をTABLE_METATAGS_CATEGORIES_DESCRIPTIONにカテゴリが登録されているか否かで行う」ようにすれば良いです。(言語ごとに行わなければいけません)
私はこんなふうに変更しました。
コード:
// bof: categories meta tags
case 'update_category_meta_tags':
// add or update meta tags
//die('I SEE ' . $action . ' - ' . $_POST['categories_id']);
$categories_id = $_POST['categories_id'];
/*
* バグ対応
*/
$languages = zen_get_languages();
for ($i=0, $n=sizeof($languages); $i<$n; $i++) {
$language_id = $languages[$i]['id'];
$sql_data_array = array('metatags_title' => zen_db_prepare_input($_POST['metatags_title'][$language_id]),
'metatags_keywords' => zen_db_prepare_input($_POST['metatags_keywords'][$language_id]),
'metatags_description' => zen_db_prepare_input($_POST['metatags_description'][$language_id]));
$check_sql_data_array = $db->Execute("select categories_id from ".TABLE_METATAGS_CATEGORIES_DESCRIPTION." where language_id = '".$language_id."' and categories_id = '".$categories_id."' ");
$check_cat = $check_sql_data_array->fields['categories_id'];
if($check_cat){
$action = 'update_category_meta_tags';
}else{
$action = 'insert_categories_meta_tags';
}
if ($action == 'insert_categories_meta_tags') {
$insert_sql_data = array('categories_id' => $categories_id,
'language_id' => $language_id);
$sql_data_array = array_merge($sql_data_array, $insert_sql_data);
zen_db_perform(TABLE_METATAGS_CATEGORIES_DESCRIPTION, $sql_data_array);
} elseif ($action == 'update_category_meta_tags') {
zen_db_perform(TABLE_METATAGS_CATEGORIES_DESCRIPTION, $sql_data_array, 'update', "categories_id = '" . (int)$categories_id . "' and language_id = '" . (int)$language_id . "'");
}
}
zen_redirect(zen_href_link(FILENAME_CATEGORIES, 'cPath=' . $cPath . '&cID=' . $categories_id));
break;
// eof: categories meta tags
冒頭の判定処理を削除し、言語分のループ中に「TABLE_METATAGS_CATEGORIES_DESCRIPTIONに今登録しようとしているカテゴリが登録されているか否かをチェック」するよう書いてあります。