kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_ファイルアップロード処理を次期バージョンに置き換えた。

TOOL更新_ファイルアップロード処理を次期バージョンに置き換えた。
■画像

■クラス概略

■ControllerBase.php、ControllerDbBase.phphttp://d.hatena.ne.jp/kazpgm/20100121/1264095498(TOOL更新_ベースになるサンプルを作成中)にあります。
■ControllerAdminIUpBase.php

<?php
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) Start
//  修正BSDライセンス。
//  =============================================================
// DBマネージャを使用するプログラム用Controller基底クラス。
require_once 'ControllerDbBase.php';

// DBマネージャを使用する管理者側ファイルアップロード用Controller基底クラス
abstract class ControllerAdminIUpBase extends ControllerDbBase {
    protected $_mode = '';             // モード
    protected $_modeBk = '';           // モードバックアップ

    // 各アクション共通の前処理
    public function preDispatch() 
    {
        // 親クラスの各アクション共通の前処理
        parent::preDispatch();
        // ログインチェック
        if( $this->_sess['login_type'] != '1' && $this->_sess['login_type'] != '2' && $this->_sess['login_type'] != '3'){
            $this->_sess['req_url'] = $_SERVER["REQUEST_URI"];
            $this->_sessObj->array = $this->_sess;
            $this->_redirect('index');

        }
    }

    protected function _commActSub() { // 親クラスでabstractメソッドにしてある。親クラスの_commAct()から呼ばれる。
        $this->_o['c_elements_idx'] = '0';
        $this->_mode = strtolower($this->_o['mode']);
        $this->_modeBk = $this->_mode;
        // トークンチェックを行う。セッションは管理者側、ユーザ側別にしてあります。
        if (TokenHandle::isTokenValid($this->_getAdminKbn(), $this->_o, strtolower($this->_o['mode']), 
                             $this->_getAdminKbn() == AppConst::VAL_USER) == false) { // 管理者側トークンチェック
            // トークンチェックエラー場合
            throw new AppException('画面遷移(トークンチェック)エラーです。');
        }

        // DB begin
        $this->_dbBegin(); 
        $this->_mode = strtolower($this->_o['mode']);

        switch($this->_mode) {
            case 'up_csv'; // ファイルアップロード
                $this->_err = $this->_validCheck($this->_o, $this->_mode);
                if(AppCheckUtil::chkError($this->_err)) { // エラーあり
                } else {
                    // 更新実行
                    $this->_csvUpload();
                    $eMes = array();
                    $eMes['up_csv'] = "UPLOADが正常終了しました。";
                    $this->_err = $eMes;
                }
                break;
            default:
                $this->_mode = 'list';
        }
        // HTML出力
        $this->_outHtml();
        // DB commit
        $this->_dbCommit();
    }

    // 管理者側かユーザ側かを戻す。(おもにトークンチェックで使用する)
    // "admin":管理者側、"user":ユーザ側
    protected function _getAdminKbn()
    {
         return AppConst::VAL_ADMIN; // 管理者側
    }

    // HTML出力
    protected function _outHtml() { 

        $this->_o['c_elements_idx'] = '0';
        // viewログ出力
        $this->_outViewLog($this->_o, $this->_err, $this->_result);
        $smarty  = Zend_Registry::get('smarty');
        $smarty->assign('o', $this->_o);
        $smarty->assign('err', $this->_err );
        $smarty->assign('sess', $this->_sess );
        if (isset($this->_result)) {
            $smarty->assign('result', $this->_result );
        }
        // 登録 画面
        $smarty->display('view/' . $this->_getViewFolderName() . ($this->_getViewFolderName()==''?'':'/') . $this->_getViewHtmlName());
    }

    // viewに使用するhtml名
    // 例 return 'iUplogininfoCsvView.html';
    abstract protected function _getViewHtmlName();

    // viewに使用するフォルダ名
    // 例 return 'admin/initupload';
    abstract protected function _getViewFolderName();

    // 入力値のチェック
    abstract protected function _validCheck(&$vars, $mode);

    // 追加実行
    abstract protected function _csvUpload();

    // 追加実行
    abstract protected function _insDoTbl(&$vars);

}
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) End
//  修正BSDライセンス。
//  =============================================================

■IuplogininfoacsvController.php

<?php
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) Start
//  修正BSDライセンス。
//  =============================================================
// DBマネージャを使用するプログラム用Controller基底クラス。
require_once 'ControllerAdminIUpBase.php';

// DBマネージャを使用する管理者側ファイルアップロード用Controller実装クラス
class Initupload_IuplogininfoacsvController extends ControllerAdminIUpBase {

    // viewに使用するhtml名
    // 例 return 'iuplogininfoacsvView.html';
    protected function _getViewHtmlName() 
    {
        return 'iuplogininfoacsvView.html';
    }

    // viewに使用するフォルダ名
    // 例 return 'admin/initupload';
    protected function _getViewFolderName() 
    {
        return 'admin/initupload';
    }

