/** * DBに商品データを登録する * * @param UploadFile $objUpFile UploadFileインスタンス * @param UploadFile $objDownFile UploadFileインスタンス * @param array $arrList フォーム入力パラメーター配列 * @return integer 登録商品ID */ public function lfRegistProduct(&$objUpFile, &$objDownFile, $arrList) { $objQuery = Application::alias('eccube.query'); /* @var $objDb DbHelper */ $objDb = Application::alias('eccube.helper.db'); // 配列の添字を定義 $checkArray = array('name', 'status', 'main_list_comment', 'main_comment', 'deliv_fee', 'comment1', 'comment2', 'comment3', 'comment4', 'comment5', 'comment6', 'sale_limit', 'deliv_date_id', 'maker_id', 'note'); $arrList = Utils::arrayDefineIndexes($arrList, $checkArray); // INSERTする値を作成する。 $sqlval['name'] = $arrList['name']; $sqlval['status'] = $arrList['status']; $sqlval['main_list_comment'] = $arrList['main_list_comment']; $sqlval['main_comment'] = $arrList['main_comment']; $sqlval['comment1'] = $arrList['comment1']; $sqlval['comment2'] = $arrList['comment2']; $sqlval['comment3'] = $arrList['comment3']; $sqlval['comment4'] = $arrList['comment4']; $sqlval['comment5'] = $arrList['comment5']; $sqlval['comment6'] = $arrList['comment6']; $sqlval['deliv_date_id'] = $arrList['deliv_date_id']; $sqlval['maker_id'] = $arrList['maker_id']; $sqlval['note'] = $arrList['note']; $sqlval['update_date'] = 'CURRENT_TIMESTAMP'; $sqlval['creator_id'] = $_SESSION['member_id']; $arrRet = $objUpFile->getDBFileList(); $sqlval = array_merge($sqlval, $arrRet); for ($cnt = 1; $cnt <= PRODUCTSUB_MAX; $cnt++) { $sqlval['sub_title' . $cnt] = $arrList['sub_title' . $cnt]; $sqlval['sub_comment' . $cnt] = $arrList['sub_comment' . $cnt]; } $objQuery->begin(); // 新規登録(複製時を含む) if ($arrList['product_id'] == '') { $product_id = $objQuery->nextVal('dtb_products_product_id'); $sqlval['product_id'] = $product_id; // INSERTの実行 $sqlval['create_date'] = 'CURRENT_TIMESTAMP'; $objQuery->insert('dtb_products', $sqlval); $arrList['product_id'] = $product_id; // カテゴリを更新 $objDb->updateProductCategories($arrList['category_id'], $product_id); // 複製商品の場合には規格も複製する if ($arrList['copy_product_id'] != '' && Utils::sfIsInt($arrList['copy_product_id'])) { if (!$arrList['has_product_class']) { //規格なしの場合、複製は価格等の入力が発生しているため、その内容で追加登録を行う $this->lfCopyProductClass($arrList, $objQuery); } else { //規格がある場合の複製は複製元の内容で追加登録を行う // dtb_products_class のカラムを取得 /* @var $dbFactory DBFactory */ $dbFactory = Application::alias('eccube.db.factory'); $arrColList = $objQuery->listTableFields('dtb_products_class'); $arrColList_tmp = array_flip($arrColList); // 複製しない列 unset($arrColList[$arrColList_tmp['product_class_id']]); //規格ID unset($arrColList[$arrColList_tmp['product_id']]); //商品ID unset($arrColList[$arrColList_tmp['create_date']]); // 複製元商品の規格データ取得 $col = Utils::sfGetCommaList($arrColList); $table = 'dtb_products_class'; $where = 'product_id = ?'; $objQuery->setOrder('product_class_id'); $arrProductsClass = $objQuery->select($col, $table, $where, array($arrList['copy_product_id'])); // 規格データ登録 $objQuery = Application::alias('eccube.query'); foreach ($arrProductsClass as $arrData) { $sqlval = $arrData; $sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id'); $sqlval['deliv_fee'] = $arrList['deliv_fee']; $sqlval['point_rate'] = $arrList['point_rate']; $sqlval['sale_limit'] = $arrList['sale_limit']; $sqlval['product_id'] = $product_id; $sqlval['create_date'] = 'CURRENT_TIMESTAMP'; $sqlval['update_date'] = 'CURRENT_TIMESTAMP'; $objQuery->insert($table, $sqlval); } } } // 更新 } else { $product_id = $arrList['product_id']; // 削除要求のあった既存ファイルの削除 $arrRet = $this->lfGetProductData_FromDB($arrList['product_id']); // TODO: UploadFile::deleteDBFileの画像削除条件見直し要 $objImage = new Image($objUpFile->temp_dir); $arrKeyName = $objUpFile->keyname; $arrSaveFile = $objUpFile->save_file; $arrImageKey = array(); foreach ($arrKeyName as $key => $keyname) { if ($arrRet[$keyname] && !$arrSaveFile[$key]) { $arrImageKey[] = $keyname; $has_same_image = $this->lfHasSameProductImage($arrList['product_id'], $arrImageKey, $arrRet[$keyname]); if (!$has_same_image) { $objImage->deleteImage($arrRet[$keyname], $objUpFile->save_dir); } } } $objDownFile->deleteDBDownFile($arrRet); // UPDATEの実行 $where = 'product_id = ?'; $objQuery->update('dtb_products', $sqlval, $where, array($product_id)); // カテゴリを更新 $objDb->updateProductCategories($arrList['category_id'], $product_id); } // 商品登録の時は規格を生成する。複製の場合は規格も複製されるのでこの処理は不要。 if ($arrList['copy_product_id'] == '') { // 規格登録 if ($objDb->hasProductClass($product_id)) { // 規格あり商品(商品規格テーブルのうち、商品登録フォームで設定するパラメーターのみ更新) $this->lfUpdateProductClass($arrList); } else { // 規格なし商品(商品規格テーブルの更新) $arrList['product_class_id'] = $this->lfInsertDummyProductClass($arrList); } } // 商品ステータス設定 /* @var $objProduct Product */ $objProduct = Application::alias('eccube.product'); $objProduct->setProductStatus($product_id, $arrList['product_status']); // 税情報設定 if (OPTION_PRODUCT_TAX_RULE && !$objDb->hasProductClass($product_id)) { TaxRuleHelper::setTaxRuleForProduct($arrList['tax_rate'], $arrList['product_id'], $arrList['product_class_id']); } // 関連商品登録 $this->lfInsertRecommendProducts($objQuery, $arrList, $product_id); $objQuery->commit(); return $product_id; }
/** * 規格の登録または更新を行う. * * @param array $arrList 入力フォームの内容 * @param integer $product_id 登録を行う商品ID */ public function registerProductClass($arrList, $product_id, $total) { $objQuery = Application::alias('eccube.query'); /* @var $objDb DbHelper */ $objDb = Application::alias('eccube.helper.db'); $objQuery->begin(); $arrProductsClass = $objQuery->select('*', 'dtb_products_class', 'product_id = ?', array($product_id)); $arrExists = array(); foreach ($arrProductsClass as $val) { $arrExists[$val['product_class_id']] = $val; } // デフォルト値として設定する値を取得しておく $arrDefault = $this->getProductsClass($product_id); $objQuery->delete('dtb_products_class', 'product_id = ? AND (classcategory_id1 <> 0 OR classcategory_id2 <> 0)', array($product_id)); for ($i = 0; $i < $total; $i++) { $del_flg = Utils::isBlank($arrList['check'][$i]) ? 1 : 0; $price02 = Utils::isBlank($arrList['price02'][$i]) ? 0 : $arrList['price02'][$i]; // dtb_products_class 登録/更新用 $registerKeys = array('classcategory_id1', 'classcategory_id2', 'product_code', 'stock', 'price01', 'product_type_id', 'down_filename', 'down_realfilename'); $arrPC = array(); foreach ($registerKeys as $key) { $arrPC[$key] = $arrList[$key][$i]; } $arrPC['product_id'] = $product_id; $arrPC['sale_limit'] = $arrDefault['sale_limit']; $arrPC['deliv_fee'] = $arrDefault['deliv_fee']; $arrPC['point_rate'] = $arrDefault['point_rate']; if ($arrList['stock_unlimited'][$i] == 1) { $arrPC['stock_unlimited'] = 1; $arrPC['stock'] = null; } else { $arrPC['stock_unlimited'] = 0; } $arrPC['price02'] = $price02; // 該当関数が無いため, セッションの値を直接代入 $arrPC['creator_id'] = $_SESSION['member_id']; $arrPC['update_date'] = 'CURRENT_TIMESTAMP'; $arrPC['del_flg'] = $del_flg; $arrPC['create_date'] = 'CURRENT_TIMESTAMP'; // 更新の場合は, product_class_id を使い回す if (!Utils::isBlank($arrList['product_class_id'][$i])) { $arrPC['product_class_id'] = $arrList['product_class_id'][$i]; } else { $arrPC['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id'); } /* * チェックを入れない商品は product_type_id が NULL になるので, 0 を入れる */ $arrPC['product_type_id'] = Utils::isBlank($arrPC['product_type_id']) ? 0 : $arrPC['product_type_id']; $objQuery->insert('dtb_products_class', $arrPC); // 税情報登録/更新 if (OPTION_PRODUCT_TAX_RULE) { TaxRuleHelper::setTaxRuleForProduct($arrList['tax_rate'][$i], $arrPC['product_id'], $arrPC['product_class_id']); } } // 規格無し用の商品規格を非表示に $arrBlank['del_flg'] = 1; $arrBlank['update_date'] = 'CURRENT_TIMESTAMP'; $objQuery->update('dtb_products_class', $arrBlank, 'product_id = ? AND classcategory_id1 = 0 AND classcategory_id2 = 0', array($product_id)); // 件数カウントバッチ実行 $objDb->countCategory($objQuery); $objQuery->commit(); }