source: branches/version-2_4/data/class/helper/SC_Helper_PageLayout.php @ 18734

Revision 18734, 11.1 KB checked in by nanasess, 14 years ago (diff)

Copyright の更新(#601)

  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 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/**
25 * Webページのレイアウト情報を制御するヘルパークラス.
26 *
27 * @package Helper
28 * @author LOCKON CO.,LTD.
29 * @version $Id:SC_Helper_PageLayout.php 15532 2007-08-31 14:39:46Z nanasess $
30 */
31class SC_Helper_PageLayout {
32
33    // }}}
34    // {{{ functions
35
36    /**
37     * ページのレイアウト情報をセットする.
38     *
39     * LC_Page オブジェクトにページのレイアウト情報をセットする.
40     *
41     * @param LC_Page $objPage ページ情報
42     * @param boolean $preview プレビュー表示の場合 true
43     * @param string $url ページのURL
44     * @return void
45     */
46    function sfGetPageLayout(&$objPage, $preview = false, $url = ""){
47        $debug_message = "";
48        $arrPageLayout = array();
49
50        // 現在のURLの取得
51        if ($preview === false) {
52            if ($url == "") {
53                // 従来互換(dtb_pagelayoutのurlが絶対URLだった時)
54                $url = SITE_URL . preg_replace('|^' . preg_quote(URL_DIR) . '|', '' , $_SERVER['PHP_SELF']);
55            }
56
57            $url2 = preg_replace('|^http://[^/]+' . preg_quote(URL_DIR) . '|', '', $url);
58            // URLを元にページデザインを取得
59            $arrPageData = $this->lfgetPageData("url IN (?, ?) AND page_id <> 0" , array($url2, $url)); // $url は従来互換
60        } else {
61            $arrPageData = $this->lfgetPageData("page_id = 0");
62            $objPage->tpl_mainpage = USER_PATH . "templates/preview/"
63                . TEMPLATE_NAME . "/" . $arrPageData[0]['filename'] . ".tpl";
64        }
65       
66        reset($arrPageData[0]);
67        while( list($key,$val) = each($arrPageData[0]) ){
68            $debug_message.= "arrPageData[$key]:" . $val . "\n";
69        }
70       
71        $debug_message.= "TEMPLATE_NAME:".TEMPLATE_NAME . "\n";
72       
73        // tpl_mainpageの設定なし、又はトップページの場合
74        if (!isset($objPage->tpl_mainpage) || $url == "index.php") {
75            // ユーザテンプレートのパスを取得
76            $user_tpl =  HTML_PATH . USER_DIR . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . $arrPageData[0]['filename'] . ".tpl";
77            $debug_message.= "ユーザテンプレートチェック:".$user_tpl."\n";
78           
79            // ユーザテンプレートの存在チェック
80            if (is_file($user_tpl)) {
81                $objPage->tpl_mainpage = $user_tpl;
82                $debug_message.= "tpl_mainpage:ユーザーテンプレート\n";
83            // 存在しない場合は指定テンプレートを使用
84            } else {
85                $objPage->tpl_mainpage = TEMPLATE_DIR . $arrPageData[0]['filename'] . ".tpl";
86                $debug_message.= "tpl_mainpage:標準テンプレート\n";
87            }
88        } else {
89            $debug_message.= "tpl_mainpage:設定あり" . "\n";
90        }
91       
92        $debug_message.= "tpl_mainpage:" . $objPage->tpl_mainpage . "\n";
93
94        // ページタイトルを設定
95        if (!isset($objPage->tpl_title)) {
96            $objPage->tpl_title = $arrPageData[0]['page_name'];
97        }
98
99        $arrPageLayout = $arrPageData[0];
100
101        // 全ナビデータを取得する
102        $arrNavi = $this->lfGetNaviData($arrPageLayout['page_id']);
103
104        $arrPageLayout['LeftNavi']  = $this->lfGetNavi($arrNavi,1);    // LEFT NAVI
105        $arrPageLayout['MainHead']  = $this->lfGetNavi($arrNavi,2);    // メイン上部
106        $arrPageLayout['RightNavi'] = $this->lfGetNavi($arrNavi,3);    // RIGHT NAVI
107        $arrPageLayout['MainFoot']  = $this->lfGetNavi($arrNavi,4);    // メイン下部
108
109        GC_Utils::gfDebugLog($arrPageLayout);
110       
111        $objPage->arrPageLayout = $arrPageLayout;
112       
113        // カラム数を取得する
114        $objPage->tpl_column_num = $this->lfGetColumnNum($arrPageLayout);
115
116        GC_Utils::gfDebugLog($debug_message);
117    }
118
119    /**
120     * ページ情報を取得する.
121     *
122     * @param string $where クエリのWHERE句
123     * @param array $arrVal WHERE句の条件値
124     * @return array ページ情報を格納した配列
125     */
126    function lfgetPageData($where = 'page_id <> 0', $where_vals = array()) {
127        $objQuery = new SC_Query;       // DB操作オブジェクト
128        $arrRet = array();              // データ取得用
129
130        // 取得するカラム
131        $col  = " page_id";             // ページID
132        $col .= " ,page_name";          // 名称
133        $col .= " ,url";                // URL
134        $col .= " ,php_dir";            // php保存先ディレクトリ
135        $col .= " ,tpl_dir";            // tpl保存先ディレクトリ
136        $col .= " ,filename";           // ファイル名称
137        $col .= " ,header_chk ";        // ヘッダー使用FLG
138        $col .= " ,footer_chk ";        // フッター使用FLG
139        $col .= " ,edit_flg ";          // 編集可能FLG
140        $col .= " ,author";             // authorタグ
141        $col .= " ,description";        // descriptionタグ
142        $col .= " ,keyword";            // keywordタグ
143        $col .= " ,update_url";         // 更新URL
144        $col .= " ,create_date";        // データ作成日
145        $col .= " ,update_date";        // データ更新日
146       
147        // 取得するテーブル
148        $table = "dtb_pagelayout";
149       
150        // 並び変え
151        $objQuery->setOrder('page_id');
152       
153        // SQL実行
154        $arrRet = $objQuery->select($col, $table, $where, $where_vals);
155       
156        // 結果を返す
157        return $arrRet;
158    }
159
160    /**
161     * ナビ情報を取得する.
162     *
163     * @param string $url ページのURL
164     * @return array ナビ情報の配列
165     */
166    function lfGetNaviData($page_id){
167        $objQuery = new SC_Query;   // DB操作オブジェクト
168
169        // 取得するカラム
170        $col = "target_id, bloc_name, tpl_path, php_path";
171       
172        // 取得するテーブル
173        $table = "dtb_blocposition AS pos INNER JOIN dtb_bloc AS bloc ON bloc.bloc_id = pos.bloc_id";
174       
175        // where文生成
176        $where = "page_id = ?";
177        $where_vals[] = $page_id;
178
179        // 並び変え
180        $objQuery->setOrder('target_id, bloc_row');
181       
182        // SQL実行
183        $arrRet = $objQuery->select($col, $table, $where, $where_vals);
184       
185        // 結果を返す
186        return $arrRet;
187    }
188
189    /**
190     * 各部分のナビ情報を取得する.
191     *
192     * @param array $arrNavi ナビ情報の配列
193     * @param integer|string $target_id ターゲットID
194     * @return array ブロック情報の配列
195     */
196    function lfGetNavi($arrNavi, $target_id) {
197        $arrRet = array();
198        if(is_array($arrNavi) === true) {
199            reset($arrNavi);
200            while( list($key,$val)= each($arrNavi) ){
201                // 指定された箇所と同じデータだけを取得する
202                if ($target_id == $val['target_id']){
203                    if ($val['php_path'] != '') {
204                        $arrNavi[$key]['php_path'] = HTML_PATH . $val['php_path'];
205                    } else {
206                        $user_block_path = USER_TEMPLATE_PATH . TEMPLATE_NAME . "/" . $val['tpl_path'];
207                        if(is_file($user_block_path)) {
208                            $arrNavi[$key]['tpl_path'] = $user_block_path;
209                        } else {
210                            $arrNavi[$key]['tpl_path'] = TEMPLATE_DIR . $val['tpl_path'];
211                        }
212                    }
213                   
214                    // phpから呼び出されるか、tplファイルが存在する場合
215                    if($val['php_path'] != '' || is_file($arrNavi[$key]['tpl_path'])) {
216                        $arrRet[] = $arrNavi[$key];
217                    } else {
218                        GC_Utils::gfPrintLog("ブロック読み込みエラー:" . $arrNavi[$key]['tpl_path']);
219                    }
220                }
221            }
222        }
223        return $arrRet;
224    }
225
226    /**
227     * カラム数を取得する.
228     *
229     * @param array $arrPageLayout レイアウト情報の配列
230     * @return integer $col_num カラム数
231     */
232    function lfGetColumnNum($arrPageLayout) {
233        // メインは確定
234        $col_num = 1;
235        // LEFT NAVI
236        if (count($arrPageLayout['LeftNavi']) > 0) $col_num++;
237        // RIGHT NAVI
238        if (count($arrPageLayout['RightNavi']) > 0) $col_num++;
239       
240        return $col_num;
241    }
242
243    /**
244     * ページ情報を削除する.
245     *
246     * @param integer|string $page_id ページID
247     * @return integer 削除数
248     */
249    function lfDelPageData($page_id){
250        // DBへデータを更新する
251        $objQuery = new SC_Query;   // DB操作オブジェクト
252        $ret = "";                  // 結果格納用
253        $arrDelData = array();      // 抽出データ用
254
255        // page_id が空でない場合にはdeleteを実行
256        if ($page_id != '') {
257
258            $arrPageData = $this->lfgetPageData(" page_id = ? " , array($page_id));
259            // SQL実行
260            $ret = $objQuery->delete("dtb_pagelayout", "page_id = ?", array($page_id));
261
262            // ファイルの削除
263            $this->lfDelFile($arrPageData[0]);
264        }
265        return $ret;
266    }
267
268    /**
269     * ページのファイルを削除する.
270     *
271     * @param array $arrData ページ情報の配列
272     * @return void // TODO boolean にするべき?
273     */
274    function lfDelFile($arrData){
275        // ファイルディレクトリ取得
276        $del_php = HTML_PATH . $arrData['php_dir'] . $arrData['filename'] . ".php";
277        $del_tpl = HTML_PATH . $arrData['tpl_dir'] . $arrData['filename'] . ".tpl";
278
279        // phpファイルの削除
280        if (file_exists($del_php)){
281            unlink($del_php);
282        }
283
284        // tplファイルの削除
285        if (file_exists($del_tpl)){
286            unlink($del_tpl);
287        }
288    }
289
290    /**
291     * データがベースデータかどうか.
292     *
293     * @param integer|string $data ページID
294     * @return boolean ベースデータの場合 true
295     */
296    function lfCheckBaseData($data){
297        $ret = false;
298
299        if ($data == 0) {
300            return $ret;
301        }
302
303        $arrChkData = $this->lfgetPageData("page_id = ?", array($data));
304
305        if ($arrChkData[0]['edit_flg'] == 2){
306            $ret = true;
307        }
308
309        return $ret;
310    }
311}
312?>
Note: See TracBrowser for help on using the repository browser.