バージョン選択

フォーラム

メニュー

オンライン状況

31 人のユーザが現在オンラインです。 (23 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 30
ina2 もっと...

サイト内検索

質問 > 管理機能 > カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ecnobu
投稿日時: 2009/7/31 0:35
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 23
カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
お世話になっております。
EC-CUBE 2.4.1
DB PostGreSQL 8.3.7
Apache 2.2.9

という環境でいじっておりますが、管理画面の「商品管理」->「カテゴリ登録CSV」の
機能を使ってカテゴリを登録しようとしても、トップカテゴリしか正常に登録されない
ので、LC_Page_Admin_Products_UploadCSVCategory.php の lfRegistProduct()
に、下のようなロジックを加えて、サブカテゴリもCSVから登録できるようにしました。


--- a/eccube/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php
+++ b/eccube/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php
@@ -243,7 +243,17 @@ class LC_Page_Admin_Products_UploadCSVCategory extends LC_Page {
             $update = false;
     } else {
         $sqlval['category_id'] = $arrRet['category_id'];
+
+        $arrCatID = $objDbQuery->select("category_id", "dtb_category", "category_id=" . $arrRet['parent_category_id']);
+
+       if(is_numeric($arrCatID[0]['category_id'])) {
+       //  親カテゴリに指定したカテゴリはテーブルに存在 -> INSERT
+
+           $update = false;
+
+       } else {
         $update = true;
+        }
     }



しかし、その後、「カテゴリ管理」画面から、カテゴリを登録すると、既に使用されている
カテゴリIDが付与されてしまったりします。そのような副作用を起こすような変更には
思えないのですが、これは何が悪いのでしょうか?

また、dtb_category_category_id_seq テーブルの last_value と、カテゴリID との
関係がつかめず、行き詰まっております。

何卒ご教授いただけますよう、よろしくお願いします。
tao_s
投稿日時: 2009/7/31 1:12
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 804
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
dtb_category_category_id_seqのlast_valueとcategory_idの最後の値が一致している必要があります。

category_idはdtb_categoryにレコードを追加した時に自動的に付与されるのですが、その時に使用しているのがdtb_category_category_id_seqです。多分カラムの定義にNEXTVAL(うんちゃら・・・)と書いてあると重います。


----------------
EC-CUBEカスタマイズ相談してください。
緊急のEC-CUBEの障害対応
EC-CUBEカスタマイズブログ

ecnobu
投稿日時: 2009/7/31 10:47
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 23
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
そういう仕組みだったんですか。
ご教授ありがとうございました。

しかし、CSVからカテゴリを登録したときは、
dtb_category_category_id_seq の last_value が
インクリメントされないのは、どこが悪いのでしょうか?

重ね重ねの質問で申し訳ありませんが、よろしくお願い
いたします。
tao_s
投稿日時: 2009/8/1 23:33
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 804
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
確認していないので何とも言えませんが、category_idを指定してアップした場合はupdate扱いでインクリメントされないのではないのでしょうか?
category_idを空欄でアップしたら正常に登録されると思います。


----------------
EC-CUBEカスタマイズ相談してください。
緊急のEC-CUBEの障害対応
EC-CUBEカスタマイズブログ

ecnobu
投稿日時: 2009/8/2 11:58
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 23
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変

ご指南ありがとうございます。

しかし、カテゴリcategory_idを空欄でアップしても、
dtb_category_category_id_seq の last_value は
インクリメントされませんでした。
kuro
投稿日時: 2009/8/12 19:04
対応状況: −−−
半人前
登録日: 2008/7/23
居住地:
投稿: 20
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
ecnobuさま

EC-CUBE 2.4.1のデフォルト状態でも同じ現象(インクリメントされない)が起きました。
「カテゴリ登録CSV」からのカテゴリ登録後、
「カテゴリ管理」でカテゴリ手動登録を行うとそのような状態になるようです。
(「カテゴリ登録CSV」のみ or 「カテゴリ管理」のみしか使用しない場合は、
インクリメントされてなくてもcategory_id重複などの実害は出てこないと思います)


-------------------------------------------------------------
■管理画面「カテゴリ登録CSV」からCSVアップロードで登録した場合
-------------------------------------------------------------
 ⇒category_idには登録済み最大番号+1がセットされますが、
 最大番号の取得・セットにはdtb_category_category_id_seqは使用されていないようです。
 また、「カテゴリ登録CSV」からの登録の場合、
 dtb_category_category_id_seqはインクリメントされません。


-------------------------------------------------------------
■管理画面「カテゴリ管理」から手動で登録した場合
-------------------------------------------------------------
 ⇒CSVアップロードを行った後では、dtb_category_category_id_seqとcategory_idの最大番号にずれが生じています。
 「カテゴリ管理」からの登録の場合、dtb_category_category_id_seqに従ってcategory_idを設定するため、
CSVで登録済みのカテゴリーと重複したcategory_idが振られてしまいます。



↓多分★★★の部分でcategory_idを指定してしまってるので
 nextval()が動いていないんじゃないかと思うのですが・・・

----------------------------------------------------------------
※LC_Page_Admin_Products_UploadCSVCategory.php 240行目付近
----------------------------------------------------------------

/**
* カテゴリ登録を行う.
*
* @param SC_Query $objQuery SC_Queryインスタンス
* @param string|integer $line 処理中の行数
* @return void
*/
function lfRegistProduct($objQuery, $line = "") {
$objDb = new SC_Helper_DB_Ex();
$arrRet = $this->objFormParam->getHashArray();

//カテゴリID
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;
}
〜〜〜〜〜
省略
〜〜〜〜〜
----------------------------------------------------------------


phpPgAdminから「SELECT setval('dtb_category_category_id_seq', XXX)」で
dtb_category_category_id_seqの最大値を正しいものにセットし直した後、
★★★の行をコメントアウトすると、
CSVアップロードで新規登録の場合でもdtb_category_category_id_seqの数字がインクリメントされるようになりました。
(「カテゴリ登録CSV」「カテゴリ管理」両方から登録・編集を繰り返してみましたが、
category_idの重複やその他の問題は起こっていないように思います)

もし上記の対処方法がまずいようでしたら、
どなたかアドバイスをいただけませんでしょうか。
ecnobu
投稿日時: 2009/8/13 21:17
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 23
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
kuro さま

kuroさまのご指摘のとおり、確かに、CSVではないほうの
カテゴリ登録を行う、LC_Page_Admin_Products_Category.php
の insert 実行時(lfInsertCat() 内)には、category_id は
指定されていませんね。
それが原因だったとは。。。
ありがとうございます。

あ、でも、未確認(記憶がうつろ)ですが、それでもまだ、
今度は、CSVファイルに、dtb_category には未登録のカテゴリID
を書いておくと、UPDATE 文になってしまって、正常に終了した
ようにメッセージは出るけど登録はされなかったのではなかっ
たかと思います。。。

。。。と思って、kuro さまのご指摘の変更を施した後、
実際にやってみたところ、
LC_Page_Admin_Products_UploadCSVCategory.php の
lfCheckError() 340行めあたり(下記)でひっかかって
エラーになりました。
(dtb_category_category_id_seqの最大値は正しい状態です)

 // 編集中のレコード以外に同じ名称が存在する場合
 if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $_POST['category_name']) {
        $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。<br>";
   }
