ver.1.3.4 でポストされていた問題ですが、ver.2.1.2 でも同様の問題があります。
--------
[Ver.1.3.4]配送業者登録を更新すると配送時間のIDが変わる
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=1107&forum=9&post_id=3542#forumpost3542--------
更新のたびにPKが変わってしまうというのは、単に設計ミスでしょう。プライオリティは低そうですが、直すべき不具合だとは思います。
『とりあえずの解決策』として手を入れた部分を載せておきます。(実装としては美しくありませんが・・)
■ファイル
data/class/pages/admin/basis/LC_Page_Admin_Basis_Delivery_Input.php
■変更箇所
135〜181行目付近『lfRegistData()』を丸ごと下記と置き換え。
function lfRegistData() {
$arrRet = $this->objFormParam->getHashArray();
$objQuery = new SC_Query();
$objQuery->begin();
// 入力データを渡す。
$sqlval['name'] = $arrRet['name'];
$sqlval['service_name'] = $arrRet['service_name'];
$sqlval['confirm_url'] = $arrRet['confirm_url'];
$sqlval['creator_id'] = $_SESSION['member_id'];
$sqlval['update_date'] = 'Now()';
// deliv_id が決まっていた場合
if($_POST['deliv_id'] != "") {
$deliv_id = $_POST['deliv_id'];
$where = "deliv_id = ?";
$objQuery->update("dtb_deliv", $sqlval, $where, array($deliv_id));
// 配送時間の登録
$table = "dtb_delivtime";
$where = "deliv_id = ? AND time_id = ?";
for($cnt = 1; $cnt <= DELIVTIME_MAX; $cnt++) {
$sqlval = array();
$keyname = "deliv_time".$cnt;
$arrval = array($deliv_id, ($cnt * $deliv_id));
// 既存データの有無を確認
$curData = $objQuery->select("*", $table, $where, $arrval);
if(strcmp($arrRet[$keyname], "") != 0) {
$sqlval['deliv_time'] = $arrRet[$keyname];
// 入力が空ではなく、DBに情報があれば更新
if(count($curData)) {
$objQuery->update($table, $sqlval, $where, $arrval);
}
// DBに情報がなければ登録
else {
$sqlval['deliv_id'] = $deliv_id;
$sqlval['time_id'] = ($cnt * $deliv_id);
$objQuery->insert($table, $sqlval);
}
}
// 入力が空で、DBに情報がある場合は削除
else if(count($curData)) {
$objQuery->delete($table, $where, $arrval);
}
}
// 配送料の登録
if(INPUT_DELIV_FEE) {
for($cnt = 1; $cnt <= DELIVFEE_MAX; $cnt++) {
$keyname = "fee".$cnt;
if(strcmp($arrRet[$keyname], "") != 0) {
$sqlval = array('fee' => $arrRet[$keyname]);
$objQuery->update("dtb_delivfee", $sqlval, "deliv_id = ? AND pref = ?", array($deliv_id, $cnt));
}
}
}
}
else {
// 登録する配送業者IDの取得
if (DB_TYPE == "pgsql") {
$deliv_id = $objQuery->nextval('dtb_deliv', 'deliv_id');
$sqlval['deliv_id'] = $deliv_id;
}
$sqlval['rank'] = $objQuery->max("dtb_deliv", "rank") + 1;
$sqlval['create_date'] = 'Now()';
// INSERTの実行
$objQuery->insert("dtb_deliv", $sqlval);
if (DB_TYPE == "mysql") {
$deliv_id = $objQuery->nextval('dtb_deliv', 'deliv_id');
}
$sqlval = array();
// 配送時間の設定
for($cnt = 1; $cnt <= DELIVTIME_MAX; $cnt++) {
$keyname = "deliv_time$cnt";
if($arrRet[$keyname] != "") {
$sqlval['deliv_id'] = $deliv_id;
$sqlval['time_id'] = ($cnt * $deliv_id);
$sqlval['deliv_time'] = $arrRet[$keyname];
// INSERTの実行
$objQuery->insert("dtb_delivtime", $sqlval);
}
}
if(INPUT_DELIV_FEE) {
$sqlval = array();
// 配送料金の設定
for($cnt = 1; $cnt <= DELIVFEE_MAX; $cnt++) {
$keyname = "fee$cnt";
if($arrRet[$keyname] != "") {
$sqlval['deliv_id'] = $deliv_id;
$sqlval['fee'] = $arrRet[$keyname];
$sqlval['pref'] = $cnt;
// INSERTの実行
$objQuery->insert("dtb_delivfee", $sqlval);
}
}
}
}
$objQuery->commit();
return $deliv_id;
}