source: branches/feature-module-update/data/class/pages/admin/design/LC_Page_Admin_Design.php @ 16396

Revision 16396, 15.8 KB checked in by nanasess, 15 years ago (diff)

プレビュー修正

  • Property svn:keywords set to "Id Revision Date"
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8// {{{ requires
9require_once(CLASS_PATH . "pages/LC_Page.php");
10
11/**
12 * デザイン管理 のページクラス.
13 *
14 * @package Page
15 * @author LOCKON CO.,LTD.
16 * @version $Id$
17 */
18class LC_Page_Admin_Design extends LC_Page {
19
20    // }}}
21    // {{{ functions
22
23    /**
24     * Page を初期化する.
25     *
26     * @return void
27     */
28    function init() {
29        parent::init();
30        $this->tpl_mainpage = 'design/index.tpl';
31        $this->tpl_subnavi = 'design/subnavi.tpl';
32        $this->tpl_subno = "layout";
33        $this->tpl_mainno = "design";
34        $this->tpl_subtitle = 'レイアウト編集';
35    }
36
37    /**
38     * Page のプロセス.
39     *
40     * @return void
41     */
42    function process() {
43
44        $objView = new SC_AdminView();
45        $objSess = new SC_Session();
46        $objLayout = new SC_Helper_PageLayout_Ex();
47
48        // 認証可否の判定
49        $objSess = new SC_Session();
50        SC_Utils_Ex::sfIsSuccess($objSess);
51
52        // ページIDを取得
53        if (isset($_GET['page_id'])) {
54            $page_id = $_GET['page_id'];
55        }else if (isset($_POST['page_id'])){
56            $page_id = $_POST['page_id'];
57        }else{
58            $page_id = 1;
59        }
60
61        // 編集可能ページを取得
62        $this->arrEditPage = $objLayout->lfgetPageData();
63
64        // ブロック配置用データを取得
65        $sel   = ", pos.target_id, pos.bloc_id, pos.bloc_row ";
66        $from  = ", dtb_blocposition AS pos";
67        $where = " where ";
68        $where .= " lay.page_id = ? AND ";
69        $where .= "lay.page_id = pos.page_id AND exists (select bloc_id from dtb_bloc as blc where pos.bloc_id = blc.bloc_id) ORDER BY lay.page_id,pos.target_id, pos.bloc_row, pos.bloc_id ";
70        $arrData = array($page_id);
71        $arrBlocPos = $this->lfgetLayoutData($sel, $from, $where, $arrData );
72
73        // データの存在チェックを行う
74        $arrPageData = $objLayout->lfgetPageData("page_id = ?", array($page_id));
75        if (count($arrPageData) <= 0) {
76            $exists_page = 0;
77        }else{
78            $exists_page = 1;
79        }
80        $this->exists_page = $exists_page;
81
82        // メッセージ表示
83        if (isset($_GET['msg']) && $_GET['msg'] == "on") {
84            $this->complate_msg="alert('登録が完了しました。');";
85        }
86
87        // ブロックを取得
88        $arrBloc = $this->lfgetBlocData();
89
90        if (!isset($_POST['mode'])) $_POST['mode'] = "";
91
92        // 新規ブロック作成
93        if ($_POST['mode'] == 'new_bloc') {
94            $this->sendRedirect($this->getLocation("./bloc.php"));
95        }
96
97        // 新規ページ作成
98        if ($_POST['mode'] == 'new_page') {
99            $this->sendRedirect($this->getLocation("./main_edit.php"));
100        }
101
102        // データ登録処理
103        if ($_POST['mode'] == 'confirm' or $_POST['mode'] == 'preview') {
104
105            $arrPageData = array();
106            if ($_POST['mode'] == 'preview') {
107                $arrPageData = $objLayout->lfgetPageData(" page_id = ? " , array($page_id));
108                $page_id = "0";
109                $_POST['page_id'] = "0";
110            }
111
112            $masterData = new SC_DB_MasterData_Ex();
113            $arrTarget = $masterData->getMasterData("mtb_target");
114
115            // 更新用にデータを整える
116            $arrUpdBlocData = array();
117            $arrTargetFlip = array_flip($arrTarget);
118
119            $upd_cnt = 1;
120            $arrUpdData[$upd_cnt]['page_id'] = $_POST['page_id'];
121
122            // POSTのデータを使いやすいように修正
123            for($upd_cnt = 1; $upd_cnt <= $_POST['bloc_cnt']; $upd_cnt++){
124                if (!isset($_POST['id_'.$upd_cnt])) {
125                    break;
126                }
127                $arrUpdBlocData[$upd_cnt]['name']       = $_POST['name_'.$upd_cnt];                         // ブロック名称
128                $arrUpdBlocData[$upd_cnt]['id']         = $_POST['id_'.$upd_cnt];                           // ブロックID
129                $arrUpdBlocData[$upd_cnt]['target_id']  = $arrTargetFlip[$_POST['target_id_'.$upd_cnt]];    // ターゲットID
130                $arrUpdBlocData[$upd_cnt]['top']        = $_POST['top_'.$upd_cnt];                          // TOP座標
131                $arrUpdBlocData[$upd_cnt]['update_url'] = $_SERVER['HTTP_REFERER'];                         // 更新URL
132            }
133
134            // データの更新を行う
135            $objDBConn = new SC_DbConn;     // DB操作オブジェクト
136            $arrRet = array();              // データ取得用
137
138            // delete実行
139            $del_sql = "";
140            $del_sql .= "DELETE FROM dtb_blocposition WHERE page_id = ? ";
141            $arrRet = $objDBConn->query($del_sql,array($page_id));
142
143            // ブロックの順序を取得し、更新を行う
144            foreach($arrUpdBlocData as $key => $val){
145                // ブロックの順序を取得
146                $bloc_row = $this->lfGetRowID($arrUpdBlocData, $val);
147                $arrUpdBlocData[$key]['bloc_row'] = $bloc_row;
148                $arrUpdBlocData[$key]['page_id']    = $_POST['page_id'];    // ページID
149
150                if ($arrUpdBlocData[$key]['target_id'] == 5) {
151                    $arrUpdBlocData[$key]['bloc_row'] = "0";
152                }
153
154                // insert文生成
155                $ins_sql = "";
156                $ins_sql .= "INSERT INTO dtb_blocposition ";
157                $ins_sql .= " values ( ";
158                $ins_sql .= "   ?  ";           // ページID
159                $ins_sql .= "   ,? ";           // ターゲットID
160                $ins_sql .= "   ,? ";           // ブロックID
161                $ins_sql .= "   ,? ";           // ブロックの並び順序
162                $ins_sql .= "   ,(SELECT filename FROM dtb_bloc WHERE bloc_id = ?) ";           // ファイル名称
163                $ins_sql .= "   )  ";
164
165                // insertデータ生成
166                $arrInsData = array($page_id,
167                                    $arrUpdBlocData[$key]['target_id'],
168                                    $arrUpdBlocData[$key]['id'],
169                                    $arrUpdBlocData[$key]['bloc_row'],
170                                    $arrUpdBlocData[$key]['id']
171                                    );
172                // SQL実行
173                $arrRet = $objDBConn->query($ins_sql,$arrInsData);
174            }
175
176            // プレビュー処理
177            if ($_POST['mode'] == 'preview') {
178                if ($page_id === "") {
179                    $this->sendRedirect($this->getLocation("./index.php"));
180                }
181                $this->lfSetPreData($arrPageData, $objLayout);
182
183                $_SESSION['preview'] = "ON";
184
185                $this->sendRedirect($this->getLocation(URL_DIR . "preview/index.php", array("filename" => $arrPageData[0]["filename"])));
186
187            }else{
188                $this->sendRedirect($this->getLocation("./index.php",
189                                            array("page_id" => $page_id,
190                                                  "msg" => "on")));
191
192            }
193        }
194
195        // データ削除処理 ベースデータでなければファイルを削除
196        if ($_POST['mode'] == 'delete' and  !$objLayout->lfCheckBaseData($page_id)) {
197            $objLayout->lfDelPageData($page_id);
198            $this->sendRedirect($this->getLocation("./index.php"));
199        }
200
201        // ブロック情報を画面配置用に編集
202        $tpl_arrBloc = array();
203        $cnt = 0;
204        // 使用されているブロックデータを生成
205        foreach($arrBlocPos as $key => $val){
206            if ($val['page_id'] == $page_id) {
207                $tpl_arrBloc = $this->lfSetBlocData($arrBloc, $val, $tpl_arrBloc, $cnt);
208                $cnt++;
209            }
210        }
211
212        // 未使用のブロックデータを追加
213        foreach($arrBloc as $key => $val){
214            if (!$this->lfChkBloc($val, $tpl_arrBloc)) {
215                $val['target_id'] = 5;  // 未使用に追加する
216                $tpl_arrBloc = $this->lfSetBlocData($arrBloc, $val, $tpl_arrBloc, $cnt);
217                $cnt++;
218            }
219        }
220
221        $this->tpl_arrBloc = $tpl_arrBloc;
222        $this->bloc_cnt = count($tpl_arrBloc);
223        $this->page_id = $page_id;
224
225        // ページ名称を取得
226        $arrPageData = $objLayout->lfgetPageData(' page_id = ?', array($page_id));
227        $this->arrPageData = $arrPageData[0];
228
229        global $GLOBAL_ERR; // FIXME
230        $errCnt = 0;
231        if ($GLOBAL_ERR != "") {
232            $arrGlobalErr = explode("\n",$GLOBAL_ERR);
233            $errCnt = count($arrGlobalErr) - 8;
234            if ($errCnt < 0 ) {
235                $errCnt = 0;
236            }
237        }
238        $this->errCnt = $errCnt;
239
240        // 画面の表示
241        $objView->assignobj($this);
242        $objView->display(MAIN_FRAME);
243
244    }
245    /**
246     * デストラクタ.
247     *
248     * @return void
249     */
250    function destroy() {
251        parent::destroy();
252    }
253
254    /**
255     * 編集可能なページ情報を取得する.
256     *
257     * @param string $sel Select句文
258     * @param string $where Where句文
259     * @param array $arrVa Where句の絞込条件値
260     * @return array ページレイアウト情報の配列
261     */
262    function lfgetLayoutData($sel = '' , $from = '', $where = '', $arrVal = ''){
263        $objDBConn = new SC_DbConn;     // DB操作オブジェクト
264        $sql = "";                      // データ取得SQL生成用
265        $arrRet = array();              // データ取得用
266
267        // SQL生成
268
269        $sql = "";
270        $sql .= " select ";
271        $sql .= "     lay.page_id ";
272        $sql .= "     ,lay.page_name ";
273        $sql .= "     ,lay.url ";
274        $sql .= "     ,lay.author ";
275        $sql .= "     ,lay.description ";
276        $sql .= "     ,lay.keyword ";
277        $sql .= "     ,lay.update_url ";
278        $sql .= "     ,lay.create_date ";
279        $sql .= "     ,lay.update_date ";
280
281        // Select句の指定があれば追加
282        if ($sel != '') {
283            $sql .= $sel;
284        }
285
286        $sql .= " from dtb_pagelayout AS lay ";
287        // From句の指定があれば追加
288        if ($from != '') {
289            $sql .= $from;
290        }
291
292        // where句の指定があれば追加
293        if ($where != '') {
294            $sql .= $where;
295        }else{
296            $sql .= " ORDER BY lay.page_id ";
297        }
298
299        $arrRet = $objDBConn->getAll($sql, $arrVal);
300
301        return $arrRet;
302    }
303
304    /**
305     * ブロック情報を取得する.
306     *
307     * @param string $where Where句文
308     * @param array $arrVal Where句の絞込条件値
309     * @return array ブロック情報の配列
310     */
311    function lfgetBlocData($where = '', $arrVal = ''){
312        $objDBConn = new SC_DbConn;     // DB操作オブジェクト
313        $sql = "";                      // データ取得SQL生成用
314        $arrRet = array();              // データ取得用
315
316        // SQL生成
317        $sql = "";
318        $sql .= " SELECT ";
319        $sql .= "   bloc_id";
320        $sql .= "   ,bloc_name";
321        $sql .= "   ,tpl_path";
322        $sql .= "   ,filename";
323        $sql .= "   ,update_date";
324        $sql .= " FROM ";
325        $sql .= "   dtb_bloc";
326
327        // where句の指定があれば追加
328        if ($where != '') {
329            $sql .= " WHERE " . $where;
330        }
331
332        $sql .= " ORDER BY  bloc_id";
333
334        $arrRet = $objDBConn->getAll($sql, $arrVal);
335
336        return $arrRet;
337    }
338
339    /**
340     * ブロック情報の配列を生成する.
341     *
342     * @param array $arrBloc Bloc情報
343     * @param array $tpl_arrBloc データをセットする配列
344     * @param integer $cnt 配列番号
345     * @return array データをセットした配列
346     */
347    function lfSetBlocData($arrBloc, $val, $tpl_arrBloc, $cnt) {
348        $masterData = new SC_DB_MasterData_Ex();
349        $arrTarget = $masterData->getMasterData("mtb_target");
350
351        $tpl_arrBloc[$cnt]['target_id'] = $arrTarget[$val['target_id']];
352        $tpl_arrBloc[$cnt]['bloc_id'] = $val['bloc_id'];
353        $tpl_arrBloc[$cnt]['bloc_row'] =
354            isset($val['bloc_row']) ? $val['bloc_row'] : "";
355
356        foreach($arrBloc as $bloc_key => $bloc_val){
357            if ($bloc_val['bloc_id'] == $val['bloc_id']) {
358                $bloc_name = $bloc_val['bloc_name'];
359                break;
360            }
361        }
362        $tpl_arrBloc[$cnt]['name'] = $bloc_name;
363
364        return $tpl_arrBloc;
365    }
366
367    /**
368     * ブロックIDが配列に追加されているかのチェックを行う.
369     *
370     * @param array $arrBloc Bloc情報
371     * @param array $arrChkData チェックを行うデータ配列
372     * @return bool 存在する場合 true
373     */
374    function lfChkBloc($arrBloc, $arrChkData) {
375        foreach($arrChkData as $key => $val){
376            if ($val['bloc_id'] === $arrBloc['bloc_id'] ) {
377                // 配列に存在すればTrueを返す
378                return true;
379            }
380        }
381
382        // 配列に存在しなければFlaseを返す
383        return false;
384    }
385
386    /**
387     * ブロックIDが何番目に配置されているかを調べる.
388     *
389     * @param array $arrUpdData 更新情報
390     * @param array $arrObj チェックを行うデータ配列
391     * @return integer 順番
392     */
393    function lfGetRowID($arrUpdData, $arrObj){
394        $no = 0; // カウント用(同じデータが必ず1件あるので、初期値は0)
395
396        // 対象データが何番目に配置されているのかを取得する。
397        foreach ($arrUpdData as $key => $val) {
398            if ($val['target_id'] === $arrObj['target_id'] and $val['top'] <= $arrObj['top']){
399                $no++;
400            }
401        }
402        // 番号を返す
403        return $no;
404    }
405
406    /**
407     * プレビューするデータを DB に保存する.
408     *
409     * @param array $arrPageData ページ情報の配列
410     * @return void
411     */
412    function lfSetPreData($arrPageData, &$objLayout){
413        $objDBConn = new SC_DbConn;     // DB操作オブジェクト
414        $sql = "";                      // データ更新SQL生成用
415        $ret = "";                      // データ更新結果格納用
416        $arrUpdData = array();          // 更新データ生成用
417        $filename = uniqid("");
418
419        $arrPreData = $objLayout->lfgetPageData(" page_id = ? " , array("0"));
420
421        // tplファイルの削除
422        $del_tpl = USER_PATH . "templates/" . $arrPreData[0]['filename'] . '.tpl';
423
424        if (file_exists($del_tpl)){
425            unlink($del_tpl);
426        }
427
428        $tplfile = TEMPLATE_DIR . $arrPageData[0]['filename'];
429
430        // filename が空の場合にはMYページと判断
431        if($arrPageData[0]['filename'] == ""){
432            $tplfile = TEMPLATE_DIR . "mypage/index";
433        }
434
435        // プレビュー用tplファイルのコピー
436        copy($tplfile . ".tpl", USER_PATH . "templates/"
437             . TEMPLATE_NAME . "/" . $filename . ".tpl");
438
439        // 更新データの取得
440        $sql = "select page_name, header_chk, footer_chk from dtb_pagelayout where page_id = ?";
441        $ret = $objDBConn->getAll($sql, array($arrPageData[0]['page_id']));
442
443        // dbデータのコピー
444        $sql = " update dtb_pagelayout set ";
445        $sql .= "     page_name = ?";
446        $sql .= "     ,header_chk = ?";
447        $sql .= "     ,footer_chk = ?";
448        $sql .= "     ,url = ?";
449        $sql .= "     ,tpl_dir = ?";
450        $sql .= "     ,filename = ?";
451        $sql .= " where page_id = 0";
452
453        $arrUpdData = array($ret[0]['page_id']
454                            ,$ret[0]['page_id']
455                            ,$ret[0]['page_id']
456                            ,USER_DIR . "templates/" . TEMPLATE_NAME . "/"
457                            ,USER_DIR . "templates/" . TEMPLATE_NAME . "/"
458                            ,$filename
459                            );
460
461        $objDBConn->query($sql,$arrUpdData);
462    }
463}
464?>
Note: See TracBrowser for help on using the repository browser.