DB
[ class tree: DB ] [ index: DB ] [ all elements ]

Source for file SC_DB_MasterData.php

Documentation is available at SC_DB_MasterData.php

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

Documentation generated on Fri, 24 Feb 2012 14:02:32 +0900 by Seasoft