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

Revision 23606, 12.9 KB checked in by kimoto, 10 years ago (diff)

#2448 typo修正・ソース整形・ソースコメントの改善 for 2.13.3

 https://scrutinizer-ci.com/g/nobuhiko/EC-CUBE/inspections/e0f27994-b3c7-4fc6-ad70-55d3cd63769b/patches

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