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

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-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. require_once CLASS_EX_REALDIR 'helper_extends/SC_Helper_FileManager_Ex.php';
  27.  
  28. /**
  29.  * メイン編集 のページクラス.
  30.  *
  31.  * @package Page
  32.  * @author LOCKON CO.,LTD.
  33.  * @version $Id: LC_Page_Admin_Design_MainEdit.php 21185 2011-08-11 10:37:10Z shutta $
  34.  */
  35. class LC_Page_Admin_Design_MainEdit extends LC_Page_Admin_Ex {
  36.  
  37.     // }}}
  38.     // {{{ functions
  39.  
  40.     /**
  41.      * Page を初期化する.
  42.      *
  43.      * @return void 
  44.      */
  45.     function init({
  46.         parent::init();
  47.         $this->tpl_mainpage 'design/main_edit.tpl';
  48.         $this->text_row     13;
  49.         $this->tpl_subno "main_edit";
  50.         $this->tpl_mainno 'design';
  51.         $this->tpl_maintitle 'デザイン管理';
  52.         $this->tpl_subtitle 'ページ詳細設定';
  53.         $masterData new SC_DB_MasterData_Ex();
  54.         $this->arrDeviceType $masterData->getMasterData('mtb_device_type');
  55.     }
  56.  
  57.     /**
  58.      * Page のプロセス.
  59.      *
  60.      * @return void 
  61.      */
  62.     function process({
  63.         $this->action();
  64.         $this->sendResponse();
  65.     }
  66.  
  67.     /**
  68.      * Page のアクション.
  69.      *
  70.      * @return void 
  71.      */
  72.     function action({
  73.         $objLayout new SC_Helper_PageLayout_Ex();
  74.         $objFormParam new SC_FormParam_Ex();
  75.         $this->lfInitParam($objFormParam);
  76.         $objFormParam->setParam($_REQUEST);
  77.         $objFormParam->convParam();
  78.         $this->arrErr $objFormParam->checkError();
  79.         $is_error (!SC_Utils_Ex::isBlank($this->arrErr));
  80.  
  81.         $this->device_type_id $objFormParam->getValue('device_type_id'DEVICE_TYPE_PC);
  82.         $this->page_id $objFormParam->getValue('page_id');
  83.  
  84.         switch ($this->getMode()) {
  85.         // 削除
  86.         case 'delete':
  87.             if (!$is_error{
  88.                 if ($objLayout->isEditablePage($this->device_type_id$this->page_id)) {
  89.                     $objLayout->lfDelPageData($this->page_id$this->device_type_id);
  90.                     SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id,
  91.                                                  "msg" => "on")true);
  92.                     exit;
  93.                 }
  94.             }
  95.             break;
  96.  
  97.         // 登録/編集
  98.         case 'confirm':
  99.             if (!$is_error{
  100.                 $this->arrErr $this->lfCheckError($objFormParam$this->arrErr);
  101.                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
  102.                     $result $this->doRegister($objFormParam$objLayout);
  103.                     if ($result !== false{
  104.                         SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id,
  105.                                                      "page_id" => $result,
  106.                                                      "msg" => "on")true);
  107.                     exit;
  108.                     }
  109.                 }
  110.             }
  111.             break;
  112.  
  113.         default:
  114.             if (isset($_GET['msg']&& $_GET['msg'== 'on'){
  115.                 $this->tpl_onload "alert('登録が完了しました。');";
  116.             }
  117.         }
  118.  
  119.         if (!$is_error{
  120.             $this->arrPageList $objLayout->getPageProperties($this->device_type_idnull);
  121.             // page_id が指定されている場合にはテンプレートデータの取得
  122.             if (!SC_Utils_Ex::isBlank($this->page_id)) {
  123.                 $arrPageData $this->getTplMainpage($this->device_type_id$this->page_id$objLayout);
  124.                 $objFormParam->setParam($arrPageData);
  125.             }
  126.         else {
  127.             // 画面にエラー表示しないため, ログ出力
  128.             GC_Utils_Ex::gfPrintLog('Error: ' print_r($this->arrErrtrue));
  129.         }
  130.         $this->tpl_subtitle $this->arrDeviceType[$this->device_type_id'>' $this->tpl_subtitle;
  131.         $this->arrForm $objFormParam->getFormParamList();
  132.     }
  133.  
  134.     /**
  135.      * デストラクタ.
  136.      *
  137.      * @return void 
  138.      */
  139.     function destroy({
  140.         parent::destroy();
  141.     }
  142.  
  143.     /**
  144.      * パラメーター情報の初期化
  145.      *
  146.      * XXX URL のフィールドは, 実際は filename なので注意
  147.      *
  148.      * @param object $objFormParam SC_FormParamインスタンス
  149.      * @return void 
  150.      */
  151.     function lfInitParam(&$objFormParam{
  152.         $objFormParam->addParam("ページID""page_id"INT_LEN'n'array("NUM_CHECK""MAX_LENGTH_CHECK"));
  153.         $objFormParam->addParam("端末種別ID""device_type_id"INT_LEN'n'array("NUM_CHECK""MAX_LENGTH_CHECK"));
  154.         $objFormParam->addParam("名称""page_name"STEXT_LEN'KVa'array("SPTAB_CHECK""MAX_LENGTH_CHECK"));
  155.         $objFormParam->addParam("URL""filename"STEXT_LEN'a'array("SPTAB_CHECK""MAX_LENGTH_CHECK"));
  156.         $objFormParam->addParam("ヘッダチェック""header_chk"INT_LEN'n'array("NUM_CHECK""MAX_LENGTH_CHECK"));
  157.         $objFormParam->addParam("フッタチェック""footer_chk"INT_LEN'n'array("NUM_CHECK""MAX_LENGTH_CHECK"));
  158.         $objFormParam->addParam("修正フラグ""edit_flg"INT_LEN'n'array("NUM_CHECK""MAX_LENGTH_CHECK"));
  159.         $objFormParam->addParam("TPLデータ""tpl_data");
  160.      }
  161.  
  162.     /**
  163.      * ページデータを取得する.
  164.      *
  165.      * @param integer $device_type_id 端末種別ID
  166.      * @param integer $page_id ページID
  167.      * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス
  168.      * @return array ページデータの配列
  169.      */
  170.     function getTplMainpage($device_type_id$page_id&$objLayout){
  171.         $arrPageData $objLayout->getPageProperties($device_type_id$page_id);
  172.  
  173.         $templatePath $objLayout->getTemplatePath($device_type_id);
  174.         $filename $templatePath $arrPageData[0]['filename'".tpl";
  175.         if (file_exists($filename)) {
  176.             $arrPageData[0]['tpl_data'file_get_contents($filename);
  177.         }
  178.         // ファイル名を画面表示用に加工しておく
  179.         $arrPageData[0]['filename'preg_replace('|^' preg_quote(USER_DIR'|'''$arrPageData[0]['filename']);
  180.         return $arrPageData[0];
  181.     }
  182.  
  183.     /**
  184.      * 登録を実行する.
  185.      *
  186.      * ファイルの作成に失敗した場合は, エラーメッセージを出力し,
  187.      * データベースをロールバックする.
  188.      *
  189.      * @param SC_FormParam $objFormParam SC_FormParam インスタンス
  190.      * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス
  191.      * @return integer|boolean登録が成功した場合, 登録したページID;
  192.      *                          失敗した場合 false
  193.      */
  194.     function doRegister(&$objFormParam&$objLayout{
  195.         $filename $objFormParam->getValue('filename');
  196.         $arrParams['device_type_id'$objFormParam->getValue('device_type_id');
  197.         $arrParams['page_id'$objFormParam->getValue('page_id');
  198.         $arrParams['header_chk'intval($objFormParam->getValue('header_chk')) === 2;
  199.         $arrParams['footer_chk'intval($objFormParam->getValue('footer_chk')) === 2;
  200.         $arrParams['tpl_data'$objFormParam->getValue('tpl_data');
  201.         $arrParams['page_name'$objFormParam->getValue('page_name');
  202.         $arrParams['url'USER_DIR $filename '.php';
  203.         $arrParams['filename'USER_DIR $filename;
  204.  
  205.         $objQuery =SC_Query_Ex::getSingletonInstance();
  206.         $objQuery->begin();
  207.  
  208.         $page_id $this->registerPage($arrParams$objLayout);
  209.  
  210.         /*
  211.          * 新規登録時
  212.          * or 編集可能な既存ページ編集時かつ, PHP ファイルが存在しない場合に,
  213.          * PHP ファイルを作成する.
  214.          */
  215.         if (SC_Utils_Ex::isBlank($arrParams['page_id'])
  216.             || $objLayout->isEditablePage($arrParams['device_type_id']$arrParams['page_id'])) {
  217.             if (!$this->createPHPFile($filename)) {
  218.                 $this->arrErr['err''※ PHPファイルの作成に失敗しました<br />';
  219.                 $objQuery->rollback();
  220.                 return false;
  221.             }
  222.             // 新規登録時のみ $page_id を代入
  223.             $arrParams['page_id'$page_id;
  224.         }
  225.  
  226.         if ($objLayout->isEditablePage($arrParams['device_type_id']$page_id)) {
  227.             $tpl_path $objLayout->getTemplatePath($arrParams['device_type_id']$arrParams['filename''.tpl';
  228.         else {
  229.             $tpl_path $objLayout->getTemplatePath($arrParams['device_type_id']$filename '.tpl';
  230.         }
  231.  
  232.         if (!SC_Helper_FileManager_Ex::sfWriteFile($tpl_path$arrParams['tpl_data'])) {
  233.             $this->arrErr['err''※ TPLファイルの書き込みに失敗しました<br />';
  234.             $objQuery->rollback();
  235.             return false;
  236.         }
  237.  
  238.         $objQuery->commit();
  239.         return $arrParams['page_id'];
  240.     }
  241.  
  242.     /**
  243.      * 入力内容をデータベースに登録する.
  244.      *
  245.      * @param array $arrParams フォームパラメーターの配列
  246.      * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス
  247.      * @return integer ページID
  248.      */
  249.     function registerPage($arrParams&$objLayout{
  250.         $objQuery =SC_Query_Ex::getSingletonInstance();
  251.  
  252.         // ページIDが空の場合は新規登録
  253.         $is_new SC_Utils_Ex::isBlank($arrParams['page_id']);
  254.         // 既存ページの存在チェック
  255.         if (!$is_new{
  256.             $arrExists $objLayout->getPageProperties($arrParams['device_type_id']$arrParams['page_id']);
  257.         }
  258.  
  259.         $table 'dtb_pagelayout';
  260.         $arrValues $objQuery->extractOnlyColsOf($table$arrParams);
  261.         $arrValues['update_url'$_SERVER['HTTP_REFERER'];
  262.         $arrValues['update_date''CURRENT_TIMESTAMP';
  263.  
  264.         // 新規登録
  265.         if ($is_new || SC_Utils_Ex::isBlank($arrExists)) {
  266.             $objQuery->setOrder('');
  267.             $arrValues['page_id'$objQuery->max('page_id'$table'device_type_id = ?',
  268.                                                        array($arrValues['device_type_id']));
  269.             $arrValues['create_date''CURRENT_TIMESTAMP';
  270.             $objQuery->insert($table$arrValues);
  271.         }
  272.         // 更新
  273.         else {
  274.             // 編集不可ページは更新しない
  275.             if (!$objLayout->isEditablePage($arrValues['device_type_id']$arrValues['page_id'])) {
  276.                 unset($arrValues['page_name']);
  277.                 unset($arrValues['filename']);
  278.                 unset($arrValues['url']);
  279.             }
  280.  
  281.             $objQuery->update($table$arrValues'page_id = ? AND device_type_id = ?',
  282.                               array($arrValues['page_id']$arrValues['device_type_id']));
  283.         }
  284.         return $arrValues['page_id'];
  285.     }
  286.  
  287.     /**
  288.      * エラーチェックを行う.
  289.      *
  290.      * @param SC_FormParam $objFormParam SC_FormParam インスタンス
  291.      * @return array エラーメッセージの配列
  292.      */
  293.     function lfCheckError(&$objFormParam&$arrErr{
  294.         $arrParams $objFormParam->getHashArray();
  295.         $objErr new SC_CheckError_Ex($arrParams);
  296.         $objErr->arrErr =$arrErr;
  297.         $objErr->doFunc(array("名称""page_name"STEXT_LEN)array("EXIST_CHECK""SPTAB_CHECK""MAX_LENGTH_CHECK"));
  298.         $objErr->doFunc(array('URL''filename'STEXT_LEN)array("EXIST_CHECK""SPTAB_CHECK""MAX_LENGTH_CHECK"));
  299.  
  300.         /*
  301.          * URL チェック
  302.          * ここでチェックするのは, パスのみなので SC_CheckError::URL_CHECK()
  303.          * は使用しない
  304.          */
  305.         $valid_url true;
  306.         foreach (explode('/'$arrParams['filename']as $val{
  307.             if (!preg_match('/^[a-zA-Z0-9:_~\.\-]+$/'$val)) {
  308.                 $valid_url false;
  309.             }
  310.             if ($val == '.' || $val == '..'{
  311.                 $valid_url false;
  312.             }
  313.         }
  314.         if (!$valid_url{
  315.             $objErr->arrErr['filename'"※ URLを正しく入力してください。<br />";
  316.         }
  317.         // 同一URLの存在チェック
  318.         $where 'page_id <> 0 AND device_type_id = ? AND filename = ?';
  319.         $arrValues array($arrParams['device_type_id']USER_DIR $arrParams['filename']);
  320.         // 変更の場合は自 URL を除外
  321.         if (!SC_Utils_Ex::isBlank($arrParams['page_id'])) {
  322.             $where .= ' AND page_id <> ?';
  323.             $arrValues[$arrParams['page_id'];
  324.         }
  325.  
  326.         $objQuery =SC_Query_Ex::getSingletonInstance();
  327.         $count $objQuery->count('dtb_pagelayout'$where$arrValues);
  328.         if ($count 0{
  329.             $objErr->arrErr['filename''※ 同じURLのデータが存在しています。別のURLを入力してください。<br />';
  330.         }
  331.         return $objErr->arrErr;
  332.     }
  333.  
  334.     /**
  335.      * PHP ファイルを生成する.
  336.      *
  337.      * 既に同名の PHP ファイルが存在する場合は何もせず true を返す.(#831)
  338.      *
  339.      * @param string $filename フォームパラメーターの filename
  340.      * @return boolean 作成に成功した場合 true
  341.      */
  342.     function createPHPFile($filename{
  343.         $path USER_REALDIR $filename '.php';
  344.  
  345.         if (file_exists($path)) {
  346.             return true;
  347.         }
  348.  
  349.         if (file_exists(USER_DEF_PHP_REALFILE)) {
  350.             $php_contents file_get_contents(USER_DEF_PHP_REALFILE);
  351.         else {
  352.             return false;
  353.         }
  354.  
  355.         // require.php の PATH を書き換える
  356.         $defaultStrings "exit; // Don't rewrite. This line is rewritten by EC-CUBE.";
  357.         $replaceStrings "require_once '" str_repeat('../'substr_count($filename'/')) "../require.php';";
  358.         $php_contents str_replace($defaultStrings$replaceStrings$php_contents);
  359.  
  360.         return SC_Helper_FileManager_Ex::sfWriteFile($path$php_contents);
  361.     }
  362. }
  363. ?>

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