source: branches/version-2_11-dev/data/class/SC_Product.php @ 21263

Revision 21263, 34.0 KB checked in by nanasess, 9 years ago (diff)

#1280 (PECL json 使用時, 規格2のプルダウンが表示されない)

  • 空のキーが生成されないよう修正
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24/**
25 * 商品を扱うサービスクラス.
26 *
27 * @author LOCKON CO.,LTD.
28 * @author Kentaro Ohkouchi
29 * @version $Id$
30 */
31class SC_Product {
32
33    /** 規格名一覧 */
34    var $arrClassName;
35    /** 規格分類名一覧 */
36    var $arrClassCatName;
37    var $classCategories = array();
38    var $stock_find;
39    /** 規格1クラス名 */
40    var $className1 = '';
41    /** 規格2クラス名 */
42    var $className2 = '';
43    /** 規格1が設定されている */
44    var $classCat1_find;
45    /** 規格2が設定されている */
46    var $classCat2_find;
47    var $classCats1;
48    /** 検索用並び替え条件配列 */
49    var $arrOrderData;
50
51    /**
52     * 商品検索結果の並び順を指定する。
53     *
54     * ただし指定できるテーブルはproduct_idを持っているテーブルであることが必要.
55     *
56     * @param string $col 並び替えの基準とするフィールド
57     * @param string $table 並び替えの基準とするフィールドがあるテーブル
58     * @param string $order 並び替えの順序 ASC / DESC
59     * @return void
60     */
61    function setProductsOrder($col, $table = 'dtb_products', $order = 'ASC') {
62        $this->arrOrderData = array('col' => $col, 'table' => $table, 'order' => $order);
63    }
64
65    /**
66     * SC_Queryインスタンスに設定された検索条件を元に並び替え済みの検索結果商品IDの配列を取得する。
67     *
68     * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
69     *
70     * @param SC_Query $objQuery SC_Query インスタンス
71     * @param array $arrVal 検索パラメーターの配列
72     * @return array 商品IDの配列
73     */
74    function findProductIdsOrder(&$objQuery, $arrVal = array()) {
75        $table = <<< __EOS__
76                 dtb_products AS alldtl
77            JOIN dtb_products_class AS T1
78              ON alldtl.product_id = T1.product_id
79            JOIN dtb_product_categories AS T2
80              ON alldtl.product_id = T2.product_id
81            JOIN dtb_category
82              ON T2.category_id = dtb_category.category_id
83__EOS__;
84        $objQuery->setGroupBy('alldtl.product_id');
85        if(is_array($this->arrOrderData) and $objQuery->order == ""){
86            $o_col = $this->arrOrderData['col'];
87            $o_table = $this->arrOrderData['table'];
88            $o_order = $this->arrOrderData['order'];
89            $order = <<< __EOS__
90                    (
91                        SELECT $o_col
92                        FROM
93                            $o_table as T2
94                        WHERE T2.product_id = alldtl.product_id
95                        ORDER BY T2.$o_col $o_order
96                        LIMIT 1
97                    ) $o_order, product_id
98__EOS__;
99            $objQuery->setOrder($order);
100        }
101        $results = $objQuery->select('alldtl.product_id', $table, "", $arrVal,
102                                     MDB2_FETCHMODE_ORDERED);
103        foreach ($results as $val) {
104            $resultValues[] = $val[0];
105        }
106        return $resultValues;
107    }
108
109    /**
110     * SC_Queryインスタンスに設定された検索条件をもとに対象商品数を取得する.
111     *
112     * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
113     *
114     * @param SC_Query $objQuery SC_Query インスタンス
115     * @param array $arrVal 検索パラメーターの配列
116     * @return array 対象商品ID数
117     */
118    function findProductCount(&$objQuery, $arrVal = array()) {
119        $table = <<< __EOS__
120                 dtb_products AS alldtl
121            JOIN dtb_product_categories AS T2
122              ON alldtl.product_id = T2.product_id
123            JOIN dtb_category
124              ON T2.category_id = dtb_category.category_id
125__EOS__;
126        $objQuery->setGroupBy('alldtl.product_id');
127        $sql_base = $objQuery->getSql('alldtl.product_id',$table);
128        return $objQuery->getOne( "SELECT count(*) FROM ( $sql_base ) as t" , $arrVal);
129    }
130
131    /**
132     * SC_Queryインスタンスに設定された検索条件をもとに商品一覧の配列を取得する.
133     *
134     * 主に SC_Product::findProductIds() で取得した商品IDを検索条件にし,
135     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
136     * の配列を取得する.
137     *
138     * @param SC_Query $objQuery SC_Query インスタンス
139     * @return array 商品一覧の配列
140     */
141    function lists(&$objQuery) {
142        $col = <<< __EOS__
143             product_id
144            ,product_code_min
145            ,product_code_max
146            ,name
147            ,comment1
148            ,comment2
149            ,comment3
150            ,main_list_comment
151            ,main_image
152            ,main_list_image
153            ,price01_min
154            ,price01_max
155            ,price02_min
156            ,price02_max
157            ,stock_min
158            ,stock_max
159            ,stock_unlimited_min
160            ,stock_unlimited_max
161            ,deliv_date_id
162            ,status
163            ,del_flg
164            ,update_date
165__EOS__;
166        $where = 'dtb_products_class.del_flg = 0';
167        $res = $objQuery->select($col, $this->alldtlSQL($where));
168        return $res;
169    }
170
171
172    /**
173     * 商品IDを指定し、商品一覧を取得する
174     *
175     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
176     * の配列を取得する.
177     * FIXME: 呼び出し元で設定した、SC_Query::setWhere() も有効に扱いたい。
178     *
179     * @param SC_Query $objQuery SC_Query インスタンス
180     * @param array|int $arrProductId 商品ID
181     * @return array 商品一覧の配列
182     */
183    function getListByProductIds(&$objQuery, $arrProductId = array()) {
184        if (empty($arrProductId)) {
185            return array();
186        }
187
188        $where = 'alldtl.product_id IN (' . implode(',', array_fill(0, count($arrProductId), '?')) . ')';
189        $where .= ' AND alldtl.del_flg = 0';
190
191        $objQuery->setWhere($where, $arrProductId);
192        $arrRet = $this->lists($objQuery);
193        return $arrRet;
194    }
195
196    /**
197     * 商品詳細を取得する.
198     *
199     * @param integer $productId 商品ID
200     * @return array 商品詳細情報の配列
201     */
202    function getDetail($productId) {
203        $objQuery =& SC_Query_Ex::getSingletonInstance();
204        $result = $objQuery->select("*", $this->alldtlSQL("product_id = ? AND del_flg = 0"),
205                                    "product_id = ?",
206                                    array($productId, $productId));
207        return $result[0];
208    }
209
210    /**
211     * 商品詳細情報と商品規格を取得する.
212     *
213     * @param integer $productClassId 商品規格ID
214     * @return array 商品詳細情報と商品規格の配列
215     */
216    function getDetailAndProductsClass($productClassId) {
217        $result = $this->getProductsClass($productClassId);
218        $result = array_merge($result, $this->getDetail($result['product_id']));
219        return $result;
220    }
221
222    /**
223     * 商品IDに紐づく商品規格を自分自身に設定する.
224     *
225     * 引数の商品IDの配列に紐づく商品規格を取得し, 自分自身のフィールドに
226     * 設定する.
227     *
228     * @param array $arrProductId 商品ID の配列
229     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
230     * @return void
231     */
232    function setProductsClassByProductIds($arrProductId, $has_deleted = false) {
233
234        $arrProductsClass = array();
235        foreach ($arrProductId as $productId) {
236            $arrProductClass = $this->getProductsClassFullByProductId($productId, $has_deleted);
237
238            $classCats1 = array();
239            $classCats1['__unselected'] = '選択してください';
240
241            // 規格1クラス名
242            $this->className1[$productId] =
243                isset($arrProductClass[0]['class_name1'])
244                ? $arrProductClass[0]['class_name1']
245                : '';
246
247            // 規格2クラス名
248            $this->className2[$productId] =
249                isset($arrProductClass[0]['class_name2'])
250                ? $arrProductClass[0]['class_name2']
251                : '';
252
253            // 規格1が設定されている
254            $this->classCat1_find[$productId] = (!SC_Utils_Ex::isBlank($arrProductClass[0]['classcategory_id1']));
255            // 規格2が設定されている
256            $this->classCat2_find[$productId] = (!SC_Utils_Ex::isBlank($arrProductClass[0]['classcategory_id2']));
257
258            $this->stock_find[$productId] = false;
259            $classCategories = array();
260            $classCategories['__unselected']['__unselected']['name'] = '選択してください';
261            $classCategories['__unselected']['__unselected']['product_class_id'] = $arrProductClass[0]['product_class_id'];
262            // 商品種別
263            $classCategories['__unselected']['__unselected']['product_type'] = $arrProductClass[0]['product_type_id'];
264            $this->product_class_id[$productId] = $arrProductClass[0]['product_class_id'];
265            // 商品種別
266            $this->product_type[$productId] = $arrProductClass[0]['product_type_id'];
267            foreach ($arrProductClass as $productsClass) {
268                $classCats2 = array();
269                $productsClass1 = $productsClass['classcategory_id1'];
270                $productsClass2 = $productsClass['classcategory_id2'];
271                // 在庫
272                $stock_find_class = ($productsClass['stock_unlimited'] || $productsClass['stock'] > 0);
273
274                $classCats2['classcategory_id2'] = $productsClass2;
275                $classCats2['name'] = $productsClass['classcategory_name2'] . ($stock_find_class ? '' : ' (品切れ中)');
276
277                $classCats2['stock_find'] = $stock_find_class;
278
279                if ($stock_find_class) {
280                    $this->stock_find[$productId] = true;
281                }
282
283                if (!in_array($classcat_id1, $classCats1)) {
284                    $classCats1[$productsClass1] = $productsClass['classcategory_name1']
285                        . ($productsClass2 == 0 && !$stock_find_class ? ' (品切れ中)' : '');
286                }
287
288                // 価格
289                $classCats2['price01']
290                    = strlen($productsClass['price01'])
291                    ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($productsClass['price01']))
292                    : '';
293
294                $classCats2['price02']
295                    = strlen($productsClass['price02'])
296                    ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($productsClass['price02']))
297                    : '';
298
299                // ポイント
300                $classCats2['point']
301                    = number_format(SC_Utils_Ex::sfPrePoint($productsClass['price02'], $productsClass['point_rate']));
302
303                // 商品コード
304                $classCats2['product_code'] = $productsClass['product_code'];
305                // 商品規格ID
306                $classCats2['product_class_id'] = $productsClass['product_class_id'];
307                // 商品種別
308                $classCats2['product_type'] = $productsClass['product_type_id'];
309
310                // #929(GC8 規格のプルダウン順序表示不具合)対応のため、2次キーは「#」を前置
311                if (SC_Utils_Ex::isBlank($productsClass1)) {
312                    $productsClass1 = '__unselected2';
313                }
314                $classCategories[$productsClass1]['#'] = array(
315                    'classcategory_id2' => '',
316                    'name' => '選択してください',
317                );
318                $classCategories[$productsClass1]['#' . $productsClass2] = $classCats2;
319            }
320
321            $this->classCategories[$productId] = $classCategories;
322
323            // 規格1
324            $this->classCats1[$productId] = $classCats1;
325        }
326    }
327
328    /**
329     * SC_Query インスタンスに設定された検索条件を使用して商品規格を取得する.
330     *
331     * @param SC_Query $objQuery SC_Queryインスタンス
332     * @param array $params 検索パラメーターの配列
333     * @return array 商品規格の配列
334     */
335    function getProductsClassByQuery(&$objQuery, $params) {
336        // 末端の規格を取得
337        $col = <<< __EOS__
338            T1.product_id,
339            T1.stock,
340            T1.stock_unlimited,
341            T1.sale_limit,
342            T1.price01,
343            T1.price02,
344            T1.point_rate,
345            T1.product_code,
346            T1.product_class_id,
347            T1.del_flg,
348            T1.product_type_id,
349            T1.down_filename,
350            T1.down_realfilename,
351            T2.class_combination_id,
352            T2.parent_class_combination_id,
353            T2.classcategory_id,
354            T2.level,
355            T3.name AS classcategory_name,
356            T3.rank,
357            T4.name AS class_name,
358            T4.class_id
359__EOS__;
360        $table = <<< __EOS__
361                      dtb_products_class T1
362            LEFT JOIN dtb_class_combination T2
363                   ON T1.class_combination_id = T2.class_combination_id
364            LEFT JOIN dtb_classcategory T3
365                   ON T2.classcategory_id = T3.classcategory_id
366            LEFT JOIN dtb_class T4
367                   ON T3.class_id = T4.class_id
368__EOS__;
369
370        $objQuery->setOrder('T3.rank DESC'); // XXX
371        $arrRet = $objQuery->select($col, $table, "", $params);
372        $levels = array();
373        $parents = array();
374        foreach ($arrRet as $rows) {
375            $levels[] = $rows['level'];
376            $parents[] = $rows['parent_class_combination_id'];
377        }
378        $level = max($levels);
379        $parentsClass = array();
380        // 階層分の親を取得
381        for ($i = 0; $i < $level -1; $i++) {
382            $objQuery =& SC_Query_Ex::getSingletonInstance();
383            $objQuery->setWhere('T1.class_combination_id IN (' . implode(', ', array_pad(array(), count($parents), '?')) . ')');
384
385            $col = <<< __EOS__
386                T1.class_combination_id,
387                T1.classcategory_id,
388                T1.parent_class_combination_id,
389                T1.level,
390                T2.name AS classcategory_name,
391                T2.rank,
392                T3.name AS class_name,
393                T3.class_id
394__EOS__;
395            $table = <<< __EOS__
396                          dtb_class_combination T1
397                LEFT JOIN dtb_classcategory T2
398                       ON T1.classcategory_id = T2.classcategory_id
399                LEFT JOIN dtb_class T3
400                       ON T2.class_id = T3.class_id
401__EOS__;
402
403            $objQuery->setOrder('T2.rank DESC'); // XXX
404            $arrParents = $objQuery->select($col, $table, "", $parents);
405
406            foreach ($arrParents as $rows) {
407                $parents[] = $rows['parent_class_combination_id'];
408
409                foreach ($arrRet as $child) {
410                    if ($child['parent_class_combination_id']
411                        == $rows['class_combination_id']) {
412                        $rows['product_id'] = $child['product_id'];
413                    }
414                }
415                $tmpParents[] = $rows;
416            }
417            $parentsClass = array_merge($parentsClass, $tmpParents);
418        }
419
420        // 末端から枝を作成
421        $tmpClass = array_merge($arrRet, $parentsClass);
422
423        foreach ($tmpClass as $val) {
424            $val['class_id' . $val['level']] = $val['class_id'];
425            $val['class_name' . $val['level']] = $val['class_name'];
426            $val['classcategory_name' . $val['level']] = $val['classcategory_name'];
427            $val['classcategory_id' . $val['level']] = $val['classcategory_id'];
428            $arrProductsClass[] = $val;
429        }
430        return $arrProductsClass;
431    }
432
433    /**
434     * 商品規格IDから商品規格を取得する.
435     *
436     * 削除された商品規格は取得しない.
437     *
438     * @param integer $productClassId 商品規格ID
439     * @return array 商品規格の配列
440     */
441    function getProductsClass($productClassId) {
442        $objQuery =& SC_Query_Ex::getSingletonInstance();
443        $objQuery->setWhere('product_class_id = ? AND T1.del_flg = 0');
444        $objQuery->setOrder("T2.level DESC");
445        $results = $this->getProductsClassByQuery($objQuery, $productClassId);
446        $productsClass = $this->getProductsClassFull($results);
447        return $productsClass[0];
448    }
449
450    /**
451     * 複数の商品IDに紐づいた, 商品規格を取得する.
452     *
453     * @param array $productIds 商品IDの配列
454     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
455     * @return array 商品規格の配列
456     */
457    function getProductsClassByProductIds($productIds = array(), $has_deleted = false) {
458        if (empty($productIds)) {
459            return array();
460        }
461        $objQuery =& SC_Query_Ex::getSingletonInstance();
462        $where = 'product_id IN (' . implode(', ', array_pad(array(), count($productIds), '?')) . ')';
463        if (!$has_deleted) {
464            $where .= ' AND T1.del_flg = 0';
465        }
466        $objQuery->setWhere($where);
467        $objQuery->setOrder("T2.level DESC");
468        return $this->getProductsClassByQuery($objQuery, $productIds);
469    }
470
471    /**
472     * 商品IDに紐づいた, 商品規格を階層ごとに取得する.
473     *
474     * @param array $productId 商品ID
475     * @return array 階層ごとの商品規格の配列
476     */
477    function getProductsClassLevelByProductId($productId) {
478        $results = $this->getProductsClassByProductIds(array($productId));
479        return $this->getProductsClassLevel($results);
480    }
481
482    /**
483     * 商品IDに紐づいた, 商品規格をすべての組み合わせごとに取得する.
484     *
485     * @param array $productId 商品ID
486     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
487     * @return array すべての組み合わせの商品規格の配列
488     */
489    function getProductsClassFullByProductId($productId, $has_deleted = false) {
490        $results = $this->getProductsClassByProductIds(array($productId), $has_deleted);
491        return $this->getProductsClassFull($results);
492    }
493
494    /**
495     * 商品規格の配列から, 商品規格を階層ごとに取得する.
496     *
497     * @access private
498     * @param array $productsClassResults 商品規格の結果の配列
499     * @return array 階層ごとの商品規格の配列
500     */
501    function getProductsClassLevel($productsClassResults) {
502        foreach ($productsClassResults as $row) {
503            $productsClassLevel['level' . $row['level']][] = $row;
504        }
505        return $productsClassLevel;
506    }
507
508    /**
509     * 商品規格の配列から, 商品規格のすべての組み合わせを取得する.
510     *
511     * @access private
512     * @param array $productsClassResults 商品規格の結果の配列
513     * @ array 階層ごとの商品規格の配列
514     */
515    function getProductsClassFull($productsClassResults) {
516        $results = $this->getProductsClassLevel($productsClassResults);
517        $productsClass = array();
518        if (SC_Utils_Ex::isBlank($results["level1"])
519            && SC_Utils_Ex::isBlank($results["level2"])) {
520            return $results['level'];
521        }
522
523        foreach ($results["level1"] as $level1) {
524            foreach ($results["level2"] as $level2) {
525                if ($level2['parent_class_combination_id'] == $level1['class_combination_id']) {
526                    $level1 = array_merge($level1, $level2);
527                }
528            }
529            $productsClass[] = $level1;
530        }
531        return $productsClass;
532    }
533
534    /**
535     * 商品IDをキーにした, 商品ステータスIDの配列を取得する.
536     *
537     * @param array 商品ID の配列
538     * @return array 商品IDをキーにした商品ステータスIDの配列
539     */
540    function getProductStatus($productIds) {
541        if (empty($productIds)) {
542            return array();
543        }
544        $objQuery =& SC_Query_Ex::getSingletonInstance();
545        $cols = 'product_id, product_status_id';
546        $from = 'dtb_product_status';
547        $where = 'del_flg = 0 AND product_id IN (' . implode(', ', array_pad(array(), count($productIds), '?')) . ')';
548        $productStatus = $objQuery->select($cols, $from, $where, $productIds);
549        $results = array();
550        foreach ($productStatus as $status) {
551            $results[$status['product_id']][] = $status['product_status_id'];
552        }
553        return $results;
554    }
555
556    /**
557     * 商品ステータスを設定する.
558     *
559     * TODO 現在は DELETE/INSERT だが, UPDATE を検討する.
560     *
561     * @param integer $productId 商品ID
562     * @param array $productStatusIds ON にする商品ステータスIDの配列
563     */
564    function setProductStatus($productId, $productStatusIds) {
565
566        $val['product_id'] = $productId;
567        $val['creator_id'] = $_SESSION['member_id'];
568        $val['create_date'] = 'CURRENT_TIMESTAMP';
569        $val['update_date'] = 'CURRENT_TIMESTAMP';
570        $val['del_flg'] = '0';
571
572        $objQuery =& SC_Query_Ex::getSingletonInstance();
573        $objQuery->delete('dtb_product_status', 'product_id = ?', array($productId));
574        foreach ($productStatusIds as $productStatusId) {
575            if($productStatusId == '') continue;
576            $val['product_status_id'] = $productStatusId;
577            $objQuery->insert('dtb_product_status', $val);
578        }
579    }
580
581    /**
582     * 商品詳細の結果から, 購入制限数を取得する.
583     *
584     * getDetailAndProductsClass() の結果から, 購入制限数を取得する.
585     *
586     * @param array $p 商品詳細の検索結果の配列
587     * @return integer 商品詳細の結果から求めた購入制限数.
588     * @see getDetailAndProductsClass()
589     */
590    function getBuyLimit($p) {
591        $limit = null;
592        if ($p['stock_unlimited'] != '1' && is_numeric($p['sale_limit'])) {
593            $limit = min($p['sale_limit'], $p['stock']);
594        } elseif (is_numeric($p['sale_limit'])) {
595            $limit = $p['sale_limit'];
596        } elseif ($p['stock_unlimited'] != '1') {
597            $limit = $p['stock'];
598        }
599        return $limit;
600    }
601
602    /**
603     * 在庫を減少させる.
604     *
605     * 指定の在庫数まで, 在庫を減少させる.
606     * 減少させた結果, 在庫数が 0 未満になった場合, 引数 $quantity が 0 の場合は,
607     * 在庫の減少を中止し, false を返す.
608     * 在庫の減少に成功した場合は true を返す.
609     *
610     * @param integer $productClassId 商品規格ID
611     * @param integer $quantity 減少させる在庫数
612     * @return boolean 在庫の減少に成功した場合 true; 失敗した場合 false
613     */
614    function reduceStock($productClassId, $quantity) {
615
616        if ($quantity == 0) {
617            return false;
618        }
619
620        $objQuery =& SC_Query_Ex::getSingletonInstance();
621        $objQuery->update('dtb_products_class', array(),
622                          "product_class_id = ?", array($productClassId),
623                          array('stock' => 'stock - ?'), array($quantity));
624        // TODO エラーハンドリング
625
626        $productsClass = $this->getDetailAndProductsClass($productClassId);
627        if ($productsClass['stock_unlimited'] != '1' && $productsClass['stock'] < 0) {
628            return false;
629        }
630
631        return true;
632    }
633
634    /**
635     * 商品情報の配列に, 税込金額を設定して返す.
636     *
637     * この関数は, 主にスマートフォンで使用します.
638     *
639     * @param array $arrProducts 商品情報の配列
640     * @return array 税込金額を設定した商品情報の配列
641     */
642    function setPriceTaxTo($arrProducts) {
643        foreach ($arrProducts as $key=>$val) {
644            $arrProducts[$key]['price01_min_format'] = number_format($arrProducts[$key]['price01_min']);
645            $arrProducts[$key]['price01_max_format'] = number_format($arrProducts[$key]['price01_max']);
646            $arrProducts[$key]['price02_min_format'] = number_format($arrProducts[$key]['price02_min']);
647            $arrProducts[$key]['price02_max_format'] = number_format($arrProducts[$key]['price02_max']);
648
649            $arrProducts[$key]['price01_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_min']);
650            $arrProducts[$key]['price01_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_max']);
651            $arrProducts[$key]['price02_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_min']);
652            $arrProducts[$key]['price02_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_max']);
653
654            $arrProducts[$key]['price01_min_tax_format'] = number_format($arrProducts[$key]['price01_min_tax']);
655            $arrProducts[$key]['price01_max_tax_format'] = number_format($arrProducts[$key]['price01_max_tax']);
656            $arrProducts[$key]['price02_min_tax_format'] = number_format($arrProducts[$key]['price02_min_tax']);
657            $arrProducts[$key]['price02_max_tax_format'] = number_format($arrProducts[$key]['price02_max_tax']);
658        }
659        return $arrProducts;
660    }
661
662    /**
663     * 商品詳細の SQL を取得する.
664     *
665     * @param string $where 商品詳細の WHERE 句
666     * @return string 商品詳細の SQL
667     */
668    function alldtlSQL($where = "") {
669        $where_clause = "";
670        if (!SC_Utils_Ex::isBlank($where)) {
671            $where_clause = " WHERE " . $where;
672        }
673        /*
674         * point_rate, deliv_fee は商品規格(dtb_products_class)ごとに保持しているが,
675         * 商品(dtb_products)ごとの設定なので MAX のみを取得する.
676         */
677        $sql = <<< __EOS__
678            (
679                SELECT 0
680                    ,dtb_products.product_id
681                    ,dtb_products.name
682                    ,dtb_products.maker_id
683                    ,dtb_products.status
684                    ,dtb_products.comment1
685                    ,dtb_products.comment2
686                    ,dtb_products.comment3
687                    ,dtb_products.comment4
688                    ,dtb_products.comment5
689                    ,dtb_products.comment6
690                    ,dtb_products.note
691                    ,dtb_products.main_list_comment
692                    ,dtb_products.main_list_image
693                    ,dtb_products.main_comment
694                    ,dtb_products.main_image
695                    ,dtb_products.main_large_image
696                    ,dtb_products.sub_title1
697                    ,dtb_products.sub_comment1
698                    ,dtb_products.sub_image1
699                    ,dtb_products.sub_large_image1
700                    ,dtb_products.sub_title2
701                    ,dtb_products.sub_comment2
702                    ,dtb_products.sub_image2
703                    ,dtb_products.sub_large_image2
704                    ,dtb_products.sub_title3
705                    ,dtb_products.sub_comment3
706                    ,dtb_products.sub_image3
707                    ,dtb_products.sub_large_image3
708                    ,dtb_products.sub_title4
709                    ,dtb_products.sub_comment4
710                    ,dtb_products.sub_image4
711                    ,dtb_products.sub_large_image4
712                    ,dtb_products.sub_title5
713                    ,dtb_products.sub_comment5
714                    ,dtb_products.sub_image5
715                    ,dtb_products.sub_large_image5
716                    ,dtb_products.sub_title6
717                    ,dtb_products.sub_comment6
718                    ,dtb_products.sub_image6
719                    ,dtb_products.sub_large_image6
720                    ,dtb_products.del_flg
721                    ,dtb_products.creator_id
722                    ,dtb_products.create_date
723                    ,dtb_products.update_date
724                    ,dtb_products.deliv_date_id
725                    ,T4.product_code_min
726                    ,T4.product_code_max
727                    ,T4.price01_min
728                    ,T4.price01_max
729                    ,T4.price02_min
730                    ,T4.price02_max
731                    ,T4.stock_min
732                    ,T4.stock_max
733                    ,T4.stock_unlimited_min
734                    ,T4.stock_unlimited_max
735                    ,T4.point_rate
736                    ,T4.deliv_fee
737                    ,T4.class_count
738                    ,dtb_maker.name AS maker_name
739                FROM dtb_products
740                    JOIN (
741                       SELECT product_id,
742                              MIN(product_code) AS product_code_min,
743                              MAX(product_code) AS product_code_max,
744                              MIN(price01) AS price01_min,
745                              MAX(price01) AS price01_max,
746                              MIN(price02) AS price02_min,
747                              MAX(price02) AS price02_max,
748                              MIN(stock) AS stock_min,
749                              MAX(stock) AS stock_max,
750                              MIN(stock_unlimited) AS stock_unlimited_min,
751                              MAX(stock_unlimited) AS stock_unlimited_max,
752                              MAX(point_rate) AS point_rate,
753                              MAX(deliv_fee) AS deliv_fee,
754                              COUNT(*) as class_count
755                        FROM dtb_products_class
756                        $where_clause
757                        GROUP BY product_id
758                    ) AS T4
759                        ON dtb_products.product_id = T4.product_id
760                    LEFT JOIN dtb_maker
761                        ON dtb_products.maker_id = dtb_maker.maker_id
762            ) AS alldtl
763__EOS__;
764        return $sql;
765    }
766
767    /**
768     * 商品規格詳細の SQL を取得する.
769     *
770     * MEMO: 2.4系 vw_product_classに相当(?)するイメージ
771     *
772     * @param string $where 商品詳細の WHERE 句
773     * @return string 商品規格詳細の SQL
774     */
775    function prdclsSQL($where = "") {
776        $where_clause = "";
777        if (!SC_Utils_Ex::isBlank($where)) {
778            $where_clause = " WHERE " . $where;
779        }
780        $sql = <<< __EOS__
781        (
782             SELECT dtb_products.*,
783                    dtb_products_class.product_class_id,
784                    dtb_products_class.class_combination_id,
785                    dtb_products_class.product_type_id,
786                    dtb_products_class.product_code,
787                    dtb_products_class.stock,
788                    dtb_products_class.stock_unlimited,
789                    dtb_products_class.sale_limit,
790                    dtb_products_class.price01,
791                    dtb_products_class.price02,
792                    dtb_products_class.deliv_fee,
793                    dtb_products_class.point_rate,
794                    dtb_products_class.down_filename,
795                    dtb_products_class.down_realfilename,
796                    dtb_class_combination.parent_class_combination_id,
797                    dtb_class_combination.classcategory_id,
798                    dtb_class_combination.level as classlevel,
799                    Tpcm.classcategory_id as parent_classcategory_id,
800                    Tpcm.level as parent_classlevel,
801                    Tcc1.class_id as class_id,
802                    Tcc1.name as classcategory_name,
803                    Tcc2.class_id as parent_class_id,
804                    Tcc2.name as parent_classcategory_name
805             FROM dtb_products
806                 LEFT JOIN dtb_products_class
807                     ON dtb_products.product_id = dtb_products_class.product_id
808                 LEFT JOIN dtb_class_combination
809                     ON dtb_products_class.class_combination_id = dtb_class_combination.class_combination_id
810                 LEFT JOIN dtb_class_combination as Tpcm
811                     ON dtb_class_combination.parent_class_combination_id = Tpcm.class_combination_id
812                 LEFT JOIN dtb_classcategory as Tcc1
813                     ON dtb_class_combination.classcategory_id = Tcc1.classcategory_id
814                 LEFT JOIN dtb_classcategory as Tcc2
815                     ON Tpcm.classcategory_id = Tcc2.classcategory_id
816             $where_clause
817        ) as prdcls
818__EOS__;
819        return $sql;
820    }
821
822    /**
823     * 商品規格ID1、2に紐づいた,product_class_idを取得する.
824     *
825     * @param int $productId 商品ID
826     * @param int $classcategory_id1 商品規格ID1
827     * @param int $classcategory_id2 商品規格ID2
828     * @return string product_class_id
829     */
830    function getClasscategoryIdsByProductClassId($productId, $classcategory_id1, $classcategory_id2) {
831        $objQuery = new SC_Query_Ex();
832        $col = "T1.product_id AS product_id,T1.product_class_id AS product_class_id,T1.classcategory_id1 AS classcategory_id1,T1.classcategory_id2 AS classcategory_id2";
833        $table = <<< __EOS__
834            (SELECT
835                pc.product_code AS product_code,
836                pc.product_id AS product_id,
837                pc.product_class_id AS product_class_id,
838                pc.class_combination_id AS class_combination_id,
839                COALESCE(cc2.classcategory_id,0) AS classcategory_id1,
840                COALESCE(cc1.classcategory_id,0) AS classcategory_id2
841            FROM
842                dtb_products_class pc LEFT JOIN dtb_class_combination cc1 ON pc.class_combination_id = cc1.class_combination_id
843                LEFT JOIN dtb_class_combination cc2 ON cc1.parent_class_combination_id = cc2.class_combination_id) T1
844__EOS__;
845        $where = "T1.product_id = ? AND T1.classcategory_id1 = ? AND T1.classcategory_id2 = ?";
846        $arrRet = $objQuery->select($col, $table, $where,
847                                    array($productId, $classcategory_id1, $classcategory_id2));
848        return $arrRet[0]['product_class_id'];
849    }
850
851}
852?>
Note: See TracBrowser for help on using the repository browser.