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-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. // {{{ requires
  25. require_once(CLASS_PATH . "pages/LC_Page.php");
  26.  
  27. /**
  28.  * CSV 出力項目設定(高度な設定)のページクラス.
  29.  *
  30.  * @package Page
  31.  * @author LOCKON CO.,LTD.
  32.  * @version $Id: LC_Page_Admin_Contents_CsvSql.php 17675 2008-11-01 06:44:55Z Seasoft $
  33.  */
  34.  
  35.     // }}}
  36.     // {{{ functions
  37.  
  38.     /**
  39.      * Page を初期化する.
  40.      *
  41.      * @return void 
  42.      */
  43.     function init() {
  44.         parent::init();
  45.         $this->tpl_mainpage = 'contents/csv_sql.tpl';
  46.         $this->tpl_subnavi = 'contents/subnavi.tpl';
  47.         $this->tpl_subno = 'csv';
  48.         $this->tpl_subno_csv = 'csv_sql';
  49.         $this->tpl_mainno = "contents";
  50.         $this->tpl_subtitle = 'CSV出力設定';
  51.     }
  52.  
  53.     /**
  54.      * Page のプロセス.
  55.      *
  56.      * @return void 
  57.      */
  58.     function process() {
  59.         $objView = new SC_AdminView();
  60.         $objDbFactory = SC_DB_DBFactory_Ex::getInstance();
  61.  
  62.         // 認証可否の判定
  63.         $objSess = new SC_Session();
  64.         SC_Utils_Ex::sfIsSuccess($objSess);
  65.  
  66.         if (!isset($_POST['mode'])) $_POST['mode'] = "";
  67.         if (!isset($_POST['sql_id'])) $_POST['sql_id'] = "";
  68.         if (!isset($_GET['sql_id'])) $_GET['sql_id'] = "";
  69.         if (!isset($_POST['selectTable'])) $_POST['selectTable'] = "";
  70.  
  71.         // SQL_IDの取得
  72.         if ($_POST['sql_id'] != "") {
  73.             $sql_id = $_POST['sql_id'];
  74.         }elseif($_GET['sql_id'] != ""){
  75.             $sql_id = $_GET['sql_id'];
  76.         }else{
  77.             $sql_id = "";
  78.         }
  79.  
  80.         $mode = $_POST['mode'];
  81.  
  82.         switch($_POST['mode']) {
  83.             // データの登録
  84.         case "confirm":
  85.             // エラーチェック
  86.             $this->arrErr = $this->lfCheckError($_POST);
  87.  
  88.             if (count($this->arrErr) <= 0){
  89.                 // データの更新
  90.                 $sql_id = $this->lfUpdData($sql_id, $_POST);
  91.                 // 完了メッセージ表示
  92.                 $this->tpl_onload = "alert('登録が完了しました。');";
  93.             }
  94.             break;
  95.  
  96.             // 確認画面
  97.         case "preview":
  98.             // SQL文表示
  99.             $sql = "SELECT \n" . $_POST['csv_sql']; // FIXME
  100.             $this->sql = $sql;
  101.  
  102.             // エラー表示
  103.             $objErrMsg = $this->lfCheckSQL($_POST);
  104.             if ($objErrMsg != "") {
  105.                 $errMsg = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
  106.             }
  107.  
  108.             $this->sqlerr = isset($errMsg) ? $errMsg : "" ;
  109.  
  110.             $this->objView = $objView;
  111.  
  112.             // 画面の表示
  113.             $objView->assignobj($this);
  114.             $objView->display('contents/csv_sql_view.tpl');
  115.             exit;
  116.             break;
  117.  
  118.             // 新規作成
  119.         case "new_page":
  120.             $this->sendRedirect($this->getLocation("./csv_sql.php"));
  121.             exit;
  122.             break;
  123.  
  124.             // データ削除
  125.         case "delete":
  126.             $this->lfDelData($sql_id);
  127.             $this->sendRedirect($this->getLocation("./csv_sql.php"));
  128.             exit;
  129.             break;
  130.  
  131.         case "csv_output":
  132.             // CSV出力データ取得
  133.             $arrCsvData = $this->lfGetSqlList(" WHERE sql_id = ?", array($_POST['csv_output_id']));
  134.  
  135.             $objQuery = new SC_Query();
  136.  
  137.             $arrCsvOutputData = $objQuery->getall("SELECT " . $arrCsvData[0]['csv_sql']);
  138.  
  139.             if (count($arrCsvOutputData) > 0) {
  140.  
  141.                 $arrKey = array_keys(SC_Utils_Ex::sfSwapArray($arrCsvOutputData));
  142.                 $i = 0;
  143.                 $header = "";
  144.                 foreach($arrKey as $data) {
  145.                     if ($i != 0) $header .= ", ";
  146.                     $header .= $data;
  147.                     $i ++;
  148.                 }
  149.                 $header .= "\n";
  150.  
  151.                 $data = SC_Utils_Ex::getCSVData($arrCsvOutputData, $arrKey);
  152.                 // CSV出力
  153.                 SC_Utils_Ex::sfCSVDownload($header.$data);
  154.                 exit;
  155.                 break;
  156.             }else{
  157.                 $this->tpl_onload = "alert('出力データがありません。');";
  158.                 $sql_id = "";
  159.                 $_POST="";
  160.             }
  161.             break;
  162.         }
  163.  
  164.         // mode が confirm 以外のときは完了メッセージは出力しない
  165.         if ($mode != "confirm" and $mode != "csv_output") {
  166.             $this->tpl_onload = "";
  167.         }
  168.  
  169.         // 登録済みSQL一覧取得
  170.         $arrSqlList = $this->lfGetSqlList();
  171.  
  172.         // 編集用SQLデータの取得
  173.         if ($sql_id != "") {
  174.             $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
  175.         }
  176.  
  177.         // テーブル一覧を取得する
  178.         $arrTableList = $this->lfGetTableList();
  179.         $arrTableList = SC_Utils_Ex::sfSwapArray($arrTableList);
  180.  
  181.         // 現在選択されているテーブルを取得する
  182.         if ($_POST['selectTable'] == ""){
  183.             $selectTable = $arrTableList['table_name'][0];
  184.         }else{
  185.             $selectTable = $_POST['selectTable'];
  186.         }
  187.  
  188.         // カラム一覧を取得する
  189.         $arrColList = $this->lfGetColumnList($selectTable);
  190.         $arrColList =  SC_Utils_Ex::sfSwapArray($arrColList);
  191.  
  192.         // 表示させる内容を編集
  193.         foreach ($arrTableList['description'] as $key => $val) {
  194.             $arrTableList['description'][$key] = $arrTableList['table_name'][$key] . ":" . $arrTableList['description'][$key];
  195.         }
  196.         foreach ($arrColList['description'] as $key => $val) {
  197.             $arrColList['description'][$key] = $arrColList['column_name'][$key] . ":" . $arrColList['description'][$key];
  198.         }
  199.  
  200.  
  201.         $arrDiff = array_diff($objDbFactory->sfGetColumnList($selectTable), $arrColList["column_name"]);
  202.         $arrColList["column_name"] = array_merge($arrColList["column_name"], $arrDiff);
  203.         $arrColList["description"] = array_merge($arrColList["description"], $arrDiff);
  204.  
  205.         // テンプレートに出力するデータをセット
  206.         $this->arrSqlList = $arrSqlList;    // SQL一覧
  207.         $this->arrTableList = SC_Utils_Ex::sfarrCombine($arrTableList['table_name'], $arrTableList['description']);    // テーブル一覧
  208.         $this->arrColList = SC_Utils_Ex::sfarrCombine($arrColList['column_name'],$arrColList['description']);            // カラム一覧
  209.         $this->selectTable = $selectTable;    // 選択されているテーブル
  210.         $this->sql_id = $sql_id;            // 選択されているSQL
  211.  
  212.         // POSTされたデータをセットする
  213.         if (count($_POST) > 0) {
  214.             $arrSqlData[0]['sql_name'] = isset($_POST['sql_name']) ? $_POST['sql_name'] : "";
  215.             $arrSqlData[0]['csv_sql'] = isset($_POST['csv_sql']) ? $_POST['csv_sql'] : "";
  216.         }
  217.         $this->arrSqlData = $arrSqlData[0];    // 選択されているSQLデータ
  218.  
  219.         // 画面の表示
  220.         $objView->assignobj($this);
  221.         $objView->display(MAIN_FRAME);
  222.     }
  223.  
  224.     /**
  225.      * デストラクタ.
  226.      *
  227.      * @return void 
  228.      */
  229.     function destroy() {
  230.         parent::destroy();
  231.     }
  232.  
  233.     /**
  234.      * テーブル一覧を取得する.
  235.      *
  236.      * @return void 
  237.      */
  238.     function lfGetTableList(){
  239.         $objQuery = new SC_Query();
  240.         $arrRet = array();        // 結果取得用
  241.  
  242.         $sql = "";
  243.         $sql .= "SELECT table_name, description FROM dtb_table_comment WHERE column_name IS NULL ORDER BY table_name";
  244.         $arrRet = $objQuery->getAll($sql);
  245.  
  246.         return $arrRet;
  247.     }
  248.  
  249.     /**
  250.      * テーブルのカラム一覧を取得する.
  251.      *
  252.      * @param string $selectTable テーブル名
  253.      * @return array カラム一覧の配列
  254.      */
  255.     function lfGetColumnList($selectTable){
  256.         $objQuery = new SC_Query();
  257.         $arrRet = array();        // 結果取得用
  258.         $sql = "";
  259.         $sql .= " SELECT column_name, description FROM dtb_table_comment WHERE table_name = ? AND column_name IS NOT NULL";
  260.         $arrRet = $objQuery->getAll($sql, array($selectTable));
  261.  
  262.         return $arrRet;
  263.     }
  264.  
  265.     /**
  266.      * 登録済みSQL一覧を取得する.
  267.      *
  268.      * @param string $where Where句
  269.      * @param array $arrData 絞り込みデータ
  270.      * @return array 取得結果の配列
  271.      */
  272.     function lfGetSqlList($where = "" , $arrData = array()){
  273.         $objQuery = new SC_Query();
  274.         $arrRet = array();        // 結果取得用
  275.  
  276.         $sql = "";
  277.         $sql .= " SELECT";
  278.         $sql .= "     sql_id,";
  279.         $sql .= "     sql_name,";
  280.         $sql .= "     csv_sql,";
  281.         $sql .= "     update_date,";
  282.         $sql .= "     create_date";
  283.         $sql .= " FROM";
  284.         $sql .= "     dtb_csv_sql";
  285.  
  286.         // Where句の指定があれば結合する
  287.         if ($where != "") {
  288.             $sql .= " $where ";
  289.         }else{
  290.             $sql .= " ORDER BY sql_id ";
  291.         }
  292.         $sql .= " ";
  293.  
  294.         // データを引数で渡されている場合にはセットする
  295.         if (count($arrData) > 0) {
  296.             $arrRet = $objQuery->getall($sql, $arrData);
  297.         }else{
  298.             $arrRet = $objQuery->getall($sql);
  299.         }
  300.  
  301.         return $arrRet;
  302.     }
  303.  
  304.     /**
  305.      * 入力項目のエラーチェックを行う.
  306.      *
  307.      * @param array POSTデータ
  308.      * @return array エラー内容の配列
  309.      */
  310.     function lfCheckError($data){
  311.         $objErr = new SC_CheckError();
  312.         $objErr->doFunc( array("名称", "sql_name"), array("EXIST_CHECK") );
  313.         $objErr->doFunc( array("SQL文", "csv_sql", "30000"), array("EXIST_CHECK", "MAX_LENGTH_CHECK") );
  314.  
  315.         // SQLの妥当性チェック
  316.         if ($objErr->arrErr['csv_sql'] == "") {
  317.             $objsqlErr = $this->lfCheckSQL($data);
  318.             if ($objsqlErr != "") {
  319.                 $objErr->arrErr["csv_sql"] = "SQL文が不正です。SQL文を見直してください";
  320.             }
  321.         }
  322.  
  323.         return $objErr->arrErr;
  324.     }
  325.  
  326.     /**
  327.      * 入力されたSQL文が正しいかチェックを行う.
  328.      *
  329.      * @param array POSTデータ
  330.      * @return array エラー内容
  331.      */
  332.     function lfCheckSQL($data){
  333.         $err = "";
  334.         $objDbConn = new SC_DbConn();
  335.         $sql = "SELECT " . $data['csv_sql'] . " ";
  336.         $ret = $objDbConn->conn->query($sql);
  337.         if ($objDbConn->conn->isError($ret)){
  338.             $err = $ret;
  339.         }
  340.  
  341.         return $err;
  342.     }
  343.  
  344.     /**
  345.      * DBにデータを保存する.
  346.      *
  347.      * @param integer $sql_id 更新するデータのSQL_ID
  348.      * @param array $arrData 更新データの配列
  349.      * @return integer $sql_id SQL_IDを返す
  350.      */
  351.     function lfUpdData($sql_id = "", $arrData = array()){
  352.         $objQuery = new SC_Query();        // DB操作オブジェクト
  353.         $sql = "";                        // データ取得SQL生成用
  354.         $arrRet = array();                // データ取得用(更新判定)
  355.         $arrVal = array();                // データ更新
  356.  
  357.         // sql_id が指定されている場合にはUPDATE
  358.         if ($sql_id != "") {
  359.             // 存在チェック
  360.             $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
  361.             if (count($arrSqlData) > 0) {
  362.                 // データ更新
  363.                 $sql = "UPDATE dtb_csv_sql SET sql_name = ?, csv_sql = ?, update_date = now() WHERE sql_id = ? ";
  364.                 $arrVal= array($arrData['sql_name'], $arrData['csv_sql'], $sql_id);
  365.             }else{
  366.                 // データの新規作成
  367.                 $sql_id = "";
  368.                 $sql = "INSERT INTO dtb_csv_sql (sql_name, csv_sql, create_date, update_date) values (?, ?, now(), now()) ";
  369.                 $arrVal= array($arrData['sql_name'], $arrData['csv_sql']);
  370.  
  371.             }
  372.         }else{
  373.             // データの新規作成
  374.             $sql = "INSERT INTO dtb_csv_sql (sql_name, csv_sql, create_date, update_date) values (?, ?, now(), now()) ";
  375.             $arrVal= array($arrData['sql_name'], $arrData['csv_sql']);
  376.         }
  377.         // SQL実行
  378.         $arrRet = $objQuery->query($sql,$arrVal);
  379.  
  380.         // 新規作成時は$sql_idを取得
  381.         if ($sql_id == "") {
  382.             $arrNewData = $this->lfGetSqlList(" ORDER BY create_date DESC");
  383.             $sql_id = $arrNewData[0]['sql_id'];
  384.         }
  385.  
  386.         return $sql_id;
  387.     }
  388.  
  389.  
  390.     /**
  391.      * 登録済みデータを削除する.
  392.      *
  393.      * @param integer $sql_id 削除するデータのSQL_ID
  394.      * @return bool 実行結果 TRUE:成功 FALSE:失敗
  395.      */
  396.     function lfDelData($sql_id = ""){
  397.         $objQuery = new SC_Query();        // DB操作オブジェクト
  398.         $sql = "";                        // データ取得SQL生成用
  399.         $Ret = false;                    // 実行結果
  400.  
  401.         // sql_id が指定されている場合のみ実行
  402.         if ($sql_id != "") {
  403.             // データの削除
  404.             $sql = "DELETE FROM dtb_csv_sql WHERE sql_id = ? ";
  405.             // SQL実行
  406.             $ret = $objQuery->query($sql,array($sql_id));
  407.         }else{
  408.             $ret = false;
  409.         }
  410.  
  411.         // 結果を返す
  412.         return $ret;
  413.     }
  414. }
  415. ?>

Documentation generated on Tue, 28 Apr 2009 18:10:55 +0900 by phpDocumentor 1.4.2