source: branches/version-2_5-dev/data/class/pages/admin/mail/LC_Page_Admin_Mail.php @ 20283

Revision 20283, 20.8 KB checked in by fukuda, 10 years ago (diff)

#963 [管理画面]メルマガ管理リファクタリング とりあえず検索だけ動くように・・・

  • 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-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// {{{ requires
25require_once(CLASS_REALDIR . "pages/admin/LC_Page_Admin.php");
26
27/**
28 * メルマガ管理 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_Mail extends LC_Page_Admin {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'mail/index.tpl';
47        $this->tpl_mainno = 'mail';
48        $this->tpl_subnavi = 'mail/subnavi.tpl';
49        $this->tpl_subno = "index";
50        $this->tpl_pager = 'pager.tpl';
51        $this->tpl_subtitle = '配信内容設定';
52
53        $masterData = new SC_DB_MasterData_Ex();
54        $this->arrPref = $masterData->getMasterData('mtb_pref');
55        $this->arrJob = $masterData->getMasterData("mtb_job");
56        $this->arrJob["不明"] = "不明";
57        $this->arrSex = $masterData->getMasterData("mtb_sex");
58        $this->arrPageRows = $masterData->getMasterData("mtb_page_rows");
59        $this->arrHtmlmail = array( "" => "両方",  1 => "HTML", 2 => "TEXT" );
60        $this->arrMailType = $masterData->getMasterData("mtb_mail_type");
61       
62        // 日付プルダウン設定
63        $objDate = new SC_Date(BIRTH_YEAR);
64        $this->arrYear = $objDate->getYear();   
65        $this->arrMonth = $objDate->getMonth();
66        $this->arrDay = $objDate->getDay();
67        $this->objDate = $objDate;
68
69        // カテゴリ一覧設定
70        $objDb = new SC_Helper_DB_Ex();
71        $this->arrCatList = $objDb->sfGetCategoryList();
72       
73        $this->httpCacheControl('nocache');
74    }
75
76    /**
77     * Page のプロセス.
78     *
79     * @return void
80     */
81    function process() {
82        $this->action();
83        $this->sendResponse();
84    }
85
86    /**
87     * Page のアクション.
88     *
89     * @return void
90     */
91    function action() {
92       
93         // 認証可否の判定
94        SC_Utils_Ex::sfIsSuccess(new SC_Session());
95
96        // パラメータ管理クラス
97        $objFormParam = new SC_FormParam();
98        $this->lfInitParamSearchCustomer($objFormParam);
99        $objFormParam->setParam($_POST);
100
101        // パラメーター読み込み
102        $this->arrHidden = $objFormParam->getSearchArray();
103        $this->arrForm = $objFormParam->getFormParamList();
104
105        // 入力パラメーターチェック
106        $this->arrErr = $this->lfCheckError($objFormParam);
107        if(!SC_Utils_Ex::isBlank($this->arrErr)) {
108            return;
109        }
110
111        // モードによる処理切り替え
112        switch ($this->getMode()) {
113        case 'search':
114            list($this->tpl_linemax, $this->arrResults, $this->objNavi) = $this->lfDoSearch($objFormParam->getHashArray());
115            $this->arrPagenavi = $this->objNavi->arrPagenavi;
116            break;
117        default:
118            break;
119        }
120       
121       
122        /*
123        // ページ初期設定
124        $objDate = new SC_Date();
125        $objQuery = new SC_Query();
126        $objDb = new SC_Helper_DB_Ex();
127        $this->objDate = $objDate;
128        $this->arrTemplate = $this->getTemplateList($objQuery);
129
130        $objSess = new SC_Session();
131
132        // 認証可否の判定
133        SC_Utils_Ex::sfIsSuccess($objSess);
134
135        switch($this->getMode()) {
136        case 'query':
137            // query:配信履歴「確認」
138            if (SC_Utils_Ex::sfIsInt($_GET["send_id"])) {
139                // 送信履歴より、送信条件確認画面
140                $sql = "SELECT search_data FROM dtb_send_history WHERE send_id = ?";
141                $result = $objQuery->getOne($sql, array($_GET["send_id"]));
142                $tpl_path = "mail/query.tpl";
143
144                $list_data = unserialize($result);
145
146                // 都道府県を変換
147                $list_data['pref_disp'] = $this->arrPref[$list_data['pref']];
148
149                // 配信形式
150                $list_data['htmlmail_disp'] = $this->arrHtmlmail[$list_data['htmlmail']];
151
152                // 性別の変換
153                if (count($list_data['sex']) > 0) {
154                    foreach($list_data['sex'] as $key => $val){
155                        $list_data['sex'][$key] = $this->arrSex[$val];
156                        $sex_disp .= $list_data['sex'][$key] . " ";
157                    }
158                    $list_data['sex_disp'] = $sex_disp;
159                }
160
161                // 職業の変換
162                if (count($list_data['job']) > 0) {
163                    foreach($list_data['job'] as $key => $val){
164                        $list_data['job'][$key] = $this->arrJob[$val];
165                        $job_disp .= $list_data['job'][$key] . " ";
166                    }
167                    $list_data['job_disp'] = $job_disp;
168                }
169
170                // カテゴリ変換
171                $arrCatList = $objDb->sfGetCategoryList();
172                $list_data['category_name'] = $arrCatList[$list_data['category_id']];
173
174                $this->list_data = $list_data;
175                $this->setTemplate('mail/query.tpl');
176                return;
177            }
178            break;
179             //search:「検索」ボタン
180             //back:検索結果画面「戻る」ボタン
181        case 'search':
182        case 'back':
183            // 入力値コンバート
184            $this->list_data = $this->lfConvertParam($_POST, $this->arrSearchColumn);
185
186            // 入力エラーのチェック
187            $this->arrErr = $this->lfErrorCheck($this->list_data);
188
189            // 検索開始
190            if (empty($this->arrErr)) {
191                $this->list_data['name'] = isset($this->list_data['name'])
192                    ? $this->list_data['name'] : "";
193                // hidden要素作成
194                $this->arrHidden = $this->lfGetHidden($this->list_data);
195
196                // 検索データ取得
197                $objSelect = new SC_CustomerList($this->list_data, "magazine");
198                // 生成されたWHERE文を取得する
199                list($where, $arrval) = $objSelect->getWhere();
200
201                // 「WHERE」部分を削除する。
202                $where = ereg_replace("^WHERE", "", $where);
203
204                // 検索結果の取得
205                $from = "dtb_customer";
206
207                // 行数の取得
208                $linemax = $objQuery->count($from, $where, $arrval);
209                $this->tpl_linemax = $linemax;               // 何件が該当しました。表示用
210
211                // ページ送りの取得
212                $objNavi = new SC_PageNavi($this->tpl_pageno, $linemax, SEARCH_PMAX, "fnResultPageNavi", NAVI_PMAX);
213                $this->arrPagenavi = $objNavi->arrPagenavi;
214                $startno = $objNavi->start_row;
215
216                // 取得範囲の指定(開始行番号、行数のセット)
217                $objQuery->setLimitOffset(SEARCH_PMAX, $startno);
218                // 表示順序
219                $objQuery->setOrder("customer_id DESC");
220
221                // 検索結果の取得
222                $col = $objSelect->getMailMagazineColumn($this->lfGetIsMobile($_POST['mail_type']));
223                $this->arrResults = $objQuery->select($col, $from, $where, $arrval);
224                // 現在時刻の取得
225                $this->arrNowDate = $this->lfGetNowDate();
226            }
227            break;
228             // input:検索結果画面「htmlmail内容設定」ボタン
229        case 'input':
230            // 入力値コンバート
231            $this->list_data = $this->lfConvertParam($_POST, $this->arrSearchColumn);
232            // 入力エラーのチェック
233            $this->arrErr = $this->lfErrorCheck($this->list_data);
234            // エラーなし
235            if (empty($this->arrErr)) {
236                // 現在時刻の取得
237                $this->arrNowDate = $this->lfGetNowDate();
238                $this->arrHidden = $this->lfGetHidden($this->list_data); // hidden要素作成
239                $this->tpl_mainpage = 'mail/input.tpl';
240            }
241            break;
242            // template:テンプレート選択
243        case 'template':
244            // 入力値コンバート
245            $this->list_data = $this->lfConvertParam($_POST, $this->arrSearchColumn);
246
247            // 時刻設定の取得
248            $this->arrNowDate['year'] = isset($_POST['send_year']) ? $_POST['send_year'] : "";
249            $this->arrNowDate['month'] = isset($_POST['send_month']) ? $_POST['send_month'] : "";
250            $this->arrNowDate['day'] = isset($_POST['send_day']) ? $_POST['send_day'] : "";
251            $this->arrNowDate['hour'] = isset($_POST['send_hour']) ? $_POST['send_hour'] : "";
252            $this->arrNowDate['minutes'] = isset($_POST['send_minutes']) ? $_POST['send_minutes'] : "";
253
254            // 入力エラーのチェック
255            $this->arrErr = $this->lfErrorCheck($this->list_data);
256
257            // 検索開始
258            if (empty($this->arrErr)) {
259                $this->list_data['name'] = isset($this->list_data['name']) ? $this->list_data['name'] : "";
260                $this->arrHidden = $this->lfGetHidden($this->list_data); // hidden要素作成
261
262                $this->tpl_mainpage = 'mail/input.tpl';
263                $template_data = $this->getTemplateData($objQuery, $_POST['template_id']);
264                if ( $template_data ){
265                    foreach( $template_data as $key=>$val ){
266                        $this->list_data[$key] = $val;
267                    }
268                }
269
270            }
271            break;
272           //  regist_confirm:「入力内容を確認」
273           //  regist_back:「テンプレート設定画面へ戻る」
274           //  regist_complete:「登録」
275        case 'regist_confirm':
276        case 'regist_back':
277        case 'regist_complete':
278            // 入力値コンバート
279            $this->arrCheckColumn = array_merge( $this->arrSearchColumn, $this->arrRegistColumn );
280            $this->list_data = $this->lfConvertParam($_POST, $this->arrCheckColumn);
281
282            // 現在時刻の取得
283            $this->arrNowDate = $this->lfGetNowDate();
284
285            // 入力エラーのチェック
286            $this->arrErr = $this->lfErrorCheck($this->list_data, 1);
287            $this->tpl_mainpage = 'mail/input.tpl';
288            $this->arrHidden = $this->lfGetHidden($this->list_data); // hidden要素作成
289
290            // 検索開始
291            if (empty($this->arrErr)) {
292                $this->list_data['name'] =
293                    isset($this->list_data['name'])
294                    ? $this->list_data['name'] : "";
295                //TODO 要リファクタリング(MODE if利用)
296                if ( $this->getMode() == 'regist_confirm'){
297                    $this->tpl_mainpage = 'mail/input_confirm.tpl';
298                } else if( $this->getMode() == 'regist_complete' ){
299                    $sendId = $this->lfRegistData($objQuery, $this->list_data);
300                    SC_Response_Ex::sendRedirectFromUrlPath(ADMIN_DIR . 'mail/sendmail.php', array('mode' => 'now', 'send_id' => $sendId));
301                    exit;
302                }
303            }
304            break;
305        default:
306        }
307        */
308    }
309
310    /**
311     * デストラクタ.
312     *
313     * @return void
314     */
315    function destroy() {
316        parent::destroy();
317    }
318
319    /**
320     * パラメーター情報の初期化
321     *
322     * @param array $objFormParam フォームパラメータークラス
323     * @return void
324     */
325    function lfInitParamSearchCustomer(&$objFormParam) {
326        SC_Helper_Customer_Ex::sfSetSearchParam($objFormParam);
327        $objFormParam->addParam('配信形式', 'search_htmlmail', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"));
328        $objFormParam->addParam('配信メールアドレス種別', 'search_mail_type', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"));
329        $objFormParam->addParam('ページ番号', 'search_pageno', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"),1,false);
330        $objFormParam->addParam('1ページ表示件数', 'search_page_rows', INT_LEN, 'n', array("NUM_CHECK","MAX_LENGTH_CHECK"),1,false);
331    }
332   
333    /**
334     * エラーチェック
335     *
336     * @param array $objFormParam フォームパラメータークラス
337     * @return array エラー配列
338     */
339    function lfCheckError(&$objFormParam) {
340        return SC_Helper_Customer_Ex::sfCheckErrorSearchParam($objFormParam);
341    }
342   
343    /**
344     * 顧客一覧を検索する処理
345     *
346     * @param array $arrParam 検索パラメーター連想配列
347     * @return array( integer 全体件数, mixed 顧客データ一覧配列, mixed SC_PageNaviオブジェクト)
348     */
349    function lfDoSearch($arrParam) {
350        $objQuery =& SC_Query::getSingletonInstance();
351        $objSelect = new SC_CustomerList($arrParam, "customer");
352        $page_rows = $arrParam['search_page_rows'];
353        if(SC_Utils_Ex::sfIsInt($page_rows)) {
354            $page_max = $page_rows;
355        }else{
356            $page_max = SEARCH_PMAX;
357        }
358        $disp_pageno = $arrParam['search_pageno'];
359        if($disp_pageno == 0) {
360            $disp_pageno = 1;
361        }
362        $offset = intval($page_max) * (intval($disp_pageno) - 1);
363        $objSelect->setLimitOffset($page_max, $offset);
364       
365        $arrData = $objQuery->getAll($objSelect->getList(), $objSelect->arrVal);
366
367        // 該当全体件数の取得
368        $linemax = $objQuery->getOne($objSelect->getListCount(), $objSelect->arrVal);
369
370        // ページ送りの取得
371        $objNavi = new SC_PageNavi($arrParam['search_pageno'],
372                                    $linemax,
373                                    $page_max,
374                                    "fnCustomerPage",
375                                    NAVI_PMAX);
376        return array($linemax, $arrData, $objNavi);
377    }
378   
379    // 現在時刻の取得(配信時間デフォルト値)
380    function lfGetNowDate(){
381        $nowdate = date("Y/n/j/G/i");
382        list($year, $month, $day, $hour, $minute) = split("[/]", $nowdate);
383        $arrNowDate = array( 'year' => $year, 'month' => $month, 'day' => $day, 'hour' => $hour, 'minutes' => $minute);
384        foreach ($arrNowDate as $key => $val){
385            switch ($key){
386            case 'minutes':
387                $val = ereg_replace('^[0]','', $val);
388                if ($val < 30){
389                    $list_date[$key] = '30';
390                }else{
391                    $list_date[$key] = '00';
392                }
393                break;
394            case 'year':
395            case 'month':
396            case 'day':
397                $list_date[$key] = $val;
398                break;
399            }
400        }
401        if ($arrNowDate['minutes'] < 30){
402            $list_date['hour'] = $hour;
403        }else{
404            $list_date['hour'] = $hour + 1;
405        }
406        return $list_date;
407    }
408
409    /**
410     * 配信内容と配信リストを書き込む
411     *
412     * @return string 登録した行の dtb_send_history.send_id の値
413     */
414    function lfRegistData(&$objQuery, $arrData){
415
416        $objSelect = new SC_CustomerList($this->lfConvertParam($arrData, $this->arrSearchColumn), "magazine" );
417
418        $search_data = $objQuery->getAll($objSelect->getListMailMagazine($this->lfGetIsMobile($_POST['mail_type'])), $objSelect->arrVal);
419        $dataCnt = count($search_data);
420
421        $dtb_send_history = array();
422        $dtb_send_history["mail_method"] = $arrData['mail_method'];
423        $dtb_send_history["subject"] = $arrData['subject'];
424        $dtb_send_history["body"] = $arrData['body'];
425        if(MELMAGA_BATCH_MODE) {
426            $dtb_send_history["start_date"] = $arrData['send_year'] ."/".$arrData['send_month']."/".$arrData['send_day']." ".$arrData['send_hour'].":".$arrData['send_minutes'];
427        } else {
428            $dtb_send_history["start_date"] = "now()";
429        }
430        $dtb_send_history["creator_id"] = $_SESSION['member_id'];
431        $dtb_send_history["send_count"] = $dataCnt;
432        $arrData['body'] = "";
433        $dtb_send_history["search_data"] = serialize($arrData);
434        $dtb_send_history["update_date"] = "now()";
435        $dtb_send_history["create_date"] = "now()";
436        $dtb_send_history['send_id'] = $objQuery->nextVal('dtb_send_history_send_id');
437        $objQuery->insert("dtb_send_history", $dtb_send_history );
438
439        $sendId = $objQuery->currval('dtb_send_history_send_id');
440
441        if ( is_array( $search_data ) ){
442            foreach( $search_data as $line ){
443                $dtb_send_customer = array();
444                $dtb_send_customer["customer_id"] = $line["customer_id"];
445                $dtb_send_customer["send_id"] = $sendId;
446                $dtb_send_customer["email"] = $line["email"];
447                $dtb_send_customer["name"] = $line["name01"] . " " . $line["name02"];
448                $objQuery->insert("dtb_send_customer", $dtb_send_customer );
449            }
450        }
451
452        return $sendId;
453    }
454
455    function lfGetIsMobile($mail_type) {
456        // 検索結果の取得
457        $is_mobile = false;
458        switch($mail_type) {
459        case 1:
460            $is_mobile = false;
461            break;
462        case 2:
463            $is_mobile = true;
464            break;
465        default:
466            $is_mobile = false;
467            break;
468        }
469
470        return $is_mobile;
471    }
472
473    // hidden要素出力用配列の作成
474    function lfGetHidden( $array ){
475        if ( is_array($array) ){
476            foreach( $array as $key => $val ){
477                if ( is_array( $val )){
478                    for ( $i=0; $i<count($val); $i++){
479                        $return[ $key.'['.$i.']'] = $val[$i];
480                    }
481                } else {
482                    $return[$key] = $val;
483                }
484            }
485        }
486        return $return;
487    }
488
489    // 取得文字列の変換
490    function lfConvertParam($array, $arrSearchColumn) {
491
492        // 文字変換
493        foreach ($arrSearchColumn as $data) {
494            $arrConvList[ $data["column"] ] = $data["convert"];
495        }
496
497        $new_array = array();
498        foreach ($arrConvList as $key => $val) {
499            if (isset($array[$key]) &&  strlen($array[$key]) > 0 ){                        // データのあるものだけ返す
500                $new_array[$key] = $array[$key];
501                if( strlen($val) > 0) {
502                    $new_array[$key] = mb_convert_kana($new_array[$key] ,$val);
503                }
504            }
505        }
506        return $new_array;
507
508    }
509
510
511    // 入力エラーチェック
512    function lfErrorCheck($array, $flag = '') {
513
514        // flag は登録時用
515
516        $objErr = new SC_CheckError($array);
517
518        if ( $flag ){
519            $objErr->doFunc(array("テンプレート", "template_id"), array("EXIST_CHECK", "NUM_CHECK"));
520            $objErr->doFunc(array("メール送信法法", "mail_method"), array("EXIST_CHECK", "NUM_CHECK"));
521            $objErr->doFunc(array("Subject", "subject", STEXT_LEN), array("EXIST_CHECK","MAX_LENGTH_CHECK"));
522            $objErr->doFunc(array("本文", 'body', LLTEXT_LEN), array("EXIST_CHECK","MAX_LENGTH_CHECK"));    // HTMLテンプレートを使用しない場合
523        }
524
525        return $objErr->arrErr;
526    }
527
528    /* テンプレートIDとsubjectの配列を返す */
529    function getTemplateList(&$objQuery){
530        $return = "";
531        $sql = "SELECT template_id, subject, mail_method FROM dtb_mailmaga_template WHERE del_flg = 0 ";
532        if ($_POST["htmlmail"] == 2 || $_POST['mail_type'] == 2) {
533            $sql .= " AND mail_method = 2 ";    // TEXT希望者へのTESTメールテンプレートリスト
534        }
535        $sql .= " ORDER BY template_id DESC";
536        $result = $objQuery->getAll($sql);
537
538        if ( is_array($result) ){
539            foreach( $result as $line ){
540                $return[$line['template_id']] = "【" . $this->arrMagazineTypeAll[$line['mail_method']] . "】" . $line['subject'];
541            }
542        }
543
544        return $return;
545    }
546
547    /* テンプレートIDからテンプレートデータを取得 */
548    function getTemplateData(&$objQuery, $id){
549
550        if ( SC_Utils_Ex::sfIsInt($id) ){
551            $sql = "SELECT * FROM dtb_mailmaga_template WHERE template_id = ? ORDER BY template_id DESC";
552            $result = $objQuery->getAll( $sql, array($id) );
553            if ( is_array($result) ) {
554                $return = $result[0];
555            }
556        }
557        return $return;
558    }
559
560}
561?>
Note: See TracBrowser for help on using the repository browser.