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

Documentation generated on Tue, 28 Apr 2009 18:13:16 +0900 by phpDocumentor 1.4.2