Source for file LC_Page_Admin_Design_MainEdit.php

Documentation is available at LC_Page_Admin_Design_MainEdit.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.  * メイン編集 のページクラス.
  29.  *
  30.  * @package Page
  31.  * @author LOCKON CO.,LTD.
  32.  * @version $Id$
  33.  */
  34.  
  35.     // }}}
  36.     // {{{ functions
  37.  
  38.     /**
  39.      * Page を初期化する.
  40.      *
  41.      * @return void 
  42.      */
  43.     function init() {
  44.         parent::init();
  45.         $this->tpl_mainpage = 'design/main_edit.tpl';
  46.         $this->tpl_subnavi  = 'design/subnavi.tpl';
  47.         $this->user_URL     = USER_URL;
  48.         $this->text_row     = 13;
  49.         $this->tpl_subno = "main_edit";
  50.         $this->tpl_mainno = "design";
  51.         $this->tpl_subtitle = 'ページ詳細設定';
  52.     }
  53.  
  54.     /**
  55.      * Page のプロセス.
  56.      *
  57.      * @return void 
  58.      */
  59.     function process() {
  60.         $objView = new SC_AdminView();
  61.         $this->objLayout = new SC_Helper_PageLayout_Ex();
  62.  
  63.         // 認証可否の判定
  64.         $objSess = new SC_Session();
  65.         SC_Utils_Ex::sfIsSuccess($objSess);
  66.  
  67.         // ページ一覧を取得
  68.         $this->arrPageList = $this->objLayout->lfgetPageData();
  69.         
  70.         // ブロックIDを取得
  71.         if (isset($_POST['page_id'])) {
  72.             $page_id = $_POST['page_id'];
  73.         }else if (isset($_GET['page_id'])){
  74.             $page_id = $_GET['page_id'];
  75.         }else{
  76.             $page_id = '';
  77.         }
  78.  
  79.         $this->page_id = $page_id;
  80.  
  81.         // メッセージ表示
  82.         if (isset($_GET['msg']) && $_GET['msg'] == "on"){
  83.             $this->tpl_onload="alert('登録が完了しました。');";
  84.         }
  85.  
  86.         // page_id が指定されている場合にはテンプレートデータの取得
  87.         if (is_numeric($page_id) and $page_id != '') {
  88.             $arrPageData = $this->objLayout->lfgetPageData(" page_id = ? " , array($page_id));
  89.  
  90.             if (strlen($arrPageData[0]['filename']) == 0) {
  91.                 $this->arrErr['page_id_err'] = "※ 指定されたページは編集できません。";
  92.                 // 画面の表示
  93.                 $objView->assignobj($this);
  94.                 $objView->display(MAIN_FRAME);
  95.                 exit;
  96.             }
  97.  
  98.             // テンプレートファイルが存在していれば読み込む
  99.             $tpl_file =  USER_TEMPLATE_PATH . "/" . TEMPLATE_NAME . "/" . $arrPageData[0]['filename'] . ".tpl";
  100.             if (file_exists($tpl_file)){
  101.                 $arrPageData[0]['tpl_data'] = file_get_contents($tpl_file);
  102.             // 存在してなければ, 指定されたテンプレートのファイルを読み込む
  103.             } else {
  104.                 $arrPageData[0]['tpl_data'] = file_get_contents(TEMPLATE_DIR . $arrPageData[0]['filename'] . ".tpl");
  105.             }
  106.  
  107.             // チェックボックスの値変更
  108.             $arrPageData[0]['header_chk'] = SC_Utils_Ex::sfChangeCheckBox($arrPageData[0]['header_chk'], true);
  109.             $arrPageData[0]['footer_chk'] = SC_Utils_Ex::sfChangeCheckBox($arrPageData[0]['footer_chk'], true);
  110.  
  111.             // ディレクトリを画面表示用に編集
  112.             $arrPageData[0]['directory'] = str_replace(USER_DIR, '', $arrPageData[0]['php_dir']);
  113.  
  114.             $this->arrPageData = $arrPageData[0];
  115.         }
  116.  
  117.         // プレビュー処理
  118.         if (!isset($_POST['mode'])) $_POST['mode'] = "";
  119.         
  120.         if ($_POST['mode'] == 'preview') {
  121.  
  122.             $page_id_old = $page_id;
  123.             // プレビューの場合ページIDを0にセットする。
  124.             $page_id = "0";
  125.             $url = basename($_POST['url']);
  126.             
  127.             $tmpPost = $_POST;
  128.             $tmpPost['page_id'] = $page_id;
  129.             $tmpPost['url'] = $url;
  130.             $tmpPost['tpl_dir'] = USER_PATH . "templates/preview/";
  131.             
  132.             $arrPreData = $this->objLayout->lfgetPageData("page_id = ?" , array($page_id));
  133.             
  134.             // tplファイルの削除 (XXX: 処理の意図が不明。存在していると都合が悪いファイル?)
  135.             $del_tpl = USER_PATH . "templates/" . $arrPreData[0]['filename'] . '.tpl';
  136.             if (file_exists($del_tpl)){
  137.                 unlink($del_tpl);
  138.             }
  139.  
  140.             // DBへデータを更新する
  141.             $this->lfEntryPageData($tmpPost);
  142.  
  143.             // TPLファイル作成
  144.             $preview_tpl = USER_PATH . "templates/preview/" . TEMPLATE_NAME . "/" . $url . '.tpl';
  145.             $this->lfCreateFile($preview_tpl);
  146.             
  147.             // blocposition を削除
  148.             $objDBConn = new SC_DbConn;        // DB操作オブジェクト
  149.             $sql = 'delete from dtb_blocposition where page_id = 0';
  150.             $ret = $objDBConn->query($sql);
  151.  
  152.             if ($page_id_old != "") {
  153.                 // 登録データを取得
  154.                 $sql = "SELECT 0, target_id, bloc_id, bloc_row FROM dtb_blocposition WHERE page_id = ?";
  155.                 $ret = $objDBConn->getAll($sql,array($page_id_old));
  156.  
  157.                 if (count($ret) > 0) {
  158.  
  159.                     // blocposition を複製
  160.                     $sql = " insert into dtb_blocposition (";
  161.                     $sql .= "     page_id,";
  162.                     $sql .= "     target_id,";
  163.                     $sql .= "     bloc_id,";
  164.                     $sql .= "     bloc_row";
  165.                     $sql .= "     )values(?, ?, ?, ?)";
  166.  
  167.                     // 取得件数文INSERT実行
  168.                     foreach($ret as $key => $val){
  169.                         $ret = $objDBConn->query($sql,$val);
  170.                     }
  171.                 }
  172.             }
  173.             $_SESSION['preview'] = "ON";
  174.             $this->sendRedirect($this->getLocation(URL_DIR . "preview/" . DIR_INDEX_URL, array("filename" => $arrPageData[0]["filename"])));
  175.             exit;
  176.         }
  177.  
  178.         // データ登録処理
  179.         if ($_POST['mode'] == 'confirm') {
  180.  
  181.             // エラーチェック
  182.             $this->arrErr = $this->lfErrorCheck($_POST);
  183.  
  184.             // エラーがなければ更新処理を行う
  185.             if (count($this->arrErr) == 0) {
  186.                 // DBへデータを更新する
  187.                 $this->lfEntryPageData($_POST);
  188.  
  189.                 // ベースデータでなければファイルを削除し、PHPファイルを作成する
  190.                 if (!$this->objLayout->lfCheckBaseData($page_id)) {
  191.                     // ファイル削除
  192.                     $this->objLayout->lfDelFile($arrPageData[0]);
  193.                     // PHPファイル作成
  194.                     $this->lfCreatePHPFile($_POST['url']);
  195.                 }
  196.  
  197.                 // TPLファイル作成
  198.                 $cre_tpl = USER_TEMPLATE_PATH . "/" . TEMPLATE_NAME . "/" . basename($_POST['url']) . '.tpl';
  199.                 $this->lfCreateFile($cre_tpl);
  200.  
  201.                 // 新規作成の場合、
  202.                 if ($page_id == '') {
  203.                     // ページIDを取得する
  204.                     $arrPageData = $this->objLayout->lfgetPageData(" url = ? AND page_id <> 0" , array(USER_DIR . $_POST['url'] . '.php'));
  205.                     $page_id = $arrPageData[0]['page_id'];
  206.                 }
  207.                 $this->sendRedirect($this->getLocation("./main_edit.php",
  208.                                         array("page_id" => $page_id,
  209.                                               "msg"     => "on")));
  210.                 exit;
  211.             } else {
  212.                 // エラーがあれば入力時のデータを表示する
  213.                 $this->arrPageData = $_POST;
  214.                 $this->arrPageData['header_chk'] = SC_Utils_Ex::sfChangeCheckBox(SC_Utils_Ex::sfChangeCheckBox($_POST['header_chk']), true);
  215.                 $this->arrPageData['footer_chk'] = SC_Utils_Ex::sfChangeCheckBox(SC_Utils_Ex::sfChangeCheckBox($_POST['footer_chk']), true);
  216.                 $this->arrPageData['directory'] = '';
  217.                 $this->arrPageData['filename'] = $_POST['url'];
  218.             }
  219.         }
  220.  
  221.         // データ削除処理 ベースデータでなければファイルを削除
  222.         if ($_POST['mode'] == 'delete' and !$this->objLayout->lfCheckBaseData($page_id)) {
  223.             $this->objLayout->lfDelPageData($_POST['page_id']);
  224.             $this->sendRedirect($this->getLocation("./main_edit.php"));
  225.             exit;
  226.         }
  227.  
  228.         // 画面の表示
  229.         $objView->assignobj($this);
  230.         $objView->display(MAIN_FRAME);
  231.     }
  232.  
  233.     /**
  234.      * デストラクタ.
  235.      *
  236.      * @return void 
  237.      */
  238.     function destroy() {
  239.         parent::destroy();
  240.     }
  241.  
  242.     /**
  243.      * ブロック情報を更新する.
  244.      *
  245.      * @param array $arrData 更新データ
  246.      * @return integer 更新結果
  247.      */
  248.     function lfEntryPageData($arrData){
  249.         $objDBConn = new SC_DbConn;        // DB操作オブジェクト
  250.         $sql = "";                        // データ更新SQL生成用
  251.         $ret = "";                         // データ更新結果格納用
  252.         $arrUpdData = array();            // 更新データ生成用
  253.         $arrChk = array();                // 排他チェック用
  254.  
  255.         // 更新データの変換
  256.         $arrUpdData = $this->lfGetUpdData($arrData);
  257.  
  258.         // データが存在しているかチェックを行う
  259.         if($arrData['page_id'] !== ''){
  260.             $arrChk = $this->objLayout->lfgetPageData("page_id = ?", array($arrData['page_id']));
  261.         }
  262.         
  263.         // page_id が空 若しくは データが存在していない場合にはINSERTを行う
  264.         if ($arrData['page_id'] === '' or !isset($arrChk[0])) {
  265.             // SQL生成
  266.             $sql = " INSERT INTO dtb_pagelayout ";
  267.             $sql .= " ( ";
  268.             $sql .= "       page_name";
  269.             $sql .= "      ,url";
  270.             $sql .= "      ,php_dir";
  271.             $sql .= "      ,tpl_dir";
  272.             $sql .= "      ,filename";
  273.             $sql .= "      ,header_chk";
  274.             $sql .= "      ,footer_chk";
  275.             $sql .= "      ,update_url";
  276.             $sql .= "      ,create_date";
  277.             $sql .= "      ,update_date";
  278.             $sql .= " ) VALUES ( ?,?,?,?,?,?,?,?,now(),now() )";
  279.             $sql .= " ";
  280.         } else {
  281.             // データが存在してる場合にはアップデートを行う
  282.             // SQL生成
  283.             $sql = " UPDATE dtb_pagelayout ";
  284.             $sql .= " SET";
  285.             $sql .= "      page_name = ? ";
  286.             $sql .= "      ,url = ? ";
  287.             $sql .= "      ,php_dir = ? ";
  288.             $sql .= "      ,tpl_dir = ? ";
  289.             $sql .= "      ,filename = ? ";
  290.             $sql .= "      ,header_chk = ? ";
  291.             $sql .= "      ,footer_chk = ? ";
  292.             $sql .= "      ,update_url = ? ";
  293.             $sql .= "     ,update_date = now() ";
  294.             $sql .= " WHERE page_id = ?";
  295.             $sql .= " ";
  296.  
  297.             // 更新データにブロックIDを追加
  298.             array_push($arrUpdData, $arrData['page_id']);
  299.         }
  300.  
  301.         // SQL実行
  302.         $ret = $objDBConn->query($sql,$arrUpdData);
  303.  
  304.         return $ret;
  305.     }
  306.  
  307.     /**
  308.      * DBへ更新を行うデータを生成する.
  309.      *
  310.      * @param array $arrData 更新データ
  311.      * @return array 更新データ
  312.      */
  313.     function lfGetUpdData($arrData){
  314.         // ベースデータの場合には変更しない。
  315.         if ($this->objLayout->lfCheckBaseData($arrData['page_id'])) {
  316.             $arrPageData = $this->objLayout->lfgetPageData( ' page_id = ? ' , array($arrData['page_id']));
  317.             
  318.             $name = $arrPageData[0]['page_name'] ;
  319.             $url = $arrPageData[0]['url'];
  320.             $php_dir = $arrPageData[0]['php_dir'];
  321.             $filename = $arrPageData[0]['filename'];
  322.         } else {
  323.             $name = $arrData['page_name'] ;
  324.             $url = USER_DIR . $arrData['url'] . '.php';
  325.             $php_dir = dirname($url);
  326.             if ($php_dir == '.') {
  327.                 $php_dir = '';
  328.             } else {
  329.                 $php_dir .= '/';
  330.             }
  331.             $filename = basename($arrData['url']); // 拡張子を付加しない
  332.         }
  333.         
  334.         // 更新データ配列の作成
  335.         $arrUpdData = array(
  336.             $name                                                   // 名称
  337.             ,$url                                                   // URL
  338.             ,$php_dir                                               // PHPディレクトリ
  339.             ,$tpl_dir                                               // TPLディレクトリ
  340.             ,$filename                                              // ファイル名
  341.             ,SC_Utils_Ex::sfChangeCheckBox($arrData['header_chk'])  // ヘッダー使用
  342.             ,SC_Utils_Ex::sfChangeCheckBox($arrData['footer_chk'])  // フッター使用
  343.             ,$_SERVER['HTTP_REFERER']                               // 更新URL
  344.         );
  345.  
  346.         return $arrUpdData;
  347.     }
  348.  
  349.     /**
  350.      * 入力項目のエラーチェックを行う.
  351.      *
  352.      * @param array $arrData 入力データ
  353.      * @return array エラー情報
  354.      */
  355.     function lfErrorCheck($array) {
  356.         $objErr = new SC_CheckError($array);
  357.         $objErr->doFunc(array("名称", "page_name", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
  358.         $objErr->doFunc(array("URL", "url", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
  359.         
  360.         // URLチェック
  361.         $okUrl = true;
  362.         foreach (explode('/', $array['url']) as $url_part) {
  363.             if (!ereg( '^[a-zA-Z0-9:_~\.-]+$', $url_part)) {
  364.                 $okUrl = false;
  365.             }
  366.             if ($url_part == '.' || $url_part == '..') {
  367.                 $okUrl = false;
  368.             }
  369.         }
  370.         if (!$okUrl) {
  371.             $objErr->arrErr['url'] = "※ URLを正しく入力してください。<br />";
  372.         }
  373.         
  374.         // 同一のURLが存在している場合にはエラー
  375.         $sqlWhere = '';
  376.         $params = array();
  377.         
  378.         $sqlWhere .= ' (url = ? OR url = ?)';
  379.         $params[] = USER_DIR . $array['url'] . '.php';
  380.         $params[] = USER_URL . $array['url'] . '.php'; // 従来形式
  381.         
  382.         // プレビュー用のレコードは除外
  383.         $sqlWhere .= ' AND page_id <> 0';
  384.         
  385.         // 変更の場合、自身のレコードは除外
  386.         if (strlen($array['page_id']) != 0) {
  387.             $sqlWhere .= ' AND page_id <> ?';
  388.             $params[] = $array['page_id'];
  389.         }
  390.         
  391.         $arrChk = $this->objLayout->lfgetPageData($sqlWhere , $params);
  392.         
  393.         if (count($arrChk) >= 1) {
  394.             $objErr->arrErr['url'] = '※ 同じURLのデータが存在しています。別のURLを付けてください。<br />';
  395.         }
  396.         
  397.         return $objErr->arrErr;
  398.     }
  399.  
  400.     /**
  401.      * ファイルを作成する.
  402.      *
  403.      * @param string $path テンプレートファイルのパス
  404.      * @return void 
  405.      */
  406.     function lfCreateFile($path){
  407.  
  408.         // ディレクトリが存在していなければ作成する
  409.         if (!is_dir(dirname($path))) {
  410.             mkdir(dirname($path));
  411.         }
  412.  
  413.         // ファイル作成
  414.         $fp = fopen($path,"w");
  415.         fwrite($fp, $_POST['tpl_data']); // FIXME いきなり POST はちょっと...
  416.         fclose($fp);
  417.     }
  418.  
  419.     /**
  420.      * PHPファイルを作成する.
  421.      *
  422.      * @param string $path PHPファイルのパス
  423.      * @return void 
  424.      */
  425.     function lfCreatePHPFile($url){
  426.  
  427.         $path = USER_PATH . $url . ".php";
  428.         
  429.         // php保存先ディレクトリが存在していなければ作成する
  430.         if (!is_dir(dirname($path))) {
  431.             mkdir(dirname($path));
  432.         }
  433.  
  434.         // ベースとなるPHPファイルの読み込み
  435.         if (file_exists(USER_DEF_PHP)){
  436.             $php_data = file_get_contents(USER_DEF_PHP);
  437.         }
  438.  
  439.         // require.phpの場所を書き換える
  440.         $php_data = str_replace("###require###", str_repeat('../', substr_count($url, '/')) . '../require.php', $php_data);
  441.  
  442.         // phpファイルの作成
  443.         $fp = fopen($path,"w");
  444.         fwrite($fp, $php_data);
  445.         fclose($fp);
  446.     }
  447.  
  448. }
  449. ?>

Documentation generated on Tue, 28 Apr 2009 18:11:08 +0900 by phpDocumentor 1.4.2