source: branches/comu-ver2/data/class/db/SC_DB_MasterData.php @ 18507

Revision 18507, 13.3 KB checked in by nanasess, 12 years ago (diff)

r18502 merged

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