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_idand $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($ret0{
  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_URLarray("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