source: branches/version-2_5-dev/data/class/pages/admin/basis/LC_Page_Admin_Basis_ZipInstall.php @ 20335

Revision 20335, 10.0 KB checked in by nanasess, 11 years ago (diff)

r20313 の続き. 管理画面各ページの SC_Utils_Ex::sfIsSuccess(new SC_Session) を削除

  • 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/** CSV ファイルの最大行数 */
28define("ZIP_CSV_LINE_MAX", 8192);
29
30/** 画像の表示数量 */
31define("IMAGE_MAX", 680);
32
33/** 郵便番号CSV ファイルのパス */
34define("ZIP_CSV_REALFILE", DATA_REALDIR . "downloads/KEN_ALL.CSV");
35
36/** UTF-8 変換済みの郵便番号CSV ファイルのパス */
37define("ZIP_CSV_UTF8_REALFILE", DATA_REALDIR . "downloads/KEN_ALL_utf-8.CSV");
38
39/**
40 * 郵便番号DB登録 のページクラス.
41 *
42 * @package Page
43 * @author LOCKON CO.,LTD.
44 * @version $Id:LC_Page_Admin_Basis_ZipInstall.php 16741 2007-11-08 00:43:24Z adachi $
45 */
46class LC_Page_Admin_Basis_ZipInstall extends LC_Page_Admin {
47
48    /** CSVの行数 */
49    var $tpl_line = 0;
50    var $tpl_mode;
51    var $exec;
52    var $tpl_count_mtb_zip;
53    /** フォームパラメータの配列 */
54    var $objFormParam;
55
56    // }}}
57    // {{{ functions
58
59    /**
60     * Page を初期化する.
61     *
62     * @return void
63     */
64    function init() {
65        parent::init();
66        $this->tpl_mainpage = 'basis/zip_install.tpl';
67        $this->tpl_subnavi = 'basis/subnavi.tpl';
68        $this->tpl_subno = 'zip_install';
69        $this->tpl_subtitle = '郵便番号DB登録';
70        $this->tpl_mainno = 'basis';
71
72        $this->tpl_mode = $this->getMode();
73        $this->exec = (boolean)$_GET['exec'];
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        $this->objFormParam = new SC_FormParam();
94        // パラメータ情報の初期化
95        $this->lfInitParam();
96        // POST値の取得
97        $this->objFormParam->setParam($_GET);
98        $this->arrErr = $this->objFormParam->checkError();
99        $this->arrForm = $this->objFormParam->getHashArray();
100
101        if ($this->exec) {
102            if (!empty($this->arrErr)) {
103                SC_Utils_Ex::sfDispException();
104            }
105            switch ($this->tpl_mode) {
106                // 自動登録
107                case 'auto':
108                    $this->lfAutoCommitZip();
109                    break;
110                // 手動登録
111                case 'manual':
112                    $this->insertMtbZip($this->arrForm['startRowNum']);
113                    break;
114            }
115            exit;
116        }
117
118        switch ($this->tpl_mode) {
119            // 手動削除
120            case 'delete':
121                $this->lfDeleteZip();
122
123                // 進捗・完了画面を表示しない
124                $this->tpl_mode = null;
125
126                break;
127        }
128
129        $this->tpl_line = $this->countZipCsv();
130        $this->tpl_count_mtb_zip = $this->countMtbZip();
131    }
132
133    /**
134     * デストラクタ.
135     *
136     * @return void
137     */
138    function destroy() {
139        parent::destroy();
140    }
141
142    function lfAutoCommitZip() {
143        $objQuery =& SC_Query::getSingletonInstance();
144
145        $objQuery->begin();
146        $objQuery->delete('mtb_zip');
147        $this->insertMtbZip();
148        $objQuery->commit();
149    }
150
151    function lfDeleteZip() {
152        $objQuery =& SC_Query::getSingletonInstance();
153
154        $objQuery->delete('mtb_zip');
155    }
156
157    /**
158     * パラメータ情報の初期化
159     *
160     * @return void
161     */
162    function lfInitParam() {
163        if ($this->tpl_mode == 'manual') {
164            $this->objFormParam->addParam("開始行", "startRowNum", INT_LEN, "n", array("EXIST_CHECK", "MAX_LENGTH_CHECK", "NUM_CHECK"));
165        }
166    }
167
168    /**
169     * DB登録
170     *
171     * @return void
172     */
173    function insertMtbZip($start = 1) {
174        $objQuery =& SC_Query::getSingletonInstance();
175
176        $img_path = USER_URL . USER_PACKAGE_DIR . "/" . ADMIN_DIR . "img/basis/";
177
178        ?>
179        <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
180        <head>
181            <meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHAR_CODE ?>" />
182        </head>
183        <body>
184        <p>進捗状況</p>
185        <div style="background-color: #494E5F;">
186        <?php
187        // 一部のIEは256バイト以上受け取ってから表示を開始する。
188        SC_Utils_Ex::sfFlush(true);
189
190        echo "<img src='" . $img_path . "zip_install_progress.gif'><br />";
191        echo "<img src='" . $img_path . "space_w.gif'>";
192        SC_Utils_Ex::sfFlush();
193
194        // 画像を一個表示する件数を求める。
195        $line_all = $this->countZipCsv();
196        $disp_line = intval($line_all / IMAGE_MAX);
197
198        /** 現在行(CSV形式。空行は除く。) */
199        $cntCurrentLine = 0;
200        /** 挿入した行数 */
201        $cntInsert = 0;
202        $img_cnt = 0;
203        $safe_mode = (boolean)ini_get('safe_mode');
204        $max_execution_time
205            = is_numeric(ini_get('max_execution_time'))
206            ? intval(ini_get('max_execution_time'))
207            : intval(get_cfg_var('max_execution_time'))
208        ;
209
210        $fp = $this->openZipCsv();
211        while (!feof($fp)) {
212            $arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX);
213            if (empty($arrCSV)) continue;
214            $cntCurrentLine++;
215            if ($cntCurrentLine >= $start) {
216                $sqlval = array();
217                // $sqlval['code'] = $arrCSV[0];
218                // $sqlval['old_zipcode'] = $arrCSV[1];
219                $sqlval['zipcode'] = $arrCSV[2];
220                // $sqlval['state_kana'] = $arrCSV[3];
221                // $sqlval['city_kana'] = $arrCSV[4];
222                // $sqlval['town_kana'] = $arrCSV[5];
223                $sqlval['state'] = $arrCSV[6];
224                $sqlval['city'] = $arrCSV[7];
225                $sqlval['town'] = $arrCSV[8];
226                // $sqlval['flg1'] = $arrCSV[9];
227                // $sqlval['flg2'] = $arrCSV[10];
228                // $sqlval['flg3'] = $arrCSV[11];
229                // $sqlval['flg4'] = $arrCSV[12];
230                // $sqlval['flg5'] = $arrCSV[13];
231                // $sqlval['flg6'] = $arrCSV[14];
232                $objQuery->insert("mtb_zip", $sqlval);
233                $cntInsert++;
234            }
235
236            // $disp_line件ごとに進捗表示する
237            if($cntCurrentLine % $disp_line == 0 && $img_cnt < IMAGE_MAX) {
238                print("<img src='". $img_path ."graph_1_w.gif'>");
239                SC_Utils_Ex::sfFlush();
240                $img_cnt++;
241            }
242            // 暴走スレッドが残留する確率を軽減したタイムアウト防止のロジック
243            // TODO 動作が安定していれば、SC_Utils 辺りに移動したい。
244            if (!$safe_mode) {
245                // タイムアウトをリセット
246                set_time_limit($max_execution_time);
247            }
248        }
249        fclose($fp);
250
251        echo "<img src='". $img_path ."space_w.gif'>";
252        echo "</div>\n";
253
254        ?>
255        <script type="text/javascript" language="javascript">
256            <!--
257                // 完了画面
258                function complete() {
259                    document.open("text/html","replace");
260                    document.clear();
261                    document.write("<p>完了しました。<br />");
262                    document.write("<?php echo $cntInsert ?> 件を追加しました。</p>");
263                    document.write("<p><a href='?' target='_top'>戻る</a></p>");
264                    document.close();
265                }
266                // コンテンツを削除するため、タイムアウトで呼び出し。
267                setTimeout("complete()", 0);
268            // -->
269        </script>
270        </body>
271        </html>
272        <?php
273    }
274
275    function openZipCsv() {
276        // http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh
277        $this->convertZipCsv();
278        $fp = fopen(ZIP_CSV_UTF8_REALFILE, "r");
279        if (!$fp) {
280            SC_Utils_Ex::sfDispException(ZIP_CSV_UTF8_REALFILE . ' の読み込みに失敗しました。');
281        }
282        return $fp;
283    }
284
285    function convertZipCsv() {
286        if (file_exists(ZIP_CSV_UTF8_REALFILE)) return;
287
288        $fpr = fopen(ZIP_CSV_REALFILE, "r");
289        if (!$fpr) {
290            SC_Utils_Ex::sfDispException(ZIP_CSV_REALFILE . ' の読み込みに失敗しました。');
291        }
292
293        $fpw = fopen(ZIP_CSV_UTF8_REALFILE, "w");
294        if (!$fpw) {
295            SC_Utils_Ex::sfDispException(ZIP_CSV_UTF8_REALFILE . ' を開けません。');
296        }
297
298        while (!feof($fpr)) {
299            fwrite($fpw, mb_convert_encoding(fgets($fpr, ZIP_CSV_LINE_MAX), CHAR_CODE, 'sjis-win'));
300        }
301
302        fclose($fpw);
303        fclose($fpr);
304    }
305
306    function countMtbZip() {
307        $objQuery =& SC_Query::getSingletonInstance();
308        return $objQuery->count('mtb_zip');
309    }
310
311    function countZipCsv() {
312        $line = 0;
313        $fp = $this->openZipCsv();
314
315        // CSVの行数を数える
316        while (!feof($fp)) {
317            /*
318            // 正確にカウントする
319            $tmp = fgetcsv($fp, ZIP_CSV_LINE_MAX);
320            */
321            // 推測でカウントする
322            $tmp = fgets($fp, ZIP_CSV_LINE_MAX);
323            if (empty($tmp)) continue;
324            $line++;
325        }
326        fclose($fp);
327
328        return $line;
329    }
330}
331?>
Note: See TracBrowser for help on using the repository browser.