source: branches/version-2_13-dev/data/class/helper/SC_Helper_PageLayout.php @ 23230

Revision 23230, 14.1 KB checked in by m_uehara, 7 years ago (diff)

#2363 r23177, r23181 - r23186, r23188 - r23191, r23194, r23197, r23199 - r23218, r23220, r23223 - r23225 をマージ

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