source: branches/version-2_13-dev/data/class/db/SC_DB_MasterData.php @ 22856

Revision 22856, 12.8 KB checked in by Seasoft, 13 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.13.0)

  • 主に空白・空白行の調整。もう少し整えたいが、一旦現状コミット。
  • 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-2013 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 * プルダウン等で使用するマスターデータを扱う.
28 * マスターデータは, DB に格納されているが, パフォーマンスを得るため,
29 * 初回のみ DBへアクセスし, データを定義したキャッシュファイルを生成する.
30 *
31 * マスターデータのテーブルは, 下記のようなカラムが必要がある.
32 * 1. キーとなる文字列
33 * 2. 表示文字列
34 * 3. 表示順
35 * 上記カラムのデータ型は特に指定しないが, 1 と 2 は常に string 型となる.
36 *
37 * マスターデータがキャッシュされると, key => value 形式の配列として使用できる.
38 * マスターデータのキャッシュは, MASTER_DATA_REALDIR/マスターデータ名.php というファイルが生成される.
39 *
40 * @package DB
41 * @author LOCKON CO.,LTD.
42 * @version $Id:SC_DB_MasterData.php 15532 2007-08-31 14:39:46Z nanasess $
43 */
44class SC_DB_MasterData
45{
46    /** SC_Query インスタンス */
47    var $objQuery;
48
49    /** デフォルトのテーブルカラム名 */
50    var $columns = array('id', 'name', 'rank', 'remarks');
51
52
53    /**
54     * マスターデータを取得する.
55     *
56     * 以下の順序でマスターデータを取得する.
57     * 1. MASTER_DATA_REALDIR にマスターデータキャッシュが存在しない場合、
58     *    DBからマスターデータを取得して、マスターデータキャッシュを生成する。
59     * 2. マスターデータキャッシュを読み込み、変数に格納し返す。
60     *
61     * 返り値は, key => value 形式の配列である.
62     *
63     * @param string $name マスターデータ名
64     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
65     *                        を表すカラム名を格納した配列
66     * @return array マスターデータ
67     */
68    function getMasterData($name, $columns = array())
69    {
70        $columns = $this->getDefaultColumnName($columns);
71
72        $filepath = MASTER_DATA_REALDIR . $name . '.serial';
73
74        if (!file_exists($filepath)) {
75            // キャッシュ生成
76            $this->createCache($name, $columns);
77        }
78
79        // キャッシュを読み込み
80        $masterData = unserialize(file_get_contents($filepath));
81
82        return $masterData;
83    }
84
85    /**
86     * マスターデータをDBに追加する.
87     *
88     * 引数 $masterData をマスターデータとしてDBに追加し,
89     * キャッシュを生成する.
90     * 既存のキャッシュが存在する場合は上書きする.
91     * $masterData は key => value 形式の配列である必要がある.
92     *
93     * @param string $name マスターデータ名
94     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
95     *                        を表すカラム名を格納した配列
96     * @param array $masterData マスターデータ
97     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
98     * @return integer マスターデータの登録数
99     */
100    function registMasterData($name, $columns, $masterData, $autoCommit = true)
101    {
102        $columns = $this->getDefaultColumnName($columns);
103
104        $this->objQuery =& SC_Query_Ex::getSingletonInstance();
105        if ($autoCommit) {
106            $this->objQuery->begin();
107        }
108        $i = 0;
109        foreach ($masterData as $key => $val) {
110            $sqlVal = array($columns[0] => (string) $key,
111                            $columns[1] => (string) $val,
112                            $columns[2] => (string) $i);
113            $this->objQuery->insert($name, $sqlVal);
114            $i++;
115        }
116        if ($autoCommit) {
117            $this->objQuery->commit();
118        }
119
120        return $i;
121    }
122
123    /**
124     * マスターデータを更新する.
125     *
126     * 引数 $masterData の値でマスターデータを更新する.
127     * $masterData は key => value 形式の配列である必要がある.
128     *
129     * @param string $name マスターデータ名
130     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
131     *                        を表すカラム名を格納した配列
132     * @param array $masterData マスターデータ
133     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
134     * @return integer マスターデータの更新数
135     */
136    function updateMasterData($name, $columns, $masterData, $autoCommit = true)
137    {
138        $columns = $this->getDefaultColumnName($columns);
139
140        $this->objQuery =& SC_Query_Ex::getSingletonInstance();
141        if ($autoCommit) {
142            $this->objQuery->begin();
143        }
144
145        // 指定のデータを更新
146        $i = 0;
147        foreach ($masterData as $key => $val) {
148            $sqlVal = array($columns[1] => $val);
149            $this->objQuery->update($name, $sqlVal, $columns[0] . ' = ' .  SC_Utils_Ex::sfQuoteSmart($key));
150            $i++;
151        }
152        if ($autoCommit) {
153            $this->objQuery->commit();
154        }
155
156        return $i;
157    }
158
159    /**
160     * マスターデータを追加する.
161     *
162     * 引数 $masterData の値でマスターデータを更新する.
163     * $masterData は key => value 形式の配列である必要がある.
164     *
165     * @param string $name マスターデータ名
166     * @param string $key キー名
167     * @param string $comment コメント
168     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
169     * @return integer マスターデータの更新数
170     */
171    function insertMasterData($name, $key, $value, $comment, $autoCommit = true)
172    {
173        $columns = $this->getDefaultColumnName();
174
175        $this->objQuery =& SC_Query_Ex::getSingletonInstance();
176        if ($autoCommit) {
177            $this->objQuery->begin();
178        }
179
180        // 指定のデータを追加
181        $sqlVal[$columns[0]] = $key;
182        $sqlVal[$columns[1]] = $value;
183        $sqlVal[$columns[2]] = $this->objQuery->max($columns[2], $name) + 1;
184        $sqlVal[$columns[3]] = $comment;
185        $this->objQuery->insert($name, $sqlVal);
186
187        if ($autoCommit) {
188            $this->objQuery->commit();
189        }
190
191        return 1;
192    }
193
194    /**
195     * マスターデータを削除する.
196     *
197     * 引数 $name のマスターデータを削除し,
198     * キャッシュも削除する.
199     *
200     * @param string $name マスターデータ名
201     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
202     * @return integer マスターデータの削除数
203     */
204    function deleteMasterData($name, $autoCommit = true)
205    {
206        $this->objQuery =& SC_Query_Ex::getSingletonInstance();
207        if ($autoCommit) {
208            $this->objQuery->begin();
209        }
210
211        // DB の内容とキャッシュをクリア
212        $result = $this->objQuery->delete($name);
213        $this->clearCache($name);
214
215        if ($autoCommit) {
216            $this->objQuery->commit();
217        }
218
219        return $result;
220    }
221
222    /**
223     * マスターデータのキャッシュを消去する.
224     *
225     * @param string $name マスターデータ名
226     * @return bool 消去した場合 true
227     */
228    function clearCache($name)
229    {
230        $masterDataFile = MASTER_DATA_REALDIR . $name . '.php';
231        if (is_file($masterDataFile)) {
232            unlink($masterDataFile);
233        }
234        $masterDataFile = MASTER_DATA_REALDIR . $name . '.serial';
235        if (is_file($masterDataFile)) {
236            unlink($masterDataFile);
237        }
238    }
239
240    /**
241     * マスターデータのキャッシュを生成する.
242     *
243     * 引数 $name のマスターデータキャッシュを生成する.
244     * 既存のキャッシュが存在する場合は上書きする.
245     *
246     * 引数 $isDefine が true の場合は, 定数を生成する.
247     * 定数コメントを生成する場合は, $commentColumn を指定する.
248     *
249     * @param string $name マスターデータ名
250     * @param array $masterData マスターデータ
251     * @param bool $isDefine 定数を生成する場合 true
252     * @param array $commentColumn [0] => キー, [1] => コメント文字列,
253     *                             [2] => 表示順 を表すカラム名を格納した配列
254     * @return bool キャッシュの生成に成功した場合 true
255     */
256    function createCache($name, $columns = array(), $isDefine = false, $commentColumn = array())
257    {
258        // マスターデータを取得
259        $masterData = $this->getDbMasterData($name, $columns);
260
261        // マスターデータを文字列にする
262        // 定数を生成する場合
263        if ($isDefine) {
264            $path = MASTER_DATA_REALDIR . $name . '.php';
265
266            $data = "<?php\n";
267            // 定数コメントを生成する場合
268            if (!empty($commentColumn)) {
269                $data .= $this->getMasterDataAsDefine($masterData, $this->getDbMasterData($name, $commentColumn));
270            } else {
271                $data .= $this->getMasterDataAsDefine($masterData);
272            }
273            $data .=  "\n";
274
275        // 配列を生成する場合
276        } else {
277            $path = MASTER_DATA_REALDIR . $name . '.serial';
278            $data = serialize($masterData);
279        }
280
281        // ファイルを書き出しモードで開く
282        $handle = fopen($path, 'w');
283        if (!$handle) {
284            return false;
285        }
286        // ファイルの内容を書き出す.
287        if (fwrite($handle, $data) === false) {
288            fclose($handle);
289            return false;
290        }
291        fclose($handle);
292
293        return true;
294    }
295
296    /**
297     * DBからマスターデータを取得する.
298     *
299     * キャッシュの有無に関係なく, DBからマスターデータを検索し, 取得する.
300     *
301     * 返り値は, key => value 形式の配列である.
302     *
303     * @param string $name マスターデータ名
304     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
305     *                        を表すカラム名を格納した配列
306     * @return array マスターデータ
307     */
308    function getDbMasterData($name, $columns = array())
309    {
310        $columns = $this->getDefaultColumnName($columns);
311
312        $this->objQuery =& SC_Query_Ex::getSingletonInstance();
313        if (isset($columns[2]) && strlen($columns[2]) >= 1) {
314            $this->objQuery->setOrder($columns[2]);
315        }
316        $results = $this->objQuery->select($columns[0] . ', ' . $columns[1], $name);
317
318        // 結果を key => value 形式に格納
319        $masterData = array();
320        foreach ($results as $result) {
321            $masterData[$result[$columns[0]]] = $result[$columns[1]];
322        }
323
324        return $masterData;
325    }
326
327    /**
328     * デフォルトのカラム名の配列を返す.
329     *
330     * 引数 $columns が空の場合, デフォルトのカラム名の配列を返す.
331     * 空でない場合は, 引数の値をそのまま返す.
332     *
333     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
334     *                        を表すカラム名を格納した配列
335     * @return array カラム名を格納した配列
336     */
337    function getDefaultColumnName($columns = array())
338    {
339        if (!empty($columns)) {
340            return $columns;
341        } else {
342            return $this->columns;
343        }
344    }
345
346    /**
347     * マスターデータの配列を定数定義の文字列として出力する.
348     *
349     * @access private
350     * @param array $masterData マスターデータの配列
351     * @param array $comments コメントの配列
352     * @return string 定数定義の文字列
353     */
354    function getMasterDataAsDefine($masterData, $comments = array())
355    {
356        $data = '';
357        foreach ($masterData as $key => $val) {
358            if (!empty($comments[$key])) {
359                $data .= '/** ' . $comments[$key] . " */\n";
360            }
361            $data .= "define('" . $key . "', " . $val . ");\n";
362        }
363
364        return $data;
365    }
366}
Note: See TracBrowser for help on using the repository browser.