source: branches/version-2_11-dev/data/class/helper/SC_Helper_PageLayout.php @ 20830

Revision 20830, 12.7 KB checked in by nanasess, 13 years ago (diff)

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

  • LC_Page_Admin_Design.php
  • SC_Helper_PageLayout もリファクタリング

#1254 (SC_FormParam::getValue() の第二引数が無効)

  • SC_Utils::isBlank() でチェックするよう修正
  • Property svn:eol-style set to LF
  • 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-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/**
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     * 現在の URL に応じたページのレイアウト情報を取得し, LC_Page インスタンスに
40     * 設定する.
41     *
42     * @access public
43     * @param LC_Page $objPage LC_Page インスタンス
44     * @param boolean $preview プレビュー表示の場合 true
45     * @param string $url ページのURL($_SERVER['PHP_SELF'] の情報)
46     * @param integer $device_type_id 端末種別ID
47     * @return void
48     */
49    function sfGetPageLayout(&$objPage, $preview = false, $url = "", $device_type_id = DEVICE_TYPE_PC) {
50
51        // URLを元にページ情報を取得
52        if ($preview === false) {
53            $url = preg_replace('|^' . preg_quote(ROOT_URLPATH) . '|', '', $url);
54            $arrPageData = $this->getPageProperties($device_type_id, null, 'url = ?', array($url));
55        }
56        // プレビューの場合は, プレビュー用のデータを取得
57        else {
58            $arrPageData = $this->getPageProperties($device_type_id, 0);
59        }
60        $objPage->tpl_mainpage = $this->getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . ".tpl";
61        $objPage->arrPageLayout =& $arrPageData[0];
62
63        // ページタイトルを設定
64        if (SC_Utils_Ex::isBlank($objPage->tpl_title)) {
65            $objPage->tpl_title = $objPage->arrPageLayout['page_name'];
66        }
67
68        // 該当ページのブロックを取得し, 配置する
69        $masterData = new SC_DB_MasterData();
70        $arrTarget = $masterData->getMasterData("mtb_target");
71        $arrBlocs = $this->getBlocPositions($device_type_id, $objPage->arrPageLayout['page_id']);
72        // php_path, tpl_path が存在するものを, 各ターゲットに配置
73        foreach (array_keys($arrTarget) as $target_id) {
74            foreach ($arrBlocs as $arrBloc) {
75                if ($arrBloc['target_id'] != $target_id) {
76                    continue;
77                }
78                if (is_file($arrBloc['php_path'])
79                    || is_file($arrBloc['tpl_path'])) {
80                    $objPage->arrPageLayout[$arrTarget[$target_id]][] = $arrBloc;
81                } else {
82                    $error = "ブロックが見つかりません\n"
83                        . "tpl_path: " . $arrBloc['tpl_path'] . "\n"
84                        . "php_path: " . $arrBloc['php_path'];
85                    GC_Utils_Ex::gfPrintLog($error);
86                }
87            }
88        }
89        // カラム数を取得する
90        $objPage->tpl_column_num = $this->getColumnNum($objPage->arrPageLayout);
91    }
92
93    /**
94     * ページの属性を取得する.
95     *
96     * この関数は, dtb_pagelayout の情報を検索する.
97     * $device_type_id は必須. デフォルト値は DEVICE_TYPE_PC.
98     * $page_id が null の場合は, $page_id が 0 以外のものを検索する.
99     *
100     * @access public
101     * @param integer $device_type_id 端末種別ID
102     * @param integer $page_id ページID; null の場合は, 0 以外を検索する.
103     * @param string $where 追加の検索条件
104     * @param array $arrParams 追加の検索パラメータ
105     * @return array ページ属性の配列
106     */
107    function getPageProperties($device_type_id = DEVICE_TYPE_PC, $page_id = null, $where = '', $arrParams = array()) {
108        $objQuery =& SC_Query_Ex::getSingletonInstance();
109        $where = 'device_type_id = ? ' . (SC_Utils_Ex::isBlank($where) ? $where : 'AND ' . $where);
110        if ($page_id === null) {
111            $where = 'page_id <> ? AND ' . $where;
112            $page_id = 0;
113        } else {
114            $where = 'page_id = ? AND ' . $where;
115        }
116        $objQuery->setOrder('page_id');
117        $arrParams = array_merge(array($page_id, $device_type_id), $arrParams);
118        return $objQuery->select('*', 'dtb_pagelayout', $where, $arrParams);
119    }
120
121    /**
122     * ブロック情報を取得する.
123     *
124     * @access public
125     * @param integer $device_type_id 端末種別ID
126     * @param string $where 追加の検索条件
127     * @param array $arrParams 追加の検索パラメータ
128     * @param boolean $has_realpath php_path, tpl_path の絶対パスを含める場合 true
129     * @return array ブロック情報の配列
130     */
131    function getBlocs($device_type_id = DEVICE_TYPE_PC, $where = '', $arrParams = array(), $has_realpath = true) {
132        $objQuery =& SC_Query_Ex::getSingletonInstance();
133        $where = 'device_type_id = ? ' . (SC_Utils_Ex::isBlank($where) ? $where : 'AND ' . $where);
134        $arrParams = array_merge(array($device_type_id), $arrParams);
135        $objQuery->setOrder('bloc_id');
136        $arrBlocs = $objQuery->select('*', 'dtb_bloc', $where, $arrParams);
137        if ($has_realpath) {
138            $this->setBlocPathTo($device_type_id, $arrBlocs);
139        }
140        return $arrBlocs;
141    }
142
143    /**
144     * ブロック配置情報を取得する.
145     *
146     * @access public
147     * @param integer $device_type_id 端末種別ID
148     * @param integer $page_id ページID
149     * @param boolean $has_realpath php_path, tpl_path の絶対パスを含める場合 true
150     * @return array 配置情報を含めたブロックの配列
151     */
152    function getBlocPositions($device_type_id, $page_id, $has_realpath = true) {
153        $objQuery =& SC_Query_Ex::getSingletonInstance();
154        $table = <<< __EOF__
155            dtb_blocposition AS pos
156       JOIN dtb_bloc AS bloc
157         ON bloc.bloc_id = pos.bloc_id
158        AND bloc.device_type_id = pos.device_type_id
159__EOF__;
160        $where = "bloc.device_type_id = ? AND (anywhere = 1 OR pos.page_id = ?)";
161        $objQuery->setOrder('target_id, bloc_row');
162        $arrBlocs = $objQuery->select("*", $table, $where,
163                                      array($device_type_id, $page_id));
164        if ($has_realpath) {
165            $this->setBlocPathTo($device_type_id, $arrBlocs);
166        }
167        return $arrBlocs;
168    }
169
170    /**
171     * ページ情報を削除する.
172     *
173     * XXX ファイルを確実に削除したかどうかのチェック
174     *
175     * @access public
176     * @param integer $page_id ページID
177     * @param integer $device_type_id 端末種別ID
178     * @return integer 削除数
179     */
180    function lfDelPageData($page_id, $device_type_id = DEVICE_TYPE_PC) {
181        $objQuery =& SC_Query_Ex::getSingletonInstance();
182        $arrDelData = array();      // 抽出データ用
183
184        // page_id が空でない場合にはdeleteを実行
185        if ($page_id != '') {
186            $arrPageData = $this->getPageProperties($device_type_id, $page_id);
187            // SQL実行
188            $ret = $objQuery->delete("dtb_pagelayout", "page_id = ? AND device_type_id = ?", array($page_id, $device_type_id));
189
190            // ファイルの削除
191            $this->lfDelFile($arrPageData[0]['filename'], $device_type_id);
192        }
193        return $ret;
194    }
195
196    /**
197     * ページのファイルを削除する.
198     *
199     * dtb_pagelayout の削除後に呼び出すこと。
200     *
201     * @access private
202     * @param string $filename
203     * @param integer $device_type_id 端末種別ID
204     * @return void // TODO boolean にするべき?
205     */
206    function lfDelFile($filename, $device_type_id) {
207        $objQuery =& SC_Query_Ex::getSingletonInstance();
208
209        // 同名ファイルの使用件数
210        $count = $objQuery->count('dtb_pagelayout', 'filename = ?', array($filename));
211
212        if ($count == 0) {
213            // phpファイルの削除
214            $del_php = HTML_REALDIR . $filename . '.php';
215            if (file_exists($del_php)) {
216                unlink($del_php);
217            }
218        }
219
220        // tplファイルの削除
221        $del_tpl = $this->getTemplatePath($device_type_id) . $filename . '.tpl';
222        if (file_exists($del_tpl)) {
223            unlink($del_tpl);
224        }
225    }
226
227    /**
228     * 編集可能ページかどうか.
229     *
230     * @access public
231     * @param integer $device_type_id 端末種別ID
232     * @param integer $page_id ページID
233     * @return 編集可能ページの場合 true
234     */
235    function isEditablePage($device_type_id, $page_id) {
236        if ($page_id == 0) {
237            return false;
238        }
239        $arrPages = $this->getPageProperties($device_type_id, $page_id);
240        if ($arrPages[0]['edit_flg'] != 2) {
241            return true;
242        }
243        return false;
244    }
245
246    /**
247     * テンプレートのパスを取得する.
248     *
249     * @access public
250     * @param integer $device_type_id 端末種別ID
251     * @param boolean $isUser USER_REALDIR 以下のパスを返す場合 true
252     * @return string テンプレートのパス
253     */
254    function getTemplatePath($device_type_id = DEVICE_TYPE_PC, $isUser = false) {
255        $templateName = "";
256        switch ($device_type_id) {
257        case DEVICE_TYPE_MOBILE:
258            $dir = MOBILE_TEMPLATE_REALDIR;
259            $templateName = MOBILE_TEMPLATE_NAME;
260            break;
261
262        case DEVICE_TYPE_SMARTPHONE:
263            $dir = SMARTPHONE_TEMPLATE_REALDIR;
264            $templateName = SMARTPHONE_TEMPLATE_NAME;
265            break;
266
267        case DEVICE_TYPE_PC:
268        default:
269            $dir = TEMPLATE_REALDIR;
270            $templateName = TEMPLATE_NAME;
271        }
272        $userPath = USER_REALDIR;
273        if ($isUser) {
274            $dir = $userPath . USER_PACKAGE_DIR . $templateName . "/";
275        }
276        return $dir;
277    }
278
279    /**
280     * DocumentRoot から user_data のパスを取得する.
281     *
282     * 引数 $hasPackage を true にした場合は, user_data/packages/template_name
283     * を取得する.
284     *
285     * @access public
286     * @param integer $device_type_id 端末種別ID
287     * @param boolean $hasPackage パッケージのパスも含める場合 true
288     * @return string 端末に応じた DocumentRoot から user_data までのパス
289     */
290    function getUserDir($device_type_id = DEVICE_TYPE_PC, $hasPackage = false) {
291        switch ($device_type_id) {
292        case DEVICE_TYPE_MOBILE:
293            $templateName = MOBILE_TEMPLATE_NAME;
294            break;
295
296        case DEVICE_TYPE_SMARTPHONE:
297            $templateName = SMARTPHONE_TEMPLATE_NAME;
298            break;
299
300        case DEVICE_TYPE_PC:
301        default:
302            $templateName = TEMPLATE_NAME;
303        }
304        $userDir = ROOT_URLPATH . USER_DIR;
305        if ($hasPackage) {
306            return $userDir . USER_PACKAGE_DIR . $templateName . "/";
307        }
308        return $userDir;
309    }
310
311    // }}}
312    // {{{ private functions
313
314    /**
315     * ブロックの php_path, tpl_path を設定する.
316     *
317     * @access private
318     * @param integer $device_type_id 端末種別ID
319     * @param array $arrBlocs 設定するブロックの配列
320     * @return void
321     */
322    function setBlocPathTo($device_type_id = DEVICE_TYPE_PC, &$arrBlocs) {
323        foreach (array_keys($arrBlocs) as $key) {
324            $arrBloc =& $arrBlocs[$key];
325            $arrBloc['php_path'] = SC_Utils_Ex::isBlank($arrBloc['php_path']) ? '' : HTML_REALDIR . $arrBloc['php_path'];
326            $bloc_dir = $this->getTemplatePath($device_type_id) . BLOC_DIR;
327            $arrBloc['tpl_path'] = SC_Utils_Ex::isBlank($arrBloc['tpl_path']) ? '' : $bloc_dir . $arrBloc['tpl_path'];
328        }
329    }
330
331    /**
332     * カラム数を取得する.
333     *
334     * @access private
335     * @param array $arrPageLayout レイアウト情報の配列
336     * @return integer $col_num カラム数
337     */
338    function getColumnNum($arrPageLayout) {
339        // メインは確定
340        $col_num = 1;
341        // LEFT NAVI
342        if (count($arrPageLayout['LeftNavi']) > 0) $col_num++;
343        // RIGHT NAVI
344        if (count($arrPageLayout['RightNavi']) > 0) $col_num++;
345
346        return $col_num;
347    }
348}
349?>
Note: See TracBrowser for help on using the repository browser.