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

Source for file LC_Page_Admin_Contents_CsvSql.php

Documentation is available at LC_Page_Admin_Contents_CsvSql.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. // {{{ requires
  25. require_once CLASS_EX_REALDIR 'page_extends/admin/LC_Page_Admin_Ex.php';
  26.  
  27. /**
  28.  * CSV 出力項目設定(高度な設定)のページクラス.
  29.  *
  30.  * @package Page
  31.  * @author LOCKON CO.,LTD.
  32.  * @version $Id: LC_Page_Admin_Contents_CsvSql.php 21185 2011-08-11 10:37:10Z shutta $
  33.  */
  34. class LC_Page_Admin_Contents_CsvSql extends LC_Page_Admin_Ex {
  35.  
  36.     // }}}
  37.     // {{{ functions
  38.  
  39.     /**
  40.      * Page を初期化する.
  41.      *
  42.      * @return void 
  43.      */
  44.     function init({
  45.         parent::init();
  46.         $this->tpl_mainpage 'contents/csv_sql.tpl';
  47.         $this->tpl_subno 'csv';
  48.         $this->tpl_subno_csv 'csv_sql';
  49.         $this->tpl_mainno 'contents';
  50.         $this->tpl_maintitle 'コンテンツ管理';
  51.         $this->tpl_subtitle 'CSV出力設定';
  52.     }
  53.  
  54.     /**
  55.      * Page のプロセス.
  56.      *
  57.      * @return void 
  58.      */
  59.     function process({
  60.         $this->action();
  61.         $this->sendResponse();
  62.     }
  63.  
  64.     /**
  65.      * Page のアクション.
  66.      *
  67.      * @return void 
  68.      */
  69.     function action({
  70.         // パラメーター管理クラス
  71.         $objFormParam new SC_FormParam_Ex();
  72.         // パラメーター設定
  73.         $this->lfInitParam($objFormParam);
  74.         $objFormParam->setParam($_POST);
  75.         $objFormParam->setParam($_GET);
  76.         $objFormParam->convParam();
  77.         $this->arrForm $objFormParam->getHashArray();
  78.         switch($this->getMode()) {
  79.         // データの登録
  80.         case 'confirm':
  81.             $this->arrErr $this->lfCheckConfirmError($objFormParam);
  82.             if(SC_Utils_Ex::isBlank($this->arrErr)) {
  83.                 // データの更新
  84.                 $this->arrForm['sql_id'$this->lfUpdData($objFormParam->getValue('sql_id')$objFormParam->getDbArray());
  85.                 // 完了メッセージ表示
  86.                 $this->tpl_onload "alert('登録が完了しました。');";
  87.             }
  88.             break;
  89.         // 確認画面
  90.         case 'preview':
  91.             $this->arrErr $this->lfCheckPreviewError($objFormParam);
  92.             if(SC_Utils_Ex::isBlank($this->arrErr)) {
  93.                 $this->sqlerr $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
  94.             }
  95.             $this->setTemplate('contents/csv_sql_view.tpl');
  96.             return;
  97.             break;
  98.         // 新規作成
  99.         case "new_page":
  100.             // リロード
  101.             SC_Response_Ex::reload();
  102.             break;
  103.         // データ削除
  104.         case 'delete':
  105.             $this->arrErr $this->lfCheckDeleteError($objFormParam);
  106.             if(SC_Utils_Ex::isBlank($this->arrErr)) {
  107.                 $this->lfDelData($objFormParam->getValue('sql_id'));
  108.                 SC_Response_Ex::reload();
  109.                 exit;
  110.             }
  111.             break;
  112.         // CSV出力
  113.         case "csv_output":
  114.             $this->arrErr $this->lfCheckOutputError($objFormParam);
  115.             if(SC_Utils_Ex::isBlank($this->arrErr)) {
  116.                 $this->lfDoCsvOutput($objFormParam->getValue('csv_output_id'));
  117.                 exit;
  118.             }
  119.             break;
  120.         default:
  121.             $this->arrErr $objFormParam->checkError();
  122.             if(SC_Utils_Ex::isBlank($this->arrErr)) {
  123.                 // 設定内容を取得する
  124.                 $this->arrForm $this->lfGetSqlData($objFormParam);
  125.                 // カラム一覧を取得する
  126.                 $this->arrColList $this->lfGetColList($objFormParam->getValue('select_table'));
  127.             }
  128.             break;
  129.         }
  130.  
  131.         // 登録済みSQL一覧取得
  132.         $this->arrSqlList $this->lfGetSqlList();
  133.         // テーブル一覧を取得する
  134.         $this->arrTableList $this->lfGetTableList();
  135.     }
  136.  
  137.     /**
  138.      * パラメーター情報の初期化
  139.      *
  140.      * @param array $objFormParam フォームパラメータークラス
  141.      * @return void 
  142.      */
  143.     function lfInitParam(&$objFormParam{
  144.         $objFormParam->addParam('SQL ID''sql_id'INT_LEN'n'array("NUM_CHECK","MAX_LENGTH_CHECK"));
  145.         $objFormParam->addParam('CSV出力対象SQL ID''csv_output_id'INT_LEN'n'array("NUM_CHECK","MAX_LENGTH_CHECK")""false);
  146.         $objFormParam->addParam('選択テーブル''select_table'STEXT_LEN'KVa'array("GRAPH_CHECK","MAX_LENGTH_CHECK")""false);
  147.         $objFormParam->addParam('名称''sql_name'STEXT_LEN'KVa'array("MAX_LENGTH_CHECK","SPTAB_CHECK"));
  148.         $objFormParam->addParam('SQL文''csv_sql'"30000"'KVa'array("MAX_LENGTH_CHECK","SPTAB_CHECK"));
  149.     }
  150.  
  151.     /**
  152.      * SQL登録エラーチェック
  153.      *
  154.      * @param array $objFormParam フォームパラメータークラス
  155.      * @return array エラー配列
  156.      */
  157.     function lfCheckConfirmError(&$objFormParam{
  158.         // パラメーターの基本チェック
  159.         $arrErr $objFormParam->checkError();
  160.         // 拡張エラーチェック
  161.         $objErr new SC_CheckError_Ex($objFormParam->getHashArray());
  162.         $objErr->doFuncarray("名称""sql_name")array("EXIST_CHECK") );
  163.         $objErr->doFuncarray("SQL文""csv_sql""30000")array("EXIST_CHECK""MAX_LENGTH_CHECK") );
  164.         $objErr->doFuncarray('SQL文には読み込み関係以外のSQLコマンドおよび";"記号''csv_sql'$this->lfGetSqlDenyList())array("PROHIBITED_STR_CHECK"));
  165.         if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
  166.             $arrErr array_merge($arrErr$objErr->arrErr);
  167.         }
  168.         // SQL文自体の確認、エラーが無い時のみ実行
  169.         if(SC_Utils_Ex::isBlank($arrErr)) {
  170.             $sql_error $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
  171.             if(!SC_Utils_Ex::isBlank($sql_error)) {
  172.                 $arrErr["csv_sql""※ SQL文が不正です。SQL文を見直してください";
  173.             }
  174.         }
  175.         return $arrErr;
  176.     }
  177.  
  178.     /**
  179.      * SQL確認エラーチェック
  180.      *
  181.      * @param array $objFormParam フォームパラメータークラス
  182.      * @return array エラー配列
  183.      */
  184.     function lfCheckPreviewError(&$objFormParam{
  185.         // パラメーターの基本チェック
  186.         $arrErr $objFormParam->checkError();
  187.         // 拡張エラーチェック
  188.         $objErr new SC_CheckError_Ex($objFormParam->getHashArray());
  189.         $objErr->doFuncarray("SQL文""csv_sql""30000")array("EXIST_CHECK""MAX_LENGTH_CHECK") );
  190.         $objErr->doFuncarray('SQL文には読み込み関係以外のSQLコマンドおよび";"記号''csv_sql'$this->lfGetSqlDenyList())array("PROHIBITED_STR_CHECK"));
  191.         if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
  192.             $arrErr array_merge($arrErr$objErr->arrErr);
  193.         }
  194.         return $arrErr;
  195.     }
  196.  
  197.     /**
  198.      * SQL設定 削除エラーチェック
  199.      *
  200.      * @param array $objFormParam フォームパラメータークラス
  201.      * @return array エラー配列
  202.      */
  203.     function lfCheckDeleteError(&$objFormParam{
  204.         // パラメーターの基本チェック
  205.         $arrErr $objFormParam->checkError();
  206.         // 拡張エラーチェック
  207.         $objErr new SC_CheckError_Ex($objFormParam->getHashArray());
  208.         $objErr->doFuncarray("SQL ID""sql_id")array("EXIST_CHECK") );
  209.         if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
  210.             $arrErr array_merge($arrErr$objErr->arrErr);
  211.         }
  212.         return $arrErr;
  213.     }
  214.  
  215.     /**
  216.      * SQL設定 CSV出力エラーチェック
  217.      *
  218.      * @param array $objFormParam フォームパラメータークラス
  219.      * @return array エラー配列
  220.      */
  221.     function lfCheckOutputError(&$objFormParam{
  222.         // パラメーターの基本チェック
  223.         $arrErr $objFormParam->checkError();
  224.         // 拡張エラーチェック
  225.         $objErr new SC_CheckError_Ex($objFormParam->getHashArray());
  226.         $objErr->doFuncarray("CSV出力対象SQL ID""csv_output_id")array("EXIST_CHECK") );
  227.         if(!SC_Utils_Ex::isBlank($objErr->arrErr)) {
  228.             $arrErr array_merge($arrErr$objErr->arrErr);
  229.         }
  230.         return $arrErr;
  231.     }
  232.  
  233.     /**
  234.      * デストラクタ.
  235.      *
  236.      * @return void 
  237.      */
  238.     function destroy({
  239.         parent::destroy();
  240.     }
  241.  
  242.     /**
  243.      * テーブル一覧を取得する.
  244.      *
  245.      * @return array テーブル名一覧
  246.      */
  247.     function lfGetTableList(){
  248.         $objQuery =SC_Query_Ex::getSingletonInstance();
  249.         // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
  250.         $arrTable $objQuery->listTables();
  251.         if(SC_Utils_Ex::isBlank($arrTable)) {
  252.             return array();
  253.         }
  254.         $arrRet array();
  255.         foreach($arrTable as $table{
  256.             if(substr($table04== 'dtb_'{
  257.                 $arrRet$table 'データテーブル: ' $table;
  258.             }else if(substr($table04== 'mtb_'{
  259.                 $arrRet$table 'マスターテーブル: ' $table;
  260.             }else if(substr($table03== 'vw_'{
  261.                 $arrRet$table 'ビュー: ' $table;
  262.             }
  263.         }
  264.         return $arrRet;
  265.     }
  266.  
  267.     /**
  268.      * テーブルのカラム一覧を取得する.
  269.      *
  270.      * @param string $selectTable テーブル名
  271.      * @return array カラム一覧の配列
  272.      */
  273.     function lfGetColList($table){
  274.         if(SC_Utils_Ex::isBlank($table)) {
  275.             return array();
  276.         }
  277.         $objQuery =SC_Query_Ex::getSingletonInstance();
  278.         // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
  279.         $arrColList $objQuery->listTableFields($table);
  280.         $arrColListSC_Utils_Ex::sfArrCombine($arrColList$arrColList);
  281.         return $arrColList;
  282.     }
  283.  
  284.     /**
  285.      * 登録済みSQL一覧を取得する.
  286.      *
  287.      * @param string $where Where句
  288.      * @param array $arrVal 絞り込みデータ
  289.      * @return array 取得結果の配列
  290.      */
  291.     function lfGetSqlList($where "" $arrVal array()){
  292.         $objQuery =SC_Query_Ex::getSingletonInstance();
  293.         $table "dtb_csv_sql";
  294.         $objQuery->setOrder('sql_id');
  295.         return $objQuery->select('*'$table$where$arrVal);
  296.     }
  297.  
  298.     /**
  299.      * 入力されたSQL文が正しく実行出来るかのチェックを行う.
  300.      *
  301.      * @param string SQL文データ(頭にSELECTは入れない)
  302.      * @return string エラー内容
  303.      */
  304.     function lfCheckSQL($sql){
  305.         // FIXME: 意図的に new SC_Query しています。 force_runをtrueにする必要があるので.本当はqueryの引数で制御したい。ref SC_Query
  306.         $objQuery new SC_Query_Ex(""true);
  307.         $err "";
  308.         $sql "SELECT " $sql " ";
  309.         $objErrMsg $objQuery->query($sql);
  310.         if (PEAR::isError($objErrMsg)){
  311.             $err $objErrMsg->message "\n" $objErrMsg->userinfo;
  312.         }
  313.         return $err;
  314.     }
  315.  
  316.     /**
  317.      * SQL詳細設定情報呼び出し (編集中データがある場合はそれを保持する)
  318.      *
  319.      * @param array $objFormParam フォームパラメータークラス
  320.      * @return mixed 表示用パラメーター
  321.      */
  322.     function lfGetSqlData(&$objFormParam{
  323.         // 編集中データがある場合
  324.         if(!SC_Utils_Ex::isBlank($objFormParam->getValue('sql_name'))
  325.                 or !SC_Utils_Ex::isBlank($objFormParam->getValue('csv_sql'))) {
  326.             return $objFormParam->getHashArray();
  327.         }
  328.         $sql_id $objFormParam->getValue('sql_id');
  329.         if(!SC_Utils_Ex::isBlank($sql_id)) {
  330.             $arrData $this->lfGetSqlList('sql_id = ?'array($sql_id));
  331.             return $arrData[0];
  332.         }
  333.         return array();
  334.     }
  335.  
  336.     /**
  337.      * DBにデータを保存する.
  338.      *
  339.      * @param integer $sql_id 出力するデータのSQL_ID
  340.      * @return void 
  341.      */
  342.     function lfDoCsvOutput($sql_id{
  343.         $arrData $this->lfGetSqlList('sql_id = ?'array($sql_id));
  344.         $sql "SELECT " $arrData[0]['csv_sql'" ";
  345.  
  346.         // TODO: ヘッダ取得 SQL内にLIMIT文がある場合はLIMIT句は追加しないので重いかも
  347.         $objQuery =SC_Query_Ex::getSingletonInstance();
  348.  
  349.         $arrHeader array();
  350.         if(!preg_match("/ LIMIT /"$sql)) {
  351.             $head_sql $sql " LIMIT 0";
  352.         }else{
  353.             $head_sql $sql;
  354.         }
  355.         $arrData $objQuery->getQueryDefsFields($head_sqlarray()true);
  356.         if(!SC_Utils_Ex::isBlank($arrData)) {
  357.             foreach($arrData as $key => $val{
  358.                 $arrHeader[$key;
  359.             }
  360.         }
  361.         require_once CLASS_EX_REALDIR 'helper_extends/SC_Helper_CSV_Ex.php';
  362.         $objCSV new SC_Helper_CSV_Ex();
  363.         $objCSV->sfDownloadCsvFromSql($sqlarray()'contents'$arrHeadertrue);
  364.         exit;
  365.     }
  366.  
  367.     /**
  368.      * DBにデータを保存する.
  369.      *
  370.      * @param integer $sql_id 更新するデータのSQL_ID
  371.      * @param array $arrSqlVal 更新データの配列
  372.      * @return integer $sql_id SQL_IDを返す
  373.      */
  374.     function lfUpdData($sql_id$arrSqlVal){
  375.         $objQuery =SC_Query_Ex::getSingletonInstance();
  376.         $table "dtb_csv_sql";
  377.         $arrSqlVal['update_date''CURRENT_TIMESTAMP';
  378.         if (SC_Utils_Ex::sfIsInt($sql_id)) {
  379.             //データ更新
  380.             $where "sql_id = ?";
  381.             $objQuery->update($table$arrSqlVal$wherearray($sql_id));
  382.         }else{
  383.             //新規作成
  384.             $sql_id $objQuery->nextVal('dtb_csv_sql_sql_id');
  385.             $arrSqlVal['sql_id'$sql_id;
  386.             $arrSqlVal['create_date''CURRENT_TIMESTAMP';
  387.             $objQuery->insert($table$arrSqlVal);
  388.         }
  389.         return $sql_id;
  390.     }
  391.  
  392.     /**
  393.      * 登録済みデータを削除する.
  394.      *
  395.      * @param integer $sql_id 削除するデータのSQL_ID
  396.      * @return boolean 実行結果 true:成功
  397.      */
  398.     function lfDelData($sql_id){
  399.         $objQuery =SC_Query_Ex::getSingletonInstance();
  400.         $table "dtb_csv_sql";
  401.         $where "sql_id = ?";
  402.         if(SC_Utils_Ex::sfIsInt($sql_id)) {
  403.             $objQuery->delete($table$wherearray($sql_id));
  404.             return true;
  405.         }
  406.         return false;
  407.     }
  408.  
  409.     /**
  410.      * SQL文に含めることを許可しないSQLキーワード
  411.      * 基本的にEC-CUBEのデータを取得するために必要なコマンドしか許可しない。複数クエリも不可
  412.      *
  413.      * FIXME: キーワードの精査。危険な部分なのでプログラム埋め込みで実装しました。mtb化の有無判断必要。
  414.      *
  415.      * @return array 不許可ワード配列
  416.      */
  417.     function lfGetSqlDenyList({
  418.         $arrList array(';'
  419.             ,'CREATE\s'
  420.             ,'INSERT\s'
  421.             ,'UPDATE\s'
  422.             ,'DELETE\s'
  423.             ,'ALTER\s'
  424.             ,'ABORT\s'
  425.             ,'ANALYZE\s'
  426.             ,'CLUSTER\s'
  427.             ,'COMMENT\s'
  428.             ,'COPY\s'
  429.             ,'DECLARE\s'
  430.             ,'DISCARD\s'
  431.             ,'DO\s'
  432.             ,'DROP\s'
  433.             ,'EXECUTE\s'
  434.             ,'EXPLAIN\s'
  435.             ,'GRANT\s'
  436.             ,'LISTEN\s'
  437.             ,'LOAD\s'
  438.             ,'LOCK\s'
  439.             ,'NOTIFY\s'
  440.             ,'PREPARE\s'
  441.             ,'REASSIGN\s'
  442. //            ,'REINDEX\s'      // REINDEXは許可で良いかなと
  443.             ,'RELEASE\sSAVEPOINT'
  444.             ,'RENAME\s'
  445.             ,'REST\s'
  446.             ,'REVOKE\s'
  447.             ,'SAVEPOINT\s'
  448.             ,'SET\s'
  449.             ,'SHOW\s'
  450.             ,'START\sTRANSACTION'
  451.             ,'TRUNCATE\s'
  452.             ,'UNLISTEN\s'
  453.             ,'VACCUM\s'
  454.             ,'HANDLER\s'
  455.             ,'LOAD\sDATA\s'
  456.             ,'LOAD\sXML\s'
  457.             ,'REPLACE\s'
  458.             ,'OPTIMIZE\s'
  459.             ,'REPAIR\s'
  460.             ,'INSTALL\sPLUGIN\s'
  461.             ,'UNINSTALL\sPLUGIN\s'
  462.             ,'BINLOG\s'
  463.             ,'KILL\s'
  464.             ,'RESET\s'
  465.             ,'PURGE\s'
  466.             ,'CHANGE\sMASTER'
  467.             ,'START\sSLAVE'
  468.             ,'STOP\sSLAVE'
  469.             ,'MASTER\sPOS\sWAIT'
  470.             ,'SIGNAL\s'
  471.             ,'RESIGNAL\s'
  472.             ,'RETURN\s'
  473.             ,'USE\s'
  474.             ,'HELP\s'
  475.             );
  476.         return $arrList;
  477.     }
  478. }
  479. ?>

Documentation generated on Fri, 24 Feb 2012 14:01:09 +0900 by Seasoft