source: branches/version-2_12-dev/data/class/helper/SC_Helper_PageLayout.php @ 22567

Revision 22567, 13.5 KB checked in by shutta, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.12.4)
Zend Framework PHP 標準コーディング規約のコーディングスタイルへ準拠。
classおよびfunctionの開始波括弧「{」のスタイルを修正。

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