source: branches/version-2_12-dev/test/createEcCubeData-v25.php @ 21937

Revision 21937, 18.9 KB checked in by pineray, 9 years ago (diff)

#1876 データ生成スクリプトでカテゴリーツリーが壊れる

ランクと親カテゴリーの指定に問題があった.

  • 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#!/usr/local/bin/php -q
2<?php
3/*
4 * EC-CUBE データ生成スクリプト
5 *
6 * Copyright(c) 2000-2012 LOCKON CO.,LTD. All Rights Reserved.
7 *
8 * http://www.lockon.co.jp/
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 *
24 * @auther Kentaro Ohkouchi
25 * @version $Id$
26 */
27
28// {{{ requires
29/** 適宜、htmlディレクトリへのrequire.phpを読み込めるよう パスを書き換えて下さい */
30require_once(dirname(__FILE__) . "/../html/require.php");
31
32// }}}
33// {{{ constants
34
35/** 大カテゴリの生成数 */
36define('TOP_CATEGORIES_VOLUME', 5);
37
38/** 中カテゴリの生成数 */
39define('MIDDLE_CATEGORIES_VOLUME', 2);
40
41/** 小カテゴリの生成数 */
42define('SMALL_CATEGORIES_VOLUME', 3);
43
44/** 規格1の生成数 */
45define('CLASSCATEGORY1_VOLUME', 10);
46
47/** 規格2の生成数 */
48define('CLASSCATEGORY2_VOLUME', 10);
49
50/** 商品の生成数 */
51define('PRODUCTS_VOLUME', 100);
52
53// }}}
54// {{{ Logic
55set_time_limit(0);
56while (@ob_end_flush());
57
58$objData = new CreateEcCubeData();
59$start = microtime(true);
60//$objData->objQuery->begin();
61
62// カテゴリ生成
63$objData->createCategories();
64// 規格生成
65$objData->createClassData();
66// 商品生成
67$objData->createProducts();
68// 商品と規格の関連づけ
69$objData->relateClass();
70// 商品とカテゴリの関連づけ
71$objData->relateProductsCategories();
72
73$objDb = new SC_Helper_DB_Ex();
74$objDb->sfCountCategory(NULL, true);
75
76//$objData->objQuery->rollback();
77//$objData->objQuery->commit();
78$end = microtime(true);
79print("データの生成が完了しました!\n");
80printf("所要時間 %f 秒\n", $end - $start);
81
82
83// }}}
84// {{{ classes
85
86/**
87 * EC-CUBE のデータを生成する
88 */
89class CreateEcCubeData {
90
91    /** SC_Query インスタンス */
92    var $objQuery;
93
94    /** 大カテゴリID の配列 */
95    var $arrCategory1  = array();
96
97    /** 中カテゴリID の配列 */
98    var $arrCategory2  = array();
99
100    /** 小カテゴリID の配列 */
101    var $arrCategory3  = array();
102
103    /** 規格1 */
104    var $arrClassCategory_id1 = array();
105
106    /** 規格2 */
107    var $arrClassCategory_id2 = array();
108
109    /** 削除するか */
110    var $delete = false;
111
112    /**
113     * コンストラクタ.
114     */
115    function CreateEcCubeData() {
116        $this->objQuery = new SC_Query();
117
118        // コマンドライン引数 --delete
119        $arrOption = getopt('', array('delete'));
120        if (isset($arrOption['delete'])) {
121            $this->delete = true;
122        }
123    }
124
125    /**
126     * カテゴリを生成する.
127     *
128     * 以下のように, ツリー状のカテゴリを生成する
129     *
130     *  大カテゴリ -- 中カテゴリ -- 小カテゴリ
131     *             |             |- 小カテゴリ
132     *             |             |- 小カテゴリ
133     *             |
134     *             |- 中カテゴリ -- 小カテゴリ
135     *                            |- 小カテゴリ
136     *                            |- 小カテゴリ
137     * @return void
138     */
139    function createCategories() {
140
141        print("カテゴリを生成しています...\n");
142
143        if ($this->delete) {
144            $this->objQuery->delete('dtb_category');
145            $existingMaxRank = 0;
146        } else {
147            $existingMaxRank = $this->objQuery->max('rank','dtb_category');
148        }
149
150        $count = 0;
151
152        // 全カテゴリ共通の値
153        $sqlval = array();
154        $sqlval['creator_id'] = 2;
155        $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
156        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
157        $sqlval['del_flg'] = (string) '0';
158
159        // 大カテゴリを生成
160        for ($i = 0; $i < TOP_CATEGORIES_VOLUME; $i++) {
161            $sqlval['category_name'] = sprintf("Category%d00", $i);
162            $sqlval['parent_category_id'] = (string) '0';
163            $sqlval['level'] = 1;
164            $sqlval['rank'] = $this->lfGetTotalCategoryrank($existingMaxRank) - $count;
165            $sqlval['category_id'] = $this->objQuery->nextVal('dtb_category_category_id');
166
167            $this->objQuery->insert('dtb_category', $sqlval);
168            $this->arrCategory1[] = $sqlval['category_id'];
169            $count++;
170            print(".");
171
172            $top_category_id = $sqlval['category_id'];
173            // 中カテゴリを生成
174            for ($j = 0; $j < MIDDLE_CATEGORIES_VOLUME; $j++) {
175                $sqlval['category_name'] = sprintf("Category%d%d0", $i,
176                                                   $j + MIDDLE_CATEGORIES_VOLUME);
177                $sqlval['parent_category_id'] = (string) $top_category_id;
178                $sqlval['level'] = 2;
179                $sqlval['rank'] = $this->lfGetTotalCategoryrank($existingMaxRank) - $count;
180                $sqlval['category_id'] = $this->objQuery->nextVal('dtb_category_category_id');
181
182                $this->objQuery->insert('dtb_category', $sqlval);
183                $this->arrCategory2[] = $sqlval['category_id'];
184                $count++;
185                print(".");
186
187                $middle_category_id = $sqlval['category_id'];
188                // 小カテゴリを生成
189                for ($k = 0; $k < SMALL_CATEGORIES_VOLUME; $k++) {
190                    $sqlval['category_name'] = sprintf("Category%d%d%d",
191                                                       $i, $j,
192                                                       $k + SMALL_CATEGORIES_VOLUME);
193                    $sqlval['parent_category_id'] = (string) $middle_category_id;
194                    $sqlval['level'] = 3;
195                    $sqlval['rank'] = $this->lfGetTotalCategoryrank($existingMaxRank) - $count;
196                    $sqlval['category_id'] = $this->objQuery->nextVal('dtb_category_category_id');
197
198                    $this->objQuery->insert('dtb_category', $sqlval);
199                    $this->arrCategory3[] = $sqlval['category_id'];
200                    $count++;
201                    print(".");
202                }
203            }
204        }
205        print("\n");
206    }
207
208    /**
209     * 規格を生成する.
210     *
211     * @return void
212     */
213    function createClassData() {
214        // 規格データ生成
215        print("規格データを生成しています...\n");
216
217        if ($this->delete) {
218            $this->objQuery->delete('dtb_class');
219        }
220
221        $this->createClass('Size');
222        $this->createClass('Color');
223        print("\n");
224
225        // 規格分類データ生成
226        print("規格分類データを生成しています...\n");
227
228        if ($this->delete) {
229            $this->objQuery->delete('dtb_classcategory');
230        }
231
232        // 規格1
233        for ($i = 0; $i < CLASSCATEGORY1_VOLUME; $i++) {
234            $this->createClassCategory($this->arrSize[$i],
235                                       $this->arrclass_id[0], 'size');
236        }
237
238        // 規格2
239        for ($i = 0; $i < CLASSCATEGORY2_VOLUME; $i++) {
240            $this->createClassCategory($this->arrColor[$i],
241                                       $this->arrclass_id[1], 'color');
242        }
243
244        print("\n");
245    }
246
247    /**
248     * 商品と規格の関連づけを行う.
249     *
250     * @return void
251     */
252    function relateClass() {
253
254        print("商品と規格の関連づけを行います...\n");
255
256        if ($this->delete) {
257            $this->objQuery->delete('dtb_products_class');
258        }
259
260        foreach ($this->arrProduct_id as $product_id) {
261            $this->createProductsClass($product_id);
262        }
263        print("\n");
264    }
265
266    /**
267     * 商品を生成する.
268     *
269     * @return void
270     */
271    function createProducts() {
272
273        print("商品を生成しています...\n");
274
275        if ($this->delete) {
276            $this->objQuery->delete('dtb_products');
277        }
278
279        for ($i = 0; $i < PRODUCTS_VOLUME; $i++) {
280            $sqlval = array();
281            $sqlval['product_id'] = $this->objQuery->nextval('dtb_products_product_id');
282            $sqlval['name'] = sprintf("商品%d", $i);
283            $sqlval['status'] = 1;
284            $sqlval['comment3'] = "コメント";
285            $sqlval['main_list_comment'] = "コメント";
286            $sqlval['main_list_image'] = "nabe130.jpg";
287            $sqlval['main_comment'] = "コメント";
288            $sqlval['main_image'] = "nabe260.jpg";
289            $sqlval['main_large_image'] = "nabe500.jpg";
290            $sqlval['sub_comment1'] = "コメント";
291            $sqlval['del_flg'] = (string) '0';
292            $sqlval['creator_id'] = 2;
293            $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
294            $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
295            $sqlval['deliv_date_id'] = 2;
296            $this->objQuery->insert('dtb_products', $sqlval);
297
298            $this->arrProduct_id[] = $sqlval['product_id'];
299            print("*");
300        }
301        print("\n");
302    }
303
304    /**
305     * 規格を生成する.
306     *
307     * @param $class_name string 規格名
308     * @return void
309     */
310    function createClass($class_name) {
311        $sqlval = array();
312        $arrRaw = array();
313        // class_idを取得
314        $sqlval['class_id'] = $this->objQuery->nextVal('dtb_class_class_id');
315        $sqlval['name'] = $class_name;
316        $arrRaw['rank'] = "(SELECT x.rank FROM (SELECT CASE
317                                      WHEN max(rank) + 1 IS NULL THEN 1
318                                      ELSE max(rank) + 1
319                                    END as rank
320                               FROM dtb_class
321                              WHERE del_flg = 0) as x)";
322        $sqlval['creator_id'] = 2;
323        $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
324        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
325        $sqlval['del_flg'] = (string) '0';
326        $this->objQuery->insert('dtb_class', $sqlval, $arrRaw);
327
328        $this->arrclass_id[] = $sqlval['class_id'];
329        print("+");
330    }
331
332    /**
333     * 規格分類を生成する.
334     *
335     * @param $classcategory_name string 規格名
336     * @return void
337     */
338    function createClassCategory($classcategory_name, $class_id, $class_name) {
339        $sqlval = array();
340        $arrRaw = array();
341        $sqlval['classcategory_id'] = $this->objQuery->nextVal('dtb_classcategory_classcategory_id');
342        $sqlval['name'] = $classcategory_name;
343        $sqlval['class_id'] = $class_id;
344        $arrRaw['rank'] = sprintf("(SELECT x.rank FROM (SELECT CASE
345                                              WHEN max(rank) + 1 IS NULL THEN 1
346                                              ELSE max(rank) + 1
347                                            END as rank
348                                       FROM dtb_classcategory
349                                      WHERE del_flg = 0
350                                        AND class_id = %d) as x)", $class_id);
351        $sqlval['creator_id'] = 2;
352        $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
353        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
354        $sqlval['del_flg'] = (string) '0';
355
356        $this->objQuery->insert('dtb_classcategory', $sqlval, $arrRaw);
357
358        switch ($class_name) {
359        case 'size':
360            $this->arrClassCategory_id1[] = $sqlval['classcategory_id'];
361            break;
362
363        case 'color':
364            $this->arrClassCategory_id2[] = $sqlval['classcategory_id'];
365            break;
366        default:
367        }
368        print("+");
369    }
370
371    /**
372     * 商品規格を生成する.
373     *
374     * @param integer $product_id 商品ID
375     * @return void
376     */
377    function createProductsClass($product_id) {
378
379        printf("商品ID %d の商品規格を生成しています...\n", $product_id);
380
381        $sqlval = array();
382        $sqlval['product_id'] = $product_id;
383        $sqlval['product_type_id'] = 1;
384        $sqlval['stock_unlimited'] = 1;
385        $sqlval['price01'] = 1000;
386        $sqlval['price02'] = 2000;
387        $sqlval['point_rate'] = 10;
388        $sqlval['creator_id'] = 2;
389        $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
390        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
391        $sqlval['del_flg'] = 0;
392
393        foreach ($this->arrClassCategory_id1 as $classcategory_id1) {
394            foreach ($this->arrClassCategory_id2 as $classcategory_id2) {
395                $sqlval['product_class_id'] = $this->objQuery->nextVal('dtb_products_class_product_class_id');
396                $sqlval['classcategory_id1'] = $classcategory_id1;
397                $sqlval['classcategory_id2'] = $classcategory_id2;
398                $sqlval['product_code'] = 'CODE_' . $product_id . '_' . $classcategory_id1 . '_' . $classcategory_id2;
399                $this->objQuery->insert('dtb_products_class', $sqlval);
400
401                print("#");
402            }
403        }
404
405        // 規格無し用
406        $sqlval['product_class_id'] = $this->objQuery->nextVal('dtb_products_class_product_class_id');
407        $sqlval['classcategory_id1'] = 0;
408        $sqlval['classcategory_id2'] = 0;
409        $sqlval['product_code'] = 'CODE_' . $product_id;
410        $sqlval['del_flg'] = 1;
411        $this->objQuery->insert('dtb_products_class', $sqlval);
412
413        print("\n");
414    }
415
416    /**
417     * 商品とカテゴリの関連づけを行う.
418     *
419     * @return void
420     */
421    function relateProductsCategories() {
422
423        print("商品とカテゴリの関連づけを行います...\n");
424
425        if ($this->delete) {
426            $this->objQuery->delete('dtb_product_categories');
427        }
428
429        $this->createProductsCategories($this->arrCategory1, "大カテゴリ");
430        $this->createProductsCategories($this->arrCategory2, "中カテゴリ");
431        $this->createProductsCategories($this->arrCategory3, "小カテゴリ");
432    }
433
434    /**
435     * 商品カテゴリを生成する.
436     *
437     * @param array $arrCategory_id カテゴリID の配列
438     * @return void
439     */
440    function createProductsCategories($arrCategory_id, $category_name) {
441
442        $count = 0;
443        printf("%s の商品カテゴリを生成しています...\n", $category_name);
444        foreach ($arrCategory_id as $category_id) {
445            $sqlval['category_id'] = $category_id;
446
447            foreach($this->arrProduct_id as $product_id) {
448                $sqlval['product_id'] = $product_id;
449                $sqlval['rank'] = $count;
450
451                $this->objQuery->insert('dtb_product_categories', $sqlval);
452                $count++;
453                print("$");
454            }
455        }
456        print("\n");
457    }
458
459    /** 規格1 */
460    var $arrSize = array(
461        "m11(29cm)",
462        "m10 1/2(28.5cm)",
463        "m10(28cm)",
464        "m9 1/2(27.5cm)",
465        "m9(27cm)",
466        "m8 1/2(26.5cm)",
467        "m8(26cm)",
468        '43',
469        '42',
470        '41',
471        "43(27.0cm~27.5cm)",
472        "42(26.5cm~27.0cm)",
473        "37(ladies 23.5~24cm)",
474        "42(約27.5cm)",
475        "41(約26.5cm)",
476        'W36',
477        'W34',
478        'W32',
479        '43',
480        '42',
481        '41',
482        'm11',
483        'm10',
484        "m9.5",
485        'm9',
486        'm8',
487        'FREE',
488        'XS',
489        'S',
490        'M',
491        'L',
492        'XL',
493        "25-27",
494        "27-29",
495        'W28',
496        'W29',
497        'W30',
498        'W31',
499        'W32',
500        'W33',
501        'W34',
502        'W35',
503        'W36',
504        '4',
505        '6',
506        '8',
507        '10',
508        '12',
509        '10cm',
510        '12cm',
511        '14cm',
512        '16cm',
513        '18cm',
514        '20cm',
515        '22cm',
516        '24cm',
517        '26cm',
518        '28cm',
519        '30cm',
520        '32cm',
521        '34cm',
522        '36cm',
523        '38cm',
524        '40cm',
525        '10g',
526        '20g',
527        '30g',
528        '40g',
529        '50g',
530        '60g',
531        '70g',
532        '80g',
533        '90g',
534        '100g',
535        '110g',
536        '120g',
537        '130g',
538        '140g',
539        '150g',
540        '160g',
541        '170g',
542        '180g',
543        '190g',
544        '200g',
545        '8inch',
546        '10inch',
547        '12inch',
548        '14inch',
549        '16inch',
550        '18inch',
551        '20inch',
552        '22inch',
553        '24inch',
554        '26inch',
555        '28inch',
556        '30inch',
557        '32inch',
558        '34inch',
559        '36inch',
560        '38inch',
561    );
562
563    /** 規格2 */
564    var $arrColor = array(
565        'white',
566        'whitesmoke',
567        'snow',
568        'ghostwhite',
569        'mintcream',
570        'azure',
571        'ivory',
572        'floralwhite',
573        'aliceblue',
574        'lavenderblush',
575        'seashell',
576        'honeydew',
577        'lightyellow',
578        'oldlace',
579        'cornsilk',
580        'linen',
581        'lemonchiffon',
582        'lavender',
583        'beige',
584        'lightgoldenrodyellow',
585        'mistyrose',
586        'papayawhip',
587        'antiquewhite',
588        'lightcyan',
589        'cyan',
590        'aqua',
591        'darkcyan',
592        'teal',
593        'darkslategray',
594        'turquoise',
595        'paleturquoise',
596        'mediumturquoise',
597        'aquamarine',
598        'gainsboro',
599        'lightgray',
600        'silver',
601        'darkgray',
602        'gray',
603        'dimgray',
604        'black',
605        'powderblue',
606        'lightblue',
607        'lightskyblue',
608        'skyblue',
609        'darkturquoise',
610        'deepskyblue',
611        'dodgerblue',
612        'royalblue',
613        'cornflowerblue',
614        'cadetblue',
615        'lightsteelblue',
616        'steelblue',
617        'lightslategray',
618        'slategray',
619        'blue',
620        'mediumblue',
621        'darkblue',
622        'navy',
623        'midnightblue',
624        'lightsalmon',
625        'darksalmon',
626        'salmon',
627        'tomato',
628        'lightcoral',
629        'coral',
630        'crimson',
631        'red',
632        'mediumorchid',
633        'mediumpurple',
634        'mediumslateblue',
635        'slateblue',
636        'blueviolet',
637        'darkviolet',
638        'darkorchid',
639        'darkslateblue',
640        'darkorchid',
641        'thistle',
642        'plum',
643        'violet',
644        'magenta',
645        'fuchsia',
646        'darkmagenta',
647        'purple',
648        'palegreen',
649        'lightgreen',
650        'lime',
651        'limegreen',
652        'forestgreen',
653        'green',
654        'darkgreen',
655        'greenyellow',
656        'chartreuse',
657        'lawngreen',
658        'yellowgreen',
659        'olivedrab',
660        'darkolivegreen',
661        'mediumaquamarine',
662        'mediumspringgreen',
663        'springgreen',
664        'darkseagreen',
665    );
666
667    /**
668    * 総カテゴリ数を計算し、dtb_categoryに代入するrankに使う
669    */
670    function lfGetTotalCategoryrank($existingMaxRank = 0){
671        $TotalCategoryrank = (TOP_CATEGORIES_VOLUME * MIDDLE_CATEGORIES_VOLUME * SMALL_CATEGORIES_VOLUME) + (MIDDLE_CATEGORIES_VOLUME * TOP_CATEGORIES_VOLUME) + TOP_CATEGORIES_VOLUME + $existingMaxRank;
672        return $TotalCategoryrank;
673    }
674
675}
Note: See TracBrowser for help on using the repository browser.