source: branches/version-2_12-dev/data/class/db/SC_DB_MasterData.php @ 21866

Revision 21866, 12.8 KB checked in by h_yoshimoto, 12 years ago (diff)

#1831 Copyrightを更新を誤っているので戻します

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