デフォルトの状態から、
カテゴリID,カテゴリ名,親カテゴリID
1,親カテゴリ,
2,子カテゴリ1,1
3,子カテゴリ2,1
というCSVをアップすると、これまでの順序関係は壊れてしまうのですがとりあえずアップはできます。
一方、現在までのカテゴリを壊したくないので新しく追加しようと、
カテゴリID,カテゴリ名,親カテゴリID
1,親カテゴリ,
21,子カテゴリ1,1
22,子カテゴリ2,1
というCSVをアップしても何故か登録できません。
ログをよく見るとUPDATEとか書いてあります。
カテゴリはdtb_categoryに保存されますが、そこにcategory_id=21とかのものが存在しなくてもUPDATEになってしまいます。
中を見てみると、カテゴリIDのカラムに何か書いてあればUPDATE、何もなければINSERTになっていました。
/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.phpの
LC_Page_Admin_Products_UploadCSVCategory::lfRegistProduct()で定義されています。
元々ここらへんはカテゴリ管理から手動登録→CSVをダウンロード→そのCSVを少々変更してアップロード、という流れを意図しているらしく、最初からカテゴリの一覧をCSVで作成してアップといった用途には向いていません。
どうしてもそこらへんを全部手動で管理したいんじゃ、任意のカテゴリIDを使用したいんじゃ、という場合はこのようにします。
そのカテゴリIDが既に存在すればUPDATE、無ければINSERTとなります。
でも削除したくてCSVから消したしたはずのカテゴリがあったとしてもDBにはそのまま残り続けたりするので、最初にdtb_categoryをTRUNCATEしてから全部INSERTしたほうが手っ取り早いかもしれません。
まあ、dtb_category_countとかdtb_productsとかの関連を何も考えてないのでどこで不具合が出るかわかったものではありませんが。
ていうか、この、
$update = true;
とか作り的にもう少しどうにかならなかったのだろうか。
EC-CUBEの記事
カテゴリID,カテゴリ名,親カテゴリID
1,親カテゴリ,
2,子カテゴリ1,1
3,子カテゴリ2,1
というCSVをアップすると、これまでの順序関係は壊れてしまうのですがとりあえずアップはできます。
一方、現在までのカテゴリを壊したくないので新しく追加しようと、
カテゴリID,カテゴリ名,親カテゴリID
1,親カテゴリ,
21,子カテゴリ1,1
22,子カテゴリ2,1
というCSVをアップしても何故か登録できません。
ログをよく見るとUPDATEとか書いてあります。
カテゴリはdtb_categoryに保存されますが、そこにcategory_id=21とかのものが存在しなくてもUPDATEになってしまいます。
中を見てみると、カテゴリIDのカラムに何か書いてあればUPDATE、何もなければINSERTになっていました。
/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.phpの
LC_Page_Admin_Products_UploadCSVCategory::lfRegistProduct()で定義されています。
1
2
3
4
5
6
7
8
|
if ($arrRet['category_id'] == 0) {
$category_id = $objQuery->max("dtb_category", "category_id") + 1;
$sqlval['category_id'] = $category_id;
$update = false;
} else {
$sqlval['category_id'] = $arrRet['category_id'];
$update = true;
}
|
元々ここらへんはカテゴリ管理から手動登録→CSVをダウンロード→そのCSVを少々変更してアップロード、という流れを意図しているらしく、最初からカテゴリの一覧をCSVで作成してアップといった用途には向いていません。
どうしてもそこらへんを全部手動で管理したいんじゃ、任意のカテゴリIDを使用したいんじゃ、という場合はこのようにします。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
if($arrRet['category_id']){
$sqlval['category_id'] = $arrRet['category_id'];
//使用済だったらUPDATE、無ければINSERT
if( $objQuery->count("dtb_category", "category_id = ?",
array($sqlval['category_id'])) > 0){
$update = true;
}else{
$update = false;
}
}else{
$sqlval['category_id'] = $objQuery->max("dtb_category", "category_id") + 1;
$update = false;
}
|
そのカテゴリIDが既に存在すればUPDATE、無ければINSERTとなります。
でも削除したくてCSVから消したしたはずのカテゴリがあったとしてもDBにはそのまま残り続けたりするので、最初にdtb_categoryをTRUNCATEしてから全部INSERTしたほうが手っ取り早いかもしれません。
まあ、dtb_category_countとかdtb_productsとかの関連を何も考えてないのでどこで不具合が出るかわかったものではありませんが。
ていうか、この、
$update = true;
とか作り的にもう少しどうにかならなかったのだろうか。
EC-CUBEの記事
PR
トラックバック
トラックバックURL: