Changeset 20847


Ignore:
Timestamp:
2011/04/15 22:58:24 (10 years ago)
Author:
nanasess
bzr:base-revision:
svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_11-dev:20846
bzr:committer:
Kentaro Ohkouchi <ohkouchi@loop-az.jp>
bzr:file-ids:

data/Smarty/templates/admin/design/main_edit.tpl 15732@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2FSmarty%2Ftemplates%2Fdefault%2Fadmin%2Fdesign%2Fmain_edit.tpl
data/class/helper/SC_Helper_FileManager.php 16253@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_FileManager.php
data/class/helper/SC_Helper_PageLayout.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_PageLayout.php
data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php 15682@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fpages%2Fadmin%2Fdesign%2FLC_Page_Admin_Design_MainEdit.php
data/class/util/SC_Utils.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Futil%2FSC_Utils.php
test/class/util/SC_Utils_Test.php sc_utils_test.php-20100802013957-750m2yralg9cowkd-1
bzr:mapping-version:
v4
bzr:merge:

ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
bzr:repository-uuid:
1e3b908f-19a9-db11-a64c-001125224ba8
bzr:revision-id:
ohkouchi@loop-az.jp-20110415135820-5xdfd57eknr425dj
bzr:revno:
3558
bzr:revprop:branch-nick:
branches/version-2_11-dev
bzr:root:
branches/version-2_11-dev
bzr:text-revisions:

data/Smarty/templates/admin/design/main_edit.tpl ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
data/class/helper/SC_Helper_FileManager.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
data/class/helper/SC_Helper_PageLayout.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
test/class/util/SC_Utils_Test.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
bzr:timestamp:
2011-04-15 22:58:20.900000095 +0900
bzr:user-agent:
bzr2.2.1+bzr-svn1.0.4
svn:original-date:
2011-04-15T13:58:20.900000Z
Message:

#972 (リファクタリング開発:[管理画面]デザイン管理)

  • ページ詳細設定