    // 入力値のチェック
    protected function _validCheck(&$vars, $mode) {
        $MAX_ERR_LINE=100; // エラー100個まで出す。
        $errcount=0;
        $mode = 'ins_do'; // モード='ins_do'とする。
        //  入力値チェック
        $result = true;
        $errorMessages = array();
        $eMes = array();
        // ファイル
        $result = AppCheckUtil::checkPhoto($vars, $errorMessages, "ファイル",  $result, "up_csv", true,'0', array( "csv", "txt", "text"));

        if (!$result) {
            $eMes['up_csv'] = 'ファイルを指定してください。';
            return $eMes;
        }
        
        $count = 0;
        $fp = fopen( $_FILES["up_csv"]["tmp_name"], "r") or die("up_csv couldn't open.");
        // 1行目がタイトルのときはコメントをはずしてください。
        //$data = fgetExcelCSV($fp); // 1行目の項目名をスキップする為のダミー読み出し
        //$count++;
        
        while( $data = fgetExcelCSV($fp) ) {
            $count++;
            $vars = array();
            $vars['login_id'] = mb_convert_encoding($data[0],"UTF-8","SJIS-WIN"); // ログインID
            $vars['login_type'] = mb_convert_encoding($data[1],"UTF-8","SJIS-WIN"); // ログイン権限
            $vars['pwd1'] = mb_convert_encoding($data[2],"UTF-8","SJIS-WIN"); // パスワード
            $vars['yuko_flg'] = mb_convert_encoding($data[3],"UTF-8","SJIS-WIN"); // 有効フラグ


            if (count($data) != 4) {
                if ($errcount < $MAX_ERR_LINE) {
                    $errcount++;
                    $eMes['up_csv'] .= 'CSVデータの項目数に誤りがあります。 ' . $count . '行目' . "\n";
                }
                continue;
            }

            // ■--PGM<<008>> start--------------------------------------------
            $errorMessages = array();

            //  入力値チェック
            $result = true;
            // ログインID
            $result = AppCheckUtil::checkMoji($vars, $errorMessages, "ログインID",  $result, "login_id", AppCheckUtil::CON_CHK_HALF_LETTER_DIGIT, 10, false, true,'0');
            // ログイン権限
            $result = AppCheckUtil::checkCodeValue($vars, $errorMessages, "ログイン権限",  $result, "login_type", "LOGIN_TYPE", true,'0');
            // パスワード
            $result = AppCheckUtil::checkMoji($vars, $errorMessages, "パスワード",  $result, "pwd1", AppCheckUtil::CON_CHK_HALF_LETTER_DIGIT, 8, false, true,'0');
            // 有効フラグ
            $result = AppCheckUtil::checkCodeValue($vars, $errorMessages, "有効フラグ",  $result, "yuko_flg", "YUKO_FLG", true,'0');
            // 登録日時

            // 更新日時


            if ($mode == 'ins_do' && !AppCheckUtil::chkError($errorMessages)) { // 追加かつ、エラーなし
                $keychecks = array ();
                $keychecks['login_id'] = $vars['login_id'];
                $rtn = AppDbFunctions::logininfoGetRec($this->_db, $keychecks);
                if(!empty($rtn)) {
                    $errorMessages['login_id'] = 'すでに登録されています。';
                }
            }
            // ■--PGM<<008>> end--------------------------------------------

            if (AppCheckUtil::chkError($errorMessages)) {
                foreach( $errorMessages as $key => $val ){
                    if ("" != $val) {
                        if ($errcount < $MAX_ERR_LINE) {
                            $errcount++;
                            $eMes['up_csv'] .= '[' . $key . '] '. $val . $count . '行目' . "\n";
                        }
                    }
                }
                continue;
            }

        }
        fclose($fp);
        return $eMes;
    }

    // 追加実行
    protected function _csvUpload() {

        $fp = fopen( $_FILES["up_csv"]["tmp_name"], "r") or die("up_csv couldn't open.");

        // 1行目がタイトルのときはコメントをはずしてください。
        //$data = fgetExcelCSV($fp); // 1行目の項目名をスキップする為のダミー読み出し
        while( $data = fgetExcelCSV($fp) ) {
            $vars = array();
            $vars['login_id'] = mb_convert_encoding($data[0],"UTF-8","SJIS-WIN"); // ログインID
            $vars['login_type'] = mb_convert_encoding($data[1],"UTF-8","SJIS-WIN"); // ログイン権限
            $vars['pwd1'] = mb_convert_encoding($data[2],"UTF-8","SJIS-WIN"); // パスワード
            $vars['yuko_flg'] = mb_convert_encoding($data[3],"UTF-8","SJIS-WIN"); // 有効フラグ

            $this->_insDoTbl($vars);
        }
        fclose($fp);

    }

