source: branches/version-2_12-dev/data/class/SC_Product.php @ 21639

Revision 21639, 28.2 KB checked in by pingpong, 12 years ago (diff)

コメントアウト方法ミスによりエラーが出ていたため対処

  • 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__EOS__;
78        $objQuery->setGroupBy('alldtl.product_id');
79        if (is_array($this->arrOrderData) and $objQuery->order == '') {
80            $o_col = $this->arrOrderData['col'];
81            $o_table = $this->arrOrderData['table'];
82            $o_order = $this->arrOrderData['order'];
83            $order = <<< __EOS__
84                    (
85                        SELECT $o_col
86                        FROM
87                            $o_table as T2
88                        WHERE T2.product_id = alldtl.product_id
89                        ORDER BY T2.$o_col $o_order
90                        LIMIT 1
91                    ) $o_order, product_id
92__EOS__;
93            $objQuery->setOrder($order);
94        }
95        $results = $objQuery->select('alldtl.product_id', $table, '', $arrVal, MDB2_FETCHMODE_ORDERED);
96        $resultValues = array();
97        foreach ($results as $val) {
98            $resultValues[] = $val[0];
99        }
100        return $resultValues;
101    }
102
103    /**
104     * SC_Queryインスタンスに設定された検索条件をもとに対象商品数を取得する.
105     *
106     * 検索条件は, SC_Query::setWhere() 関数で設定しておく必要があります.
107     *
108     * @param SC_Query $objQuery SC_Query インスタンス
109     * @param array $arrVal 検索パラメーターの配列
110     * @return array 対象商品ID数
111     */
112    function findProductCount(&$objQuery, $arrVal = array()) {
113        $table = <<< __EOS__
114            dtb_products AS alldtl
115__EOS__;
116        return $objQuery->count($table, '', $arrVal);
117    }
118
119    /**
120     * SC_Queryインスタンスに設定された検索条件をもとに商品一覧の配列を取得する.
121     *
122     * 主に SC_Product::findProductIds() で取得した商品IDを検索条件にし,
123     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
124     * の配列を取得する.
125     *
126     * @param SC_Query $objQuery SC_Query インスタンス
127     * @return array 商品一覧の配列
128     */
129    function lists(&$objQuery) {
130        $col = <<< __EOS__
131             product_id
132            ,product_code_min
133            ,product_code_max
134            ,name
135            ,comment1
136            ,comment2
137            ,comment3
138            ,main_list_comment
139            ,main_image
140            ,main_list_image
141            ,price01_min
142            ,price01_max
143            ,price02_min
144            ,price02_max
145            ,stock_min
146            ,stock_max
147            ,stock_unlimited_min
148            ,stock_unlimited_max
149            ,deliv_date_id
150            ,status
151            ,del_flg
152            ,update_date
153__EOS__;
154        $res = $objQuery->select($col, $this->alldtlSQL());
155        return $res;
156    }
157
158
159    /**
160     * 商品IDを指定し、商品一覧を取得する
161     *
162     * SC_Query::setOrder() や SC_Query::setLimitOffset() を設定して, 商品一覧
163     * の配列を取得する.
164     * FIXME: 呼び出し元で設定した、SC_Query::setWhere() も有効に扱いたい。
165     *
166     * @param SC_Query $objQuery SC_Query インスタンス
167     * @param array $arrProductId 商品ID
168     * @return array 商品一覧の配列 (キー: 商品ID)
169     */
170    function getListByProductIds(&$objQuery, $arrProductId = array()) {
171        if (empty($arrProductId)) {
172            return array();
173        }
174
175        $where = 'alldtl.product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($arrProductId)) . ')';
176        $where .= ' AND alldtl.del_flg = 0';
177
178        $objQuery->setWhere($where, $arrProductId);
179        $arrProducts = $this->lists($objQuery);
180
181        // 配列のキーを商品IDに
182        $arrTmp = array();
183        foreach ($arrProducts as $arrProduct) {
184            $arrTmp[$arrProduct['product_id']] = $arrProduct;
185        }
186        $arrProducts =& $arrTmp;
187        unset($arrTmp);
188
189        // SC_Query::setOrder() の指定がない場合、$arrProductId で指定された商品IDの順に配列要素を並び替え
190        if (strlen($objQuery->order) === 0) {
191            $arrTmp = array();
192            foreach ($arrProductId as $product_id) {
193                $arrTmp[$product_id] = $arrProducts[$product_id];
194            }
195            $arrProducts =& $arrTmp;
196            unset($arrTmp);
197        }
198
199        return $arrProducts;
200    }
201
202    /**
203     * 商品詳細を取得する.
204     *
205     * @param integer $productId 商品ID
206     * @return array 商品詳細情報の配列
207     */
208    function getDetail($productId) {
209        $objQuery =& SC_Query_Ex::getSingletonInstance();
210        $result = $objQuery->select('*', $this->alldtlSQL('product_id = ?'),
211                                    'product_id = ?',
212                                    array($productId, $productId));
213        return $result[0];
214    }
215
216    /**
217     * 商品詳細情報と商品規格を取得する.
218     *
219     * @param integer $productClassId 商品規格ID
220     * @return array 商品詳細情報と商品規格の配列
221     */
222    function getDetailAndProductsClass($productClassId) {
223        $result = $this->getProductsClass($productClassId);
224        $result = array_merge($result, $this->getDetail($result['product_id']));
225        return $result;
226    }
227
228    /**
229     * 商品IDに紐づく商品規格を自分自身に設定する.
230     *
231     * 引数の商品IDの配列に紐づく商品規格を取得し, 自分自身のフィールドに
232     * 設定する.
233     *
234     * @param array $arrProductId 商品ID の配列
235     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
236     * @return void
237     */
238    function setProductsClassByProductIds($arrProductId, $has_deleted = false) {
239
240        foreach ($arrProductId as $productId) {
241            $arrProductClasses = $this->getProductsClassFullByProductId($productId, $has_deleted);
242
243            $classCats1 = array();
244            $classCats1['__unselected'] = '選択してください';
245
246            // 規格1クラス名
247            $this->className1[$productId] =
248                isset($arrProductClasses[0]['class_name1'])
249                ? $arrProductClasses[0]['class_name1']
250                : '';
251
252            // 規格2クラス名
253            $this->className2[$productId] =
254                isset($arrProductClasses[0]['class_name2'])
255                ? $arrProductClasses[0]['class_name2']
256                : '';
257
258            // 規格1が設定されている
259            $this->classCat1_find[$productId] = $arrProductClasses[0]['classcategory_id1'] > 0; // 要変更ただし、他にも改修が必要となる
260            // 規格2が設定されている
261            $this->classCat2_find[$productId] = $arrProductClasses[0]['classcategory_id2'] > 0; // 要変更ただし、他にも改修が必要となる
262
263            $this->stock_find[$productId] = false;
264            $classCategories = array();
265            $classCategories['__unselected']['__unselected']['name'] = '選択してください';
266            $classCategories['__unselected']['__unselected']['product_class_id'] = $arrProductClasses[0]['product_class_id'];
267            // 商品種別
268            $classCategories['__unselected']['__unselected']['product_type'] = $arrProductClasses[0]['product_type_id'];
269            $this->product_class_id[$productId] = $arrProductClasses[0]['product_class_id'];
270            // 商品種別
271            $this->product_type[$productId] = $arrProductClasses[0]['product_type_id'];
272            foreach ($arrProductClasses as $arrProductsClass) {
273                $arrClassCats2 = array();
274                $classcategory_id1 = $arrProductsClass['classcategory_id1'];
275                $classcategory_id2 = $arrProductsClass['classcategory_id2'];
276                // 在庫
277                $stock_find_class = ($arrProductsClass['stock_unlimited'] || $arrProductsClass['stock'] > 0);
278
279                $arrClassCats2['classcategory_id2'] = $classcategory_id2;
280                $arrClassCats2['name'] = $arrProductsClass['classcategory_name2'] . ($stock_find_class ? '' : ' (品切れ中)');
281
282                $arrClassCats2['stock_find'] = $stock_find_class;
283
284                if ($stock_find_class) {
285                    $this->stock_find[$productId] = true;
286                }
287
288                if (!in_array($classcat_id1, $classCats1)) {
289                    $classCats1[$classcategory_id1] = $arrProductsClass['classcategory_name1']
290                        . ($classcategory_id2 == 0 && !$stock_find_class ? ' (品切れ中)' : '');
291                }
292
293                // 価格
294                $arrClassCats2['price01']
295                    = strlen($arrProductsClass['price01'])
296                    ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($arrProductsClass['price01']))
297                    : '';
298
299                $arrClassCats2['price02']
300                    = strlen($arrProductsClass['price02'])
301                    ? number_format(SC_Helper_DB_Ex::sfCalcIncTax($arrProductsClass['price02']))
302                    : '';
303
304                // ポイント
305                $arrClassCats2['point']
306                    = number_format(SC_Utils_Ex::sfPrePoint($arrProductsClass['price02'], $arrProductsClass['point_rate']));
307
308                // 商品コード
309                $arrClassCats2['product_code'] = $arrProductsClass['product_code'];
310                // 商品規格ID
311                $arrClassCats2['product_class_id'] = $arrProductsClass['product_class_id'];
312                // 商品種別
313                $arrClassCats2['product_type'] = $arrProductsClass['product_type_id'];
314
315                // #929(GC8 規格のプルダウン順序表示不具合)対応のため、2次キーは「#」を前置
316                if (!$this->classCat1_find[$productId]) {
317                    $classcategory_id1 = '__unselected2';
318                }
319                $classCategories[$classcategory_id1]['#'] = array(
320                    'classcategory_id2' => '',
321                    'name' => '選択してください',
322                );
323                $classCategories[$classcategory_id1]['#' . $classcategory_id2] = $arrClassCats2;
324            }
325
326            $this->classCategories[$productId] = $classCategories;
327
328            // 規格1
329            $this->classCats1[$productId] = $classCats1;
330        }
331    }
332
333    /**
334     * SC_Query インスタンスに設定された検索条件を使用して商品規格を取得する.
335     *
336     * @param SC_Query $objQuery SC_Queryインスタンス
337     * @param array $params 検索パラメーターの配列
338     * @return array 商品規格の配列
339     */
340    function getProductsClassByQuery(&$objQuery, $params) {
341        // 末端の規格を取得
342        $col = <<< __EOS__
343            T1.product_id,
344            T1.stock,
345            T1.stock_unlimited,
346            T1.sale_limit,
347            T1.price01,
348            T1.price02,
349            T1.point_rate,
350            T1.product_code,
351            T1.product_class_id,
352            T1.del_flg,
353            T1.product_type_id,
354            T1.down_filename,
355            T1.down_realfilename,
356            T3.name AS classcategory_name1,
357            T3.rank AS rank1,
358            T4.name AS class_name1,
359            T4.class_id AS class_id1,
360            T1.classcategory_id1,
361            T1.classcategory_id2,
362            dtb_classcategory2.name AS classcategory_name2,
363            dtb_classcategory2.rank AS rank2,
364            dtb_class2.name AS class_name2,
365            dtb_class2.class_id AS class_id2
366__EOS__;
367        $table = <<< __EOS__
368            dtb_products_class T1
369            LEFT JOIN dtb_classcategory T3
370                ON T1.classcategory_id1 = T3.classcategory_id
371            LEFT JOIN dtb_class T4
372                ON T3.class_id = T4.class_id
373            LEFT JOIN dtb_classcategory dtb_classcategory2
374                ON T1.classcategory_id2 = dtb_classcategory2.classcategory_id
375            LEFT JOIN dtb_class dtb_class2
376                ON dtb_classcategory2.class_id = dtb_class2.class_id
377__EOS__;
378
379        $objQuery->setOrder('T3.rank DESC'); // XXX
380        $arrRet = $objQuery->select($col, $table, '', $params);
381
382        return $arrRet;
383    }
384
385    /**
386     * 商品規格IDから商品規格を取得する.
387     *
388     * 削除された商品規格は取得しない.
389     *
390     * @param integer $productClassId 商品規格ID
391     * @return array 商品規格の配列
392     */
393    function getProductsClass($productClassId) {
394        $objQuery =& SC_Query_Ex::getSingletonInstance();
395        $objQuery->setWhere('product_class_id = ? AND T1.del_flg = 0');
396        $arrRes = $this->getProductsClassByQuery($objQuery, $productClassId);
397        return $arrRes[0];
398    }
399
400    /**
401     * 複数の商品IDに紐づいた, 商品規格を取得する.
402     *
403     * @param array $productIds 商品IDの配列
404     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
405     * @return array 商品規格の配列
406     */
407    function getProductsClassByProductIds($productIds = array(), $has_deleted = false) {
408        if (empty($productIds)) {
409            return array();
410        }
411        $objQuery =& SC_Query_Ex::getSingletonInstance();
412        $where = 'product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($productIds)) . ')';
413        if (!$has_deleted) {
414            $where .= ' AND T1.del_flg = 0';
415        }
416        $objQuery->setWhere($where);
417        return $this->getProductsClassByQuery($objQuery, $productIds);
418    }
419
420    /**
421     * 商品IDに紐づいた, 商品規格をすべての組み合わせごとに取得する.
422     *
423     * @param array $productId 商品ID
424     * @param boolean $has_deleted 削除された商品規格も含む場合 true; 初期値 false
425     * @return array すべての組み合わせの商品規格の配列
426     */
427    function getProductsClassFullByProductId($productId, $has_deleted = false) {
428        $arrRet = $this->getProductsClassByProductIds(array($productId), $has_deleted);
429        return $arrRet;
430    }
431
432    /**
433     * 商品IDをキーにした, 商品ステータスIDの配列を取得する.
434     *
435     * @param array 商品ID の配列
436     * @return array 商品IDをキーにした商品ステータスIDの配列
437     */
438    function getProductStatus($productIds) {
439        if (empty($productIds)) {
440            return array();
441        }
442        $objQuery =& SC_Query_Ex::getSingletonInstance();
443        $cols = 'product_id, product_status_id';
444        $from = 'dtb_product_status';
445        $where = 'del_flg = 0 AND product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($productIds)) . ')';
446        $productStatus = $objQuery->select($cols, $from, $where, $productIds);
447        $results = array();
448        foreach ($productStatus as $status) {
449            $results[$status['product_id']][] = $status['product_status_id'];
450        }
451        return $results;
452    }
453
454    /**
455     * 商品ステータスを設定する.
456     *
457     * TODO 現在は DELETE/INSERT だが, UPDATE を検討する.
458     *
459     * @param integer $productId 商品ID
460     * @param array $productStatusIds ON にする商品ステータスIDの配列
461     */
462    function setProductStatus($productId, $productStatusIds) {
463
464        $val['product_id'] = $productId;
465        $val['creator_id'] = $_SESSION['member_id'];
466        $val['create_date'] = 'CURRENT_TIMESTAMP';
467        $val['update_date'] = 'CURRENT_TIMESTAMP';
468        $val['del_flg'] = '0';
469
470        $objQuery =& SC_Query_Ex::getSingletonInstance();
471        $objQuery->delete('dtb_product_status', 'product_id = ?', array($productId));
472        foreach ($productStatusIds as $productStatusId) {
473            if($productStatusId == '') continue;
474            $val['product_status_id'] = $productStatusId;
475            $objQuery->insert('dtb_product_status', $val);
476        }
477    }
478
479    /**
480     * 商品詳細の結果から, 販売制限数を取得する.
481     *
482     * getDetailAndProductsClass() の結果から, 販売制限数を取得する.
483     *
484     * @param array $p 商品詳細の検索結果の配列
485     * @return integer 商品詳細の結果から求めた販売制限数.
486     * @see getDetailAndProductsClass()
487     */
488    function getBuyLimit($p) {
489        $limit = null;
490        if ($p['stock_unlimited'] != '1' && is_numeric($p['sale_limit'])) {
491            $limit = min($p['sale_limit'], $p['stock']);
492        } elseif (is_numeric($p['sale_limit'])) {
493            $limit = $p['sale_limit'];
494        } elseif ($p['stock_unlimited'] != '1') {
495            $limit = $p['stock'];
496        }
497        return $limit;
498    }
499
500    /**
501     * 在庫を減少させる.
502     *
503     * 指定の在庫数まで, 在庫を減少させる.
504     * 減少させた結果, 在庫数が 0 未満になった場合, 引数 $quantity が 0 の場合は,
505     * 在庫の減少を中止し, false を返す.
506     * 在庫の減少に成功した場合は true を返す.
507     *
508     * @param integer $productClassId 商品規格ID
509     * @param integer $quantity 減少させる在庫数
510     * @return boolean 在庫の減少に成功した場合 true; 失敗した場合 false
511     */
512    function reduceStock($productClassId, $quantity) {
513
514        if ($quantity == 0) {
515            return false;
516        }
517
518        $objQuery =& SC_Query_Ex::getSingletonInstance();
519        $objQuery->update('dtb_products_class', array(),
520                          'product_class_id = ?', array($productClassId),
521                          array('stock' => 'stock - ?'), array($quantity));
522        // TODO エラーハンドリング
523
524        $productsClass = $this->getDetailAndProductsClass($productClassId);
525        if ($productsClass['stock_unlimited'] != '1' && $productsClass['stock'] < 0) {
526            return false;
527        }
528
529        return true;
530    }
531
532    /**
533     * 商品情報の配列に, 税込金額を設定して返す.
534     *
535     * この関数は, 主にスマートフォンで使用します.
536     *
537     * @param array $arrProducts 商品情報の配列
538     * @return array 税込金額を設定した商品情報の配列
539     */
540    function setPriceTaxTo($arrProducts) {
541        foreach ($arrProducts as $key=>$val) {
542            $arrProducts[$key]['price01_min_format'] = number_format($arrProducts[$key]['price01_min']);
543            $arrProducts[$key]['price01_max_format'] = number_format($arrProducts[$key]['price01_max']);
544            $arrProducts[$key]['price02_min_format'] = number_format($arrProducts[$key]['price02_min']);
545            $arrProducts[$key]['price02_max_format'] = number_format($arrProducts[$key]['price02_max']);
546
547            $arrProducts[$key]['price01_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_min']);
548            $arrProducts[$key]['price01_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price01_max']);
549            $arrProducts[$key]['price02_min_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_min']);
550            $arrProducts[$key]['price02_max_tax'] = SC_Helper_DB::sfCalcIncTax($arrProducts[$key]['price02_max']);
551
552            $arrProducts[$key]['price01_min_tax_format'] = number_format($arrProducts[$key]['price01_min_tax']);
553            $arrProducts[$key]['price01_max_tax_format'] = number_format($arrProducts[$key]['price01_max_tax']);
554            $arrProducts[$key]['price02_min_tax_format'] = number_format($arrProducts[$key]['price02_min_tax']);
555            $arrProducts[$key]['price02_max_tax_format'] = number_format($arrProducts[$key]['price02_max_tax']);
556        }
557        return $arrProducts;
558    }
559
560    /**
561     * 商品詳細の SQL を取得する.
562     *
563     * @param string $where_products_class 商品規格情報の WHERE 句
564     * @return string 商品詳細の SQL
565     */
566    function alldtlSQL($where_products_class = '') {
567        $where_clause = '';
568        if (!SC_Utils_Ex::isBlank($where_products_class)) {
569            $where_products_class = 'AND (' . $where_products_class . ')';
570        }
571        /*
572         * point_rate, deliv_fee は商品規格(dtb_products_class)ごとに保持しているが,
573         * 商品(dtb_products)ごとの設定なので MAX のみを取得する.
574         */
575        $sql = <<< __EOS__
576            (
577                SELECT 0
578                    ,dtb_products.product_id
579                    ,dtb_products.name
580                    ,dtb_products.maker_id
581                    ,dtb_products.status
582                    ,dtb_products.comment1
583                    ,dtb_products.comment2
584                    ,dtb_products.comment3
585                    ,dtb_products.comment4
586                    ,dtb_products.comment5
587                    ,dtb_products.comment6
588                    ,dtb_products.note
589                    ,dtb_products.main_list_comment
590                    ,dtb_products.main_list_image
591                    ,dtb_products.main_comment
592                    ,dtb_products.main_image
593                    ,dtb_products.main_large_image
594                    ,dtb_products.sub_title1
595                    ,dtb_products.sub_comment1
596                    ,dtb_products.sub_image1
597                    ,dtb_products.sub_large_image1
598                    ,dtb_products.sub_title2
599                    ,dtb_products.sub_comment2
600                    ,dtb_products.sub_image2
601                    ,dtb_products.sub_large_image2
602                    ,dtb_products.sub_title3
603                    ,dtb_products.sub_comment3
604                    ,dtb_products.sub_image3
605                    ,dtb_products.sub_large_image3
606                    ,dtb_products.sub_title4
607                    ,dtb_products.sub_comment4
608                    ,dtb_products.sub_image4
609                    ,dtb_products.sub_large_image4
610                    ,dtb_products.sub_title5
611                    ,dtb_products.sub_comment5
612                    ,dtb_products.sub_image5
613                    ,dtb_products.sub_large_image5
614                    ,dtb_products.sub_title6
615                    ,dtb_products.sub_comment6
616                    ,dtb_products.sub_image6
617                    ,dtb_products.sub_large_image6
618                    ,dtb_products.del_flg
619                    ,dtb_products.creator_id
620                    ,dtb_products.create_date
621                    ,dtb_products.update_date
622                    ,dtb_products.deliv_date_id
623                    ,T4.product_code_min
624                    ,T4.product_code_max
625                    ,T4.price01_min
626                    ,T4.price01_max
627                    ,T4.price02_min
628                    ,T4.price02_max
629                    ,T4.stock_min
630                    ,T4.stock_max
631                    ,T4.stock_unlimited_min
632                    ,T4.stock_unlimited_max
633                    ,T4.point_rate
634                    ,T4.deliv_fee
635                    ,T4.class_count
636                    ,dtb_maker.name AS maker_name
637                FROM dtb_products
638                    JOIN (
639                        SELECT product_id,
640                            MIN(product_code) AS product_code_min,
641                            MAX(product_code) AS product_code_max,
642                            MIN(price01) AS price01_min,
643                            MAX(price01) AS price01_max,
644                            MIN(price02) AS price02_min,
645                            MAX(price02) AS price02_max,
646                            MIN(stock) AS stock_min,
647                            MAX(stock) AS stock_max,
648                            MIN(stock_unlimited) AS stock_unlimited_min,
649                            MAX(stock_unlimited) AS stock_unlimited_max,
650                            MAX(point_rate) AS point_rate,
651                            MAX(deliv_fee) AS deliv_fee,
652                            COUNT(*) as class_count
653                        FROM dtb_products_class
654                        WHERE del_flg = 0 $where_products_class
655                        GROUP BY product_id
656                    ) AS T4
657                        ON dtb_products.product_id = T4.product_id
658                    LEFT JOIN dtb_maker
659                        ON dtb_products.maker_id = dtb_maker.maker_id
660            ) AS alldtl
661__EOS__;
662        return $sql;
663    }
664
665    /**
666     * 商品規格詳細の SQL を取得する.
667     *
668     * MEMO: 2.4系 vw_product_classに相当(?)するイメージ
669     *
670     * @param string $where 商品詳細の WHERE 句
671     * @return string 商品規格詳細の SQL
672     */
673    function prdclsSQL($where = '') {
674        $where_clause = '';
675        if (!SC_Utils_Ex::isBlank($where)) {
676            $where_clause = ' WHERE ' . $where;
677        }
678        $sql = <<< __EOS__
679        (
680            SELECT dtb_products.*,
681                dtb_products_class.product_class_id,
682                dtb_products_class.product_type_id,
683                dtb_products_class.product_code,
684                dtb_products_class.stock,
685                dtb_products_class.stock_unlimited,
686                dtb_products_class.sale_limit,
687                dtb_products_class.price01,
688                dtb_products_class.price02,
689                dtb_products_class.deliv_fee,
690                dtb_products_class.point_rate,
691                dtb_products_class.down_filename,
692                dtb_products_class.down_realfilename,
693                dtb_products_class.classcategory_id1 AS classcategory_id, // 削除
694                dtb_products_class.classcategory_id1,
695                dtb_products_class.classcategory_id2 AS parent_classcategory_id, // 削除
696                dtb_products_class.classcategory_id2,
697                Tcc1.class_id as class_id,
698                Tcc1.name as classcategory_name,
699                Tcc2.class_id as parent_class_id,
700                Tcc2.name as parent_classcategory_name
701            FROM dtb_products
702                LEFT JOIN dtb_products_class
703                    ON dtb_products.product_id = dtb_products_class.product_id
704                LEFT JOIN dtb_classcategory as Tcc1
705                    ON dtb_products_class.classcategory_id1 = Tcc1.classcategory_id
706                LEFT JOIN dtb_classcategory as Tcc2
707                    ON dtb_products_class.classcategory_id2 = Tcc2.classcategory_id
708            $where_clause
709        ) as prdcls
710__EOS__;
711        return $sql;
712    }
713}
Note: See TracBrowser for help on using the repository browser.