Location:
branches/version-2_11-dev
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_11-dev/data/Smarty/templates/admin/design/main_edit.tpl

    r20813 r20847  
    2727    document.form_edit.target = "_self"; 
    2828} 
    29  
    30 browser_type = 0; 
    31 if(navigator.userAgent.indexOf("MSIE") >= 0){ 
    32     browser_type = 1; 
    33 } 
    34 else if(navigator.userAgent.indexOf("Mozilla") >= 0){ 
    35     browser_type = 2; 
    36 } 
    3729//--> 
    3830</script> 
     
    4537<input type="hidden" name="device_type_id" value="<!--{$device_type_id|h}-->" /> 
    4638 
    47     <!--{if $arrErr.page_id_err != ""}--> 
     39    <!--{if $arrErr.err != ""}--> 
    4840        <div class="message"> 
    49             <span class="attention"><!--{$arrErr.page_id_err}--></span> 
     41            <span class="attention"><!--{$arrErr.err}--></span> 
    5042        </div> 
    5143    <!--{/if}--> 
     
    5446            <th>名称</th> 
    5547            <td> 
    56                 <!--{if $arrPageData.edit_flg == 2}--> 
    57                     <!--{$arrPageData.page_name|h}--><input type="hidden" name="page_name" value="<!--{$arrPageData.page_name|h}-->" /> 
     48                <!--{assign var=key value="page_name"}--> 
     49                <!--{if $arrForm.edit_flg.value == 2}--> 
     50                    <!--{$arrForm[$key].value|h}--><input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" /> 
    5851                <!--{else}--> 
    59                     <input type="text" name="page_name" value="<!--{$arrPageData.page_name|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.page_name != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->" size="60" class="box60" /><span class="attention"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span> 
     52                    <input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" maxlength="<!--{$arrForm[$key].length|h}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" size="60" class="box60" /><span class="attention"> (上限<!--{$arrForm[$key].length|h}-->文字)</span> 
    6053                <!--{/if}--> 
    61                 <!--{if $arrErr.page_name != ""}--> 
     54                <!--{if $arrErr[$key] != ""}--> 
    6255                    <div class="message"> 
    63                         <span class="attention"><!--{$arrErr.page_name}--></span> 
     56                        <span class="attention"><!--{$arrErr[$key]}--></span> 
    6457                    </div> 
    6558                <!--{/if}--> 
     
    6962        <th>URL</th> 
    7063            <td> 
    71                 <!--{if $arrPageData.edit_flg == 2}--> 
    72                     <!--{$smarty.const.HTTP_URL|h}--><!--{$arrPageData.url|h}--> 
    73                     <input type="hidden" name="url" value="<!--{$arrPageData.filename|h}-->" /> 
     64                <!--{assign var=key value="filename"}--> 
     65                <!--{if $arrForm.edit_flg.value == 2}--> 
     66                    <!--{$smarty.const.HTTP_URL|h}--><!--{$arrForm[$key].value|h}-->.php 
     67                    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" /> 
    7468                <!--{else}--> 
    75                     <!--{$smarty.const.USER_URL|h}--><input type="text" name="url" value="<!--{$arrPageData.filename|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.url != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}--> ime-mode: disabled;" size="40" class="box40" />.php<span class="attention"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span> 
     69                    <!--{$smarty.const.USER_URL|h}--><input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" maxlength="<!--{$arrForm[$key].length|h}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" ime-mode: disabled;" size="40" class="box40" />.php<span class="attention"> (上限<!--{$arrForm[$key].length|h}-->文字)</span> 
    7670                <!--{/if}--> 
    77                 <!--{if $arrErr.url != ""}--> 
     71                <!--{if $arrErr[$key] != ""}--> 
    7872                    <div class="attention"> 
    79                         <span class="attention"><!--{$arrErr.url}--></span> 
     73                        <span class="attention"><!--{$arrErr[$key]}--></span> 
    8074                    </div> 
    8175                <!--{/if}--> 
     
    8478        <tr> 
    8579            <td colspan="2"> 
    86                 <label for="header-chk"><input type="checkbox" name="header_chk" id="header-chk" value="1" <!--{if $arrPageData.header_chk == "1"}-->checked="checked"<!--{/if}--> />共通のヘッダーを使用する</label>&nbsp; 
    87                 <label for="footer-chk"><input type="checkbox" name="footer_chk" id="footer-chk" value="1" <!--{if $arrPageData.footer_chk == "1"}-->checked="checked"<!--{/if}--> />共通のフッターを使用する</label> 
     80                <label for="header-chk"><input type="checkbox" name="header_chk" id="header-chk" value="1" <!--{if $arrForm.header_chk.value == "1"}-->checked="checked"<!--{/if}--> />共通のヘッダーを使用する</label>&nbsp; 
     81                <label for="footer-chk"><input type="checkbox" name="footer_chk" id="footer-chk" value="1" <!--{if $arrForm.footer_chk.value == "1"}-->checked="checked"<!--{/if}--> />共通のフッターを使用する</label> 
    8882                <div> 
    89                     <textarea id="tpl_data" class="top" name="tpl_data" rows=<!--{$text_row}--> style="width: 98%;"><!--{$arrPageData.tpl_data|h|smarty:nodefaults}--></textarea> 
     83                    <textarea id="tpl_data" class="top" name="tpl_data" rows=<!--{$text_row}--> style="width: 98%;"><!--{$arrForm.tpl_data.value|h|smarty:nodefaults}--></textarea> 
    9084                    <input type="hidden" name="html_area_row" value="<!--{$text_row}-->" /><br /> 
    9185                    <a id="resize-btn" class="btn-normal" href="javascript:;" onclick="ChangeSize('#resize-btn', '#tpl_data', 50, 13); return false;"><span>拡大</span></a> 
     
    10296 
    10397    <h2>編集可能ページ一覧</h2> 
     98    <div class="btn addnew"> 
     99        <a class="btn-normal" href="?device_type_id=<!--{$device_type_id|u}-->"><span>ページを新規入力</span></a> 
     100    </div> 
    104101    <table class="list"> 
    105102        <colgroup width="70%"> 
     
    134131        <!--{/foreach}--> 
    135132    </table> 
    136     <div class="btn addnew"> 
    137         <a class="btn-normal" href="?device_type_id=<!--{$device_type_id|u}-->"><span>ページを新規入力</span></a> 
    138     </div> 
    139133</form> 
  • branches/version-2_11-dev/data/class/helper/SC_Helper_FileManager.php

    r20764 r20847  
    345345     * @param string $filename ファイルパス 
    346346     * @param string $value 書き込み内容 
     347     * @return boolean ファイルの書き込みに成功した場合 true 
    347348     */ 
    348349    function sfWriteFile($filename, $value) { 
    349         $fp = @fopen($filename, 'w'); 
    350         // ファイルに書き込む 
    351         if($fp) { 
    352             fwrite($fp, $value); 
    353         } 
    354         @fclose($fp); 
     350        if (!is_dir(dirname($filename))) { 
     351            SC_Utils_Ex::recursiveMkdir(dirname($filename), 0777); 
     352        } 
     353        $fp = fopen($filename,'w'); 
     354        if ($fp === false) { 
     355            return false; 
     356        } 
     357        if (fwrite($fp, $value) === false) { 
     358            return false; 
     359        } 
     360        return fclose($fp);; 
    355361    } 
    356362 
  • branches/version-2_11-dev/data/class/helper/SC_Helper_PageLayout.php

    r20830 r20847  
    5858            $arrPageData = $this->getPageProperties($device_type_id, 0); 
    5959        } 
     60 
    6061        $objPage->tpl_mainpage = $this->getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . ".tpl"; 
    6162        $objPage->arrPageLayout =& $arrPageData[0]; 
     
    185186        if ($page_id != '') { 
    186187            $arrPageData = $this->getPageProperties($device_type_id, $page_id); 
    187             // SQL実行 
    188188            $ret = $objQuery->delete("dtb_pagelayout", "page_id = ? AND device_type_id = ?", array($page_id, $device_type_id)); 
    189  
    190189            // ファイルの削除 
    191190            $this->lfDelFile($arrPageData[0]['filename'], $device_type_id); 
     
    207206        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    208207 
    209         // 同名ファイルの使用件数 
     208        /* 
     209         * 同名ファイルの使用件数 
     210         * PHP ファイルは, 複数のデバイスで共有するため, device_type_id を条件に入れない 
     211         */ 
    210212        $count = $objQuery->count('dtb_pagelayout', 'filename = ?', array($filename)); 
    211213 
  • branches/version-2_11-dev/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php

    r20841 r20847  
    2424// {{{ requires 
    2525require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php'; 
     26require_once CLASS_EX_REALDIR . 'helper_extends/SC_Helper_FileManager_Ex.php'; 
    2627 
    2728/** 
     
    7071     */ 
    7172    function action() { 
    72         $objView = new SC_AdminView_Ex(); 
    73         $this->objLayout = new SC_Helper_PageLayout_Ex(); 
    74  
    75         // ページIDを取得 
    76         if (isset($_REQUEST['page_id']) && is_numeric($_REQUEST['page_id'])) { 
    77             $page_id = $_REQUEST['page_id']; 
    78         } 
    79  
    80         $this->page_id = $page_id; 
    81  
    82         // 端末種別IDを取得 
    83         if (isset($_REQUEST['device_type_id']) 
    84             && is_numeric($_REQUEST['device_type_id'])) { 
    85             $device_type_id = $_REQUEST['device_type_id']; 
    86         } else { 
    87             $device_type_id = DEVICE_TYPE_PC; 
    88         } 
    89  
    90         //サブタイトルの追加 
    91         $this->tpl_subtitle .= ' - ' . $this->arrDeviceType[$device_type_id]; 
    92  
    93         // ページ一覧を取得 
    94         $this->arrPageList = $this->objLayout->getPageProperties($device_type_id, null); 
    95  
    96         // メッセージ表示 
    97         if (isset($_GET['msg']) && $_GET['msg'] == 'on'){ 
    98             $this->tpl_onload="alert('登録が完了しました。');"; 
    99         } 
    100  
    101         // page_id が指定されている場合にはテンプレートデータの取得 
    102         if (is_numeric($page_id) && $page_id != '') { 
    103             $this->arrPageData = $this->lfGetPageData($page_id, $device_type_id, $objView); 
    104         } 
     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'); 
    10583 
    10684        switch ($this->getMode()) { 
    10785        case 'delete': 
    108             if ($this->objLayout->isEditablePage($device_type_id, $page_id)) { 
    109                 $this->lfDeletePageData($page_id, $device_type_id); 
    110                 exit; 
     86            if (!$is_error) { 
     87                if ($objLayout->isEditablePage($this->device_type_id, $this->page_id)) { 
     88                    $objLayout->lfDelPageData($this->page_id, $this->device_type_id); 
     89                    SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id, 
     90                                                 "msg" => "on"), true); 
     91                    exit; 
     92                } 
    11193            } 
    11294            break; 
    11395 
    11496        case 'confirm': 
    115             $this->lfConfirmPageData($page_id, $device_type_id); 
     97            if (!$is_error) { 
     98                $this->arrErr = $this->lfCheckError($objFormParam, $this->arrErr); 
     99                if (SC_Utils_Ex::isBlank($this->arrErr)) { 
     100                    $result = $this->doRegister($objFormParam, $objLayout); 
     101                    if ($result !== false) { 
     102                        SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id, 
     103                                                     "page_id" => $result, 
     104                                                     "msg" => "on"), true); 
     105                    exit; 
     106                    } 
     107                } 
     108            } 
    116109        default: 
    117         } 
    118         $this->device_type_id = $device_type_id; 
     110            if (isset($_GET['msg']) && $_GET['msg'] == 'on'){ 
     111                $this->tpl_onload = "alert('登録が完了しました。');"; 
     112            } 
     113        } 
     114 
     115        if (!$is_error) { 
     116            $this->arrPageList = $objLayout->getPageProperties($this->device_type_id, null); 
     117            // page_id が指定されている場合にはテンプレートデータの取得 
     118            if (!SC_Utils_Ex::isBlank($this->page_id)) { 
     119                $arrPageData = $this->getTplMainpage($this->device_type_id, $this->page_id, $objLayout); 
     120                $objFormParam->setParam($arrPageData); 
     121            } 
     122        } else { 
     123            // 画面にエラー表示しないため, ログ出力 
     124            GC_Utils_Ex::gfPrintLog('Error: ' . print_r($this->arrErr, true)); 
     125        } 
     126        $this->tpl_subtitle .= ' - ' . $this->arrDeviceType[$this->device_type_id]; 
     127        $this->arrForm = $objFormParam->getFormParamList(); 
    119128    } 
    120129 
     
    129138 
    130139    /** 
     140     * パラメータ情報の初期化 
     141     * 
     142     * XXX URL のフィールドは, 実際は filename なので注意 
     143     * 
     144     * @param object $objFormParam SC_FormParamインスタンス 
     145     * @return void 
     146     */ 
     147    function lfInitParam(&$objFormParam) { 
     148        $objFormParam->addParam("ページID", "page_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 
     149        $objFormParam->addParam("端末種別ID", "device_type_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 
     150        $objFormParam->addParam("名称", "page_name", STEXT_LEN, 'KVa', array("SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
     151        $objFormParam->addParam("URL", "filename", STEXT_LEN, 'a', array("SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
     152        $objFormParam->addParam("ヘッダチェック", "header_chk", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 
     153        $objFormParam->addParam("フッタチェック", "footer_chk", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 
     154        $objFormParam->addParam("修正フラグ", "edit_flg", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 
     155        $objFormParam->addParam("TPLデータ", "tpl_data"); 
     156     } 
     157 
     158    /** 
    131159     * ページデータを取得する. 
    132160     * 
     161     * @param integer $device_type_id 端末種別ID 
    133162     * @param integer $page_id ページID 
    134      * @param integer $device_type_id 端末種別ID 
    135      * @param object $objView ビューオブジェクト 
    136      * @return void 
    137      */ 
    138     function lfGetPageData($page_id, $device_type_id, $objView){ 
    139         $arrPageData = $this->objLayout->getPageProperties($device_type_id, $page_id); 
    140  
    141         if (strlen($arrPageData[0]['filename']) == 0) { 
    142             $this->arrErr['page_id_err'] = "※ 指定されたページは編集できません。"; 
    143             // 画面の表示 
    144             $objView->assignobj($this); 
    145             $objView->display(MAIN_FRAME); 
    146             exit; 
    147         } 
    148  
    149         // テンプレートを読み込む 
    150         $templatePath = $this->objLayout->getTemplatePath($device_type_id); 
    151         $arrPageData[0]['tpl_data'] = file_get_contents($templatePath . $arrPageData[0]['filename'] . ".tpl"); 
    152  
    153         // ディレクトリを画面表示用に編集 
     163     * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 
     164     * @return array ページデータの配列 
     165     */ 
     166    function getTplMainpage($device_type_id, $page_id, &$objLayout){ 
     167        $arrPageData = $objLayout->getPageProperties($device_type_id, $page_id); 
     168 
     169        $templatePath = $objLayout->getTemplatePath($device_type_id); 
     170        $filename = $templatePath . $arrPageData[0]['filename'] . ".tpl"; 
     171        if (file_exists($filename)) { 
     172            $arrPageData[0]['tpl_data'] = file_get_contents($filename); 
     173        } 
     174        // ファイル名を画面表示用に加工しておく 
    154175        $arrPageData[0]['filename'] = preg_replace('|^' . preg_quote(USER_DIR) . '|', '', $arrPageData[0]['filename']); 
    155  
    156176        return $arrPageData[0]; 
    157177    } 
    158178 
    159179    /** 
    160      * データ登録処理. 
    161      * 
    162      * @param integer $page_id ページID 
    163      * @param integer $device_type_id 端末種別ID 
    164      * @return void 
    165      */ 
    166     function lfConfirmPageData($page_id, $device_type_id) { 
    167         // エラーチェック 
    168         $this->arrErr = $this->lfErrorCheck($_POST, $device_type_id); 
    169  
    170         // エラーがなければ更新処理を行う 
    171         if (count($this->arrErr) == 0) { 
    172             // DBへデータを更新する 
    173             $arrTmp = $this->lfEntryPageData( 
    174                 $device_type_id, 
    175                 $page_id, 
    176                 $_POST['page_name'], 
    177                 USER_DIR . $_POST['url'], 
    178                 intval($_POST['header_chk']) === 1 ? 1 : 2, 
    179                 intval($_POST['footer_chk']) === 1 ? 1 : 2 
    180             ); 
    181             $page_id = $arrTmp['page_id']; 
    182  
    183             $arrTmp = $this->objLayout->getPageProperties($device_type_id, $page_id); 
    184             $arrData = $arrTmp[0]; 
    185  
    186             // ベースデータでなければファイルを削除し、PHPファイルを作成する 
    187             if ($this->objLayout->isEditablePage($device_type_id, $arrData['page_id'])) { 
    188                 // PHPファイル作成 
    189                 $this->lfCreatePHPFile($_POST['url'], $device_type_id); 
    190             } 
    191  
    192             // TPLファイル作成 
    193             $cre_tpl = $this->objLayout->getTemplatePath($device_type_id) . $arrData['filename'] . '.tpl'; 
    194             $this->lfCreateFile($cre_tpl, $_POST['tpl_data']); 
    195  
    196             $arrQueryString = array( 
    197                 "page_id" => $arrData['page_id'], 
    198                 "device_type_id" => $device_type_id, 
    199                 'msg'     => 'on', 
    200             ); 
    201             $this->objDisplay->reload($arrQueryString, true); 
    202             exit; 
     180     * 登録を実行する. 
     181     * 
     182     * ファイルの作成に失敗した場合は, エラーメッセージを出力し, 
     183     * データベースをロールバックする. 
     184     * 
     185     * @param SC_FormParam $objFormParam SC_FormParam インスタンス 
     186     * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 
     187     * @return integer|boolean 登録が成功した場合, 登録したページID; 
     188     *                         失敗した場合 false 
     189     */ 
     190    function doRegister($objFormParam, &$objLayout) { 
     191        $filename = $objFormParam->getValue('filename'); 
     192        $arrParams['device_type_id'] = $objFormParam->getValue('device_type_id'); 
     193        $arrParams['page_id'] = $objFormParam->getValue('page_id'); 
     194        $arrParams['header_chk'] = intval($objFormParam->getValue('header_chk')) === 1 ? 1 : 2; 
     195        $arrParams['footer_chk'] = intval($objFormParam->getValue('footer_chk')) === 1 ? 1 : 2; 
     196        $arrParams['tpl_data'] = $objFormParam->getValue('tpl_data'); 
     197        $arrParams['page_name'] = $objFormParam->getValue('page_name'); 
     198        $arrParams['url'] = USER_DIR . $filename . '.php'; 
     199        $arrParams['filename'] = USER_DIR . $filename; 
     200 
     201        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
     202        $objQuery->begin(); 
     203 
     204        $page_id = $this->registerPage($arrParams, $objLayout); 
     205 
     206        /* 
     207         * 新規登録時 
     208         * or 編集可能な既存ページ編集時かつ, PHP ファイルが存在しない場合に, 
     209         * PHP ファイルを作成する. 
     210         */ 
     211        if (SC_Utils_Ex::isBlank($arrParams['page_id']) 
     212            || $objLayout->isEditablePage($arrParams['device_type_id'], $arrParams['page_id'])) { 
     213            if (!$this->createPHPFile($filename)) { 
     214                $this->arrErr['err'] = '※ PHPファイルの作成に失敗しました<br />'; 
     215                $objQuery->rollback(); 
     216                return false; 
     217            } 
     218            // 新規登録時のみ $page_id を代入 
     219            $arrParams['page_id'] = $page_id; 
     220        } 
     221 
     222        if ($objLayout->isEditablePage($arrParams['device_type_id'], $page_id)) { 
     223            $tpl_path = $objLayout->getTemplatePath($arrParams['device_type_id']) . $arrParams['filename'] . '.tpl'; 
    203224        } else { 
    204             // エラーがあれば入力時のデータを表示する 
    205             $this->arrPageData = $_POST; 
    206             $this->arrPageData['directory'] = ''; 
    207             $this->arrPageData['filename'] = $_POST['url']; 
    208         } 
    209     } 
    210  
    211     /** 
    212      * ブロック情報を更新する. 
    213      * 
    214      * @param integer $device_type_id 
    215      * @param integer $page_id 
    216      * @param string $page_name 
    217      * @param string $filename 
    218      * @param integer $header_chk 
    219      * @param integer $footer_chk 
    220      * @return array 実際に使用した更新データ 
    221      */ 
    222     function lfEntryPageData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk) { 
    223         $objQuery = new SC_Query_Ex(); 
    224         $arrChk = array();          // 排他チェック用 
    225  
    226         // 更新用データの変換 
    227         $sqlval = $this->lfGetUpdData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk); 
    228  
    229         // データが存在しているかチェックを行う 
    230         if ($page_id !== ''){ 
    231             $arrChk = $this->objLayout->getPageProperties($device_type_id, $page_id); 
    232         } 
    233  
    234         // page_id が空 若しくは データが存在していない場合にはINSERTを行う 
    235         if ($page_id === '' || !isset($arrChk[0])) { 
    236             // FIXME device_type_id ごとの連番にする 
    237             $sqlval['page_id'] = $objQuery->nextVal('dtb_pagelayout_page_id'); 
    238             $sqlval['device_type_id'] = $device_type_id; 
    239             $sqlval['create_date'] = 'now()'; 
    240             $objQuery->insert('dtb_pagelayout', $sqlval); 
    241         } 
    242         // データが存在してる場合にはアップデートを行う 
     225            $tpl_path = $objLayout->getTemplatePath($arrParams['device_type_id']) . $filename . '.tpl'; 
     226        } 
     227 
     228        if (!SC_Helper_FileManager_Ex::sfWriteFile($tpl_path, $arrParams['tpl_data'])) { 
     229            $this->arrErr['err'] = '※ TPLファイルの書き込みに失敗しました<br />'; 
     230            $objQuery->rollback(); 
     231            return false; 
     232        } 
     233 
     234        $objQuery->commit(); 
     235        return $arrParams['page_id']; 
     236    } 
     237 
     238    /** 
     239     * 入力内容をデータベースに登録する. 
     240     * 
     241     * @param array $arrParams フォームパラメータの配列 
     242     * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 
     243     * @return integer ページID 
     244     */ 
     245    function registerPage($arrParams, &$objLayout) { 
     246        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
     247 
     248        // ページIDが空の場合は新規登録 
     249        $is_new = SC_Utils_Ex::isBlank($arrParams['page_id']); 
     250        // 既存ページの存在チェック 
     251        if (!$is_new) { 
     252            $arrExists = $objLayout->getPageProperties($arrParams['device_type_id'], $arrParams['page_id']); 
     253        } 
     254 
     255        $table = 'dtb_pagelayout'; 
     256        $arrValues = $objQuery->extractOnlyColsOf($table, $arrParams); 
     257        $arrValues['update_url'] = $_SERVER['HTTP_REFERER']; 
     258        $arrValues['update_date'] = 'now()'; 
     259 
     260        // 新規登録 
     261        if ($is_new || SC_Utils_Ex::isBlank($arrExists)) { 
     262            $objQuery->setOrder(''); 
     263            $arrValues['page_id'] = 1 + $objQuery->max('page_id', $table, 'device_type_id = ?', 
     264                                                       array($arrValues['device_type_id'])); 
     265            $arrValues['create_date'] = 'now()'; 
     266            $objQuery->insert($table, $arrValues); 
     267        } 
     268        // 更新 
    243269        else { 
    244             $objQuery->update('dtb_pagelayout', $sqlval, 'page_id = ? AND device_type_id = ?', 
    245                               array($page_id, $device_type_id)); 
    246             // 戻り値用 
    247             $sqlval['page_id'] = $page_id; 
    248         } 
    249         return $sqlval; 
    250     } 
    251  
    252     /** 
    253      * DBへ更新を行うデータを生成する. 
    254      * 
    255      * @param integer $device_type_id 
    256      * @param integer $page_id 
    257      * @param string $page_name 
    258      * @param string $filename 
    259      * @param integer $header_chk 
    260      * @param integer $footer_chk 
    261      * @return array 更新データ 
    262      */ 
    263     function lfGetUpdData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk) { 
    264         $arrUpdData = array( 
    265             'header_chk'    => $header_chk,  // ヘッダー使用 
    266             'footer_chk'    => $footer_chk,  // フッター使用 
    267             'update_url'    => $_SERVER['HTTP_REFERER'],                    // 更新URL 
    268             'update_date'   => 'now()', 
    269         ); 
    270  
    271         // ベースデータの場合には変更しない。 
    272         if ($this->objLayout->isEditablePage($device_type_id, $page_id)) { 
    273             $arrUpdData['page_name']    = $page_name; 
    274             $arrUpdData['url']          = $filename . '.php'; 
    275             $arrUpdData['filename']     = $filename; // 拡張子を付加しない 
    276         } 
    277  
    278         return $arrUpdData; 
    279     } 
    280  
    281     /** 
    282      * ページデータを削除する. 
    283      * 
    284      * @param integer $page_id ページID 
    285      * @return void 
    286      */ 
    287     function lfDeletePageData($page_id, $device_type_id){ 
    288         $this->objLayout->lfDelPageData($page_id, $device_type_id); 
    289         $this->objDisplay->reload(array("device_type_id" => $device_type_id), true); 
    290     } 
    291  
    292     /** 
    293      * 入力項目のエラーチェックを行う. 
    294      * 
    295      * XXX $device_type_id が dtb_pagelayout の検索条件に入ってない 
    296      * 
    297      * @param array $arrData 入力データ 
    298      * @param integer $device_type_id 端末種別ID 
    299      * @return array エラー情報 
    300      */ 
    301     function lfErrorCheck($array, $device_type_id) { 
    302         $objErr = new SC_CheckError_Ex($array); 
     270            // 編集不可ページは更新しない 
     271            if (!$objLayout->isEditablePage($arrValues['device_type_id'], $arrValues['page_id'])) { 
     272                unset($arrValues['page_name']); 
     273                unset($arrValues['filename']); 
     274                unset($arrValues['url']); 
     275            } 
     276 
     277            $objQuery->update('dtb_pagelayout', $arrValues, 'page_id = ? AND device_type_id = ?', 
     278                              array($arrValues['page_id'], $arrValues['device_type_id'])); 
     279        } 
     280        return $arrValues['page_id']; 
     281    } 
     282 
     283    /** 
     284     * エラーチェックを行う. 
     285     * 
     286     * @param SC_FormParam $objFormParam SC_FormParam インスタンス 
     287     * @return array エラーメッセージの配列 
     288     */ 
     289    function lfCheckError(&$objFormParam, &$arrErr) { 
     290        $arrParams = $objFormParam->getHashArray(); 
     291        $objErr = new SC_CheckError_Ex($arrParams); 
     292        $objErr->arrErr =& $arrErr; 
    303293        $objErr->doFunc(array("名称", "page_name", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
    304         $objErr->doFunc(array('URL', 'url', STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
    305  
    306         // URLチェック 
    307         $okUrl = true; 
    308         foreach (explode('/', $array['url']) as $url_part) { 
    309             if (!ereg( '^[a-zA-Z0-9:_~\.-]+$', $url_part)) { 
    310                 $okUrl = false; 
    311             } 
    312             if ($url_part == '.' || $url_part == '..') { 
    313                 $okUrl = false; 
    314             } 
    315         } 
    316         if (!$okUrl) { 
    317             $objErr->arrErr['url'] = "※ URLを正しく入力してください。<br />"; 
    318         } 
    319  
    320         // 同一のURLが存在している場合にはエラー 
    321         $params = array(); 
    322  
    323         $sqlWhere = 'url = ?'; 
    324         $params[] = $this->objLayout->getUserDir($device_type_id) . $array['url'] . '.php'; 
    325  
    326         // プレビュー用のレコードは除外 
    327         $sqlWhere .= ' AND page_id <> 0'; 
    328  
    329         // 変更の場合、自身のレコードは除外 
    330         if (strlen($array['page_id']) != 0) { 
    331             $sqlWhere .= ' AND page_id <> ?'; 
    332             $params[] = $array['page_id']; 
     294        $objErr->doFunc(array('URL', 'filename', STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
     295 
     296        /* 
     297         * URL チェック 
     298         * ここでチェックするのは, パスのみなので SC_CheckError::URL_CHECK() 
     299         * は使用しない 
     300         */ 
     301        $valid_url = true; 
     302        foreach (explode('/', $arrParams['filename']) as $val) { 
     303            if (!preg_match('/^[a-zA-Z0-9:_~\.\-]+$/', $val)) { 
     304                $valid_url = false; 
     305            } 
     306            if ($val == '.' || $val == '..') { 
     307                $valid_url = false; 
     308            } 
     309        } 
     310        if (!$valid_url) { 
     311            $objErr->arrErr['filename'] = "※ URLを正しく入力してください。<br />"; 
     312        } 
     313        // 同一URLの存在チェック 
     314        $where = 'page_id <> 0 AND device_type_id = ? AND filename = ?'; 
     315        $arrValues = array($arrParams['device_type_id'], 
     316                           SC_Helper_PageLayout_Ex::getUserDir($arrParams['device_type_id']) . $arrParams['filename'] . '.php'); 
     317        // 変更の場合は自 URL を除外 
     318        if (!SC_Utils_Ex::isBlank($arrParams['page_id'])) { 
     319            $where .= ' AND page_id <> ?'; 
     320            $arrValues[] = $arrParams['page_id']; 
    333321        } 
    334322 
    335323        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    336         $arrChk = $objQuery->select('*', 'dtb_pagelayout', $sqlWhere, $params); 
    337  
    338         if (count($arrChk) >= 1) { 
    339             $objErr->arrErr['url'] = '※ 同じURLのデータが存在しています。別のURLを付けてください。<br />'; 
    340         } 
    341  
     324        $count = $objQuery->count('dtb_pagelayout', $where, $arrValues); 
     325        if ($count > 0) { 
     326            $objErr->arrErr['filename'] = '※ 同じURLのデータが存在しています。別のURLを入力してください。<br />'; 
     327        } 
    342328        return $objErr->arrErr; 
    343329    } 
    344330 
    345331    /** 
    346      * ファイルを作成する. 
    347      * 
    348      * @param string $path テンプレートファイルのパス 
    349      * @param string $data テンプレートの内容 
    350      * @return void 
    351      */ 
    352     function lfCreateFile($path, $data){ 
    353  
    354         // ディレクトリが存在していなければ作成する 
    355         if (!is_dir(dirname($path))) { 
    356             mkdir(dirname($path), 0777, true); // FIXME (PHP4) 
    357         } 
    358  
    359         // ファイル作成 
    360         $fp = fopen($path,'w'); 
    361         if ($fp === false) { 
    362             SC_Utils_Ex::sfDispException(); 
    363         } 
    364         $ret = fwrite($fp, $data); 
    365         if ($ret === false) { 
    366             SC_Utils_Ex::sfDispException(); 
    367         } 
    368         fclose($fp); 
    369     } 
    370  
    371     /** 
    372      * PHPファイルを作成する. 
    373      * 
    374      * @param string $path PHPファイルのパス 
    375      * @return void 
    376      */ 
    377     function lfCreatePHPFile($url, $device_type_id){ 
    378  
    379         $path = USER_REALDIR . $url . ".php"; 
    380  
    381         // カスタマイズを考慮し、上書きしない。(#831) 
     332     * PHP ファイルを生成する. 
     333     * 
     334     * 既に同名の PHP ファイルが存在する場合は何もせず true を返す.(#831) 
     335     * 
     336     * @param string $filename フォームパラメータの filename 
     337     * @return boolean 作成に成功した場合 true 
     338     */ 
     339    function createPHPFile($filename) { 
     340        $path = USER_REALDIR . $filename . '.php'; 
     341 
    382342        if (file_exists($path)) { 
    383             return; 
    384         } 
    385  
    386         // php保存先ディレクトリが存在していなければ作成する 
    387         if (!is_dir(dirname($path))) { 
    388             mkdir(dirname($path), 0777, true); // FIXME (PHP4) 
    389         } 
    390  
    391         // ベースとなるPHPファイルの読み込み 
    392         if (file_exists(USER_DEF_PHP_REALFILE)){ 
    393             $php_data = file_get_contents(USER_DEF_PHP_REALFILE); 
    394         } 
    395  
    396         // require.phpの場所を書き換える 
     343            return true; 
     344        } 
     345 
     346        if (file_exists(USER_DEF_PHP_REALFILE)) { 
     347            $php_contents = file_get_contents(USER_DEF_PHP_REALFILE); 
     348        } else { 
     349            return false; 
     350        } 
     351 
     352        // require.php の PATH を書き換える 
    397353        $defaultStrings = "exit; // Don't rewrite. This line is rewritten by EC-CUBE."; 
    398         $replaceStrings = "require_once '" . str_repeat('../', substr_count($url, '/')) . "../require.php';"; 
    399         $php_data = str_replace($defaultStrings, $replaceStrings, $php_data); 
    400  
    401         // phpファイルの作成 
    402         $fp = fopen($path,'w'); 
    403         fwrite($fp, $php_data); 
    404         fclose($fp); 
    405     } 
    406  
     354        $replaceStrings = "require_once '" . str_repeat('../', substr_count($filename, '/')) . "../require.php';"; 
     355        $php_contents = str_replace($defaultStrings, $replaceStrings, $php_contents); 
     356 
     357        return SC_Helper_FileManager_Ex::sfWriteFile($path, $php_contents); 
     358    } 
    407359} 
    408360?> 
  • branches/version-2_11-dev/data/class/util/SC_Utils.php

    r20845 r20847  
    20492049                     * 自クラスへ再帰する. 
    20502050                     */ 
    2051                     if (!SC_Utils_Ex::isBlank($in, $greedy)) { 
     2051                    if (!SC_Utils::isBlank($in, $greedy)) { 
    20522052                        return false; 
    20532053                    } 
     
    22162216        } 
    22172217    } 
     2218 
     2219    /** 
     2220     * ディレクトリを再帰的に作成する. 
     2221     * 
     2222     * mkdir 関数の $recursive パラメータを PHP4 でサポートする. 
     2223     * 
     2224     * @param string $pathname ディレクトリのパス 
     2225     * @param integer $mode 作成するディレクトリのパーミッション 
     2226     * @return boolean 作成に成功した場合 true; 失敗した場合 false 
     2227     * @see http://jp.php.net/mkdir 
     2228     */ 
     2229    function recursiveMkdir($pathname, $mode) { 
     2230        /* 
     2231         * SC_Utils_Ex への再帰は無限ループやメモリリークの懸念 
     2232         * 自クラスへ再帰する. 
     2233         */ 
     2234        is_dir(dirname($pathname)) || SC_Utils::recursiveMkdir(dirname($pathname), $mode); 
     2235        return is_dir($pathname) || @mkdir($pathname, $mode); 
     2236    } 
    22182237} 
    22192238?> 
  • branches/version-2_11-dev/test/class/util/SC_Utils_Test.php

    r20841 r20847  
    144144        $this->assertFalse(SC_Utils::isAbsoluteRealPath($empty)); 
    145145    } 
     146 
     147    function testRecursiveMkdir() { 
     148        $tmp_dir = sys_get_temp_dir(); 
     149        $dir = 'foo/bar'; 
     150        $results = false; 
     151        if (is_dir($tmp_dir . $dir)) { 
     152            rmdir($tmp_dir . '/foo/bar'); 
     153            rmdir($tmp_dir . '/foo'); 
     154        } 
     155        $results = SC_Utils::recursiveMkdir($tmp_dir . $dir, 0777); 
     156        $this->assertTrue($results); 
     157    } 
    146158} 
    147159?> 
Note: See TracChangeset for help on using the changeset viewer.