    // 追加実行
    protected function _insDoTbl(&$vars) {
        $sql = 'INSERT INTO ' . 'm_logininfo' . ' ( '.
            // ■--PGM<<010>> start--------------------------------------------
            'login_id, ' . // ログインID
            'login_type, ' . // ログイン権限
            'pwd1, ' . // パスワード
            'yuko_flg, ' . // 有効フラグ
            'logininfo_insert, ' . // 登録日時
            'logininfo_update ' .  // 更新日時
            ' ) VALUES (?,?,?,?,?,?)'; 
            // ■--PGM<<010>> end--------------------------------------------
        $valary = array();
        $valary[] = $vars['login_id']; // ログインID
        $valary[] = $vars['login_type']; // ログイン権限
        $valary[] = $vars['pwd1']; // パスワード
        $valary[] = $vars['yuko_flg']; // 有効フラグ
        $valary[] = date( 'Y/m/d H:i:s' ); // 登録日時
        $valary[] = date( 'Y/m/d H:i:s' ); // 更新日時
        
        $this->_db->query($sql, $valary);

    }
}
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) End
//  修正BSDライセンス。
//  =============================================================

■IuplogininfoacsvView.html

{{*
//  ============================================================================
//  Copyright (c) 2010 kaz PHP自動作成お助けTOOL. All rights reserved.
//  ============================================================================
// ログイン情報 初期データアップロード 画面
*}}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>kaz PHP自動作成お助けTOOL&nbsp;&nbsp;サイト管理システム</title>
<link rel="stylesheet" href="/samples/kazBase/kaz/admin/css/screen.css" type="text/css" media="screen,print" />
</head>

<body>
<!-- wrapper start -->
<div id="wrapper">

<!-- #BeginLibraryItem "/Library/header.lbi" -->
{{include file='view/admin/header.lbi'}}
<!-- #EndLibraryItem -->
    
    <!-- contents start -->
    <div id="contents">
        
<!-- #BeginLibraryItem "/Library/menu.lbi" -->
{{include file='view/admin/menu.lbi'}}
<!-- #EndLibraryItem -->
        
        <!-- main start -->
        <div id="main">
            <h1>ログイン情報 初期データアップロード管理</h1>
            <h2>ログイン情報 初期データアップロード取込み</h2>
            
            <!-- tbl-01 start -->
            <!-- tbl-01 end -->
            <br/>
            <form name="frm" method="post" action="/samples/kazBase/kaz/admin/initupload/iuplogininfoacsv" enctype="multipart/form-data">
            <input type="hidden" name="mode" value="up_csv">
{{kaz_token_html namespace='admin'}}
            <table border="0" cellpadding="0" cellspacing="0" class="tbl-01">
                <tr>
                  <th width="18%" nowrap><label for="up_csv">ログイン情報 初期データアップロードファイル</label></th>
            
      <td class="{{if $err.up_csv == ''}}none{{else}}error{{/if}}">
                      <label for="up_csv">CSV</label><input name="up_csv" type="file" id="up_csv" size="50" value="参照">
                    <br />エラーは先頭の100個まで表示します。1つでもエラーがあるときは処理しません。{{$err.up_csv|kaz_encErrTag}}
                  </td>
                </tr><!-- radio -->
                <tr>
            </table>
            <p class="text-center"><a href="javascript:document.frm.submit();">【登録】</a></p>
            </form>
        </div>
        <!-- main end -->
    
    <p class="clear"></p>
    </div>
    <!-- contents end -->
    
<!-- #BeginLibraryItem "/Library/footer.lbi" -->
{{include file='view/admin/footer.lbi'}}
<!-- #EndLibraryItem -->

</div>
<!-- wrapper end -->
{{include file='view/admin/analytics.lbi'}}

</body>
</html>

■サイト:http://kazpgm.ddo.jp/

8/14 9:00-11:00 13:00-18:00 20:00-2:30 これで管理者側の機能は次期バージョンに置き換えられることが確認できた。、、、、もう少しの調整(デバックログをモジュール、コントロール、アクションで出す出さないを制御できるようにしとこうと思う)したらユーザ側の置き換えに入る。
9/23 17:00-17:30

if (TokenHandle::isTokenValid($this->_getAdminKbn(), strtolower($this->_o['mode']), 
$this->_getAdminKbn() == AppConst::VAL_USER) == false) { // 管理者側トークンチェック
を
if (TokenHandle::isTokenValid($this->_getAdminKbn(), $this->_o, strtolower($this->_o['mode']), 
$this->_getAdminKbn() == AppConst::VAL_USER) == false) { // 管理者側トークンチェック
に変更した

2011/02/01 0:00-0:10 IUplogininfoCsvをIuplogininfoacsv、iUplogininfoCsvをiuplogininfoacsvに修正した。これはhttp://d.hatena.ne.jp/kazpgm/20110131/1296487044による修正を反映したもの。
2011/03/07 4:00-4:10 http://d.hatena.ne.jp/kazpgm/20110307/1299523681(TOOL更新_Ver0.1Zd(次期バージョン)の管理者側もすべてアクションで切り分けるように修正した。(modeパラメータを使わないようにした。)など。)の内容を反映した。