kuro
投稿日時: 2009/8/19 21:43
対応状況: −−−
半人前
登録日: 2008/7/23
居住地:
投稿: 20
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
ecnobuさま

ご返信が遅くなり、申し訳ございません

> LC_Page_Admin_Products_UploadCSVCategory.php の
> lfCheckError() 340行めあたり(下記)でひっかかって
> エラーになりました。

こちらの件ですが、私の方も既存カテゴリのcategory_nameを修正&上書きUPする際に
同じエラーが起きました。
良く確認しないままですみません・・・



 // 編集中のレコード以外に同じ名称が存在する場合
 if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $_POST['category_name']) {
        $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。<br>";
   }


↑この部分なのですが、$_POST['category_name']というのがどこから来ている値なのかよくわかりません・・・
(どなたかご存じないでしょうか?
中身は常に空っぽですし、管理画面からcategory_nameをポストしている訳でもなさそうです)


既存カテゴリのcategory_name変更の場合だと、兄弟カテゴリに同一category_nameのものがなければ
$arrCat[0]['category_name']は空になりますので、常に空の$_POST['category_name']とイコールになって
上記エラーメッセージが表示されていました。(※本来ならエラーにならない条件です)



 // 編集中のレコード以外に同じ名称が存在する場合
 if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $arrRet['category_name']) {
        $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。<br>";
   }


上記のように変更したところ、私の方ではエラーを出さずにUPDATEすることができました。
また、兄弟カテゴリに存在するcategory_nameに変更しようとした場合も、ちゃんとエラーがでます。
もし上記の変更でなにか問題があるようでしたら、
ご指摘いただけると嬉しいです。


> 今度は、CSVファイルに、dtb_category には未登録のカテゴリID
> を書いておくと、UPDATE 文になってしまって、正常に終了した
> ようにメッセージは出るけど登録はされなかったのではなかっ
> たかと思います。。。

こちらの件ですが、カテゴリの新規登録時に「カテゴリID(category_id)」欄に任意の番号を
記入したいということでしょうか?
(新規登録時は「category_id」欄を空欄にして登録すると思うのですが、そういう意味ではなかったですか?)
ecnobu
投稿日時: 2009/8/22 11:45
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 23
Re: カテゴリ登録CSVを修正後、カテゴリ管理画面からの登録に異変
kuroさま

重ねてのご調査、ありがとうございます。

>上記のように変更したところ、私の方ではエラーを出さずにUPDATEすることができました。
>また、兄弟カテゴリに存在するcategory_nameに変更しようとした場合も、ちゃんとエラーがでます。

そう言われれば、comu版では kuro さまの変更と同様の変更が
なされているという記事を読んだことがあるような気がしま
す。別件だったかもしれませんが。。。


>> 今度は、CSVファイルに、dtb_category には未登録のカテゴリID
>> を書いておくと、UPDATE 文になってしまって、正常に終了した
>> ようにメッセージは出るけど登録はされなかったのではなかっ
>> たかと思います。。。
>
>こちらの件ですが、カテゴリの新規登録時に「カテゴリID(category_id)」欄に任意の番号を
>記入したいということでしょうか?
>(新規登録時は「category_id」欄を空欄にして登録すると思うのですが、そういう意味ではなかったですか?)

あいまいな記述で申し訳ありませんでした。
ご推察のとおり、カテゴリの新規登録時に「カテゴリID」欄に
任意の番号を記入した場合のことを想定した話です。
仕様として、新規登録時は「カテゴリID」欄は空欄にしなければ
ならないのでしょうか?
それならそれでいいのですが。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は93,681名です
総投稿数は111,076件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2318
5
umebius
2085
6
yuh
1857
7
h_tanaka
1756
8
red
1574
9
mcontact
1466
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.