ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Changeset 6707


Ignore:
Timestamp:
Apr 23, 2008, 11:28:40 PM (12 years ago)
Author:
ogawa
Message:

#2210:CSVインポートでプロフィール項目も登録できるようにする

Location:
OpenPNE/trunk/webapp
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • OpenPNE/trunk/webapp/lib/db/member.php

    r6630 r6707  
    860860            $params = array(intval($v), intval($c_profile['c_profile_id']));
    861861            $value = db_get_one($sql, $params);
    862             $c_profile_option_id = $v;
     862            $c_profile_option_id = intval($v);
    863863            break;
    864864        case 'checkbox':
  • OpenPNE/trunk/webapp/modules/admin/do/import_c_member.php

    r6617 r6707  
    1717        $member_file = $_FILES['member_file'];
    1818
    19         $limit = 1000;  // 件数制限
    20 
    21         // 項目数
    22         if (OPENPNE_AUTH_MODE == 'pneid') {
    23             $column_num = 4;
    24         } else {
    25             $column_num = 3;
    26         }
     19        $limit = 1000;  // 行数制限
    2720
    2821        if (empty($member_file) || $member_file['error'] === UPLOAD_ERR_NO_FILE) {
     
    3528        }
    3629
    37         $member_data = file($member_file['tmp_name']);
    38         $member_data_count = count($member_data);
    39         if ($member_data_count > $limit) {
    40             $this->handleError("ファイルの行数は{$limit}行以内にしてください");
    41         }
    42 
    43         foreach ($member_data as $key => $value) {
    44             $columns = explode(',', trim($value));
    45             $lnum = $key + 1;  // 行番号
    46 
     30        $handle = fopen($member_file['tmp_name'], 'r');
     31
     32        if (($data = fgetcsv($handle, 4096)) === false) {
     33            $this->handleError('ファイルの内容が空です');
     34        }
     35
     36        $required_list = array('nickname', 'mail_address', 'password');
     37        if (OPENPNE_AUTH_MODE == 'pneid') {
     38            $required_list[] = 'login_id';
     39        }
     40        foreach ($required_list as $required) {
     41            if (!in_array($required, $data)) {
     42                $this->handleError('1行目: ' . $required . 'は必須項目です');
     43            }
     44        }
     45
     46        $title = array();
     47        foreach ($data as $key => $value) {
     48            $matches = array();
     49            if (preg_match('/^profile\[(.*)\]$/', $value, $matches)) {
     50                $is_profile = true;
     51                $name = $matches[1];
     52                $c_profile = db_member_c_profile4name($name);
     53            } else {
     54                $is_profile = false;
     55                $name = $value;
     56                $c_profile = null;
     57            }
     58
     59            $title[$key] = array(
     60                'is_profile' => $is_profile,
     61                'name'       => $name,
     62                'c_profile'  => $c_profile,
     63            );
     64        }
     65
     66        $row = 1; // 1行目がタイトル行
     67        $count = 0; // メンバー登録に成功した数
     68
     69        while (($data = fgetcsv($handle, 4096)) !== false && $row <= $limit) {
     70            $row++;
     71
     72            $data_member = array();
     73            $data_profile = array();
     74
     75            foreach ($data as $key => $value) {
     76                if (empty($title[$key])) {
     77                    continue;
     78                }
     79                $name = $title[$key]['name'];
     80                if ($title[$key]['is_profile']) {
     81                    if ($title[$key]['c_profile']['form_type'] === 'checkbox') {
     82                        $data_profile[$name] = explode(',', $value);
     83                    } else {
     84                        $data_profile[$name] = $value;
     85                    }
     86                } else {
     87                    $data_member[$name] = $value;
     88                }
     89            }
     90
     91            if (is_ktai_mail_address($data_member['mail_address'])) {
     92                $data_member['mail_address'] = str_replace('"', '', $data_member['mail_address']);
     93            }
     94
     95            // validate
     96            $errors = array();
     97
     98            $validator = new OpenPNE_Validator();
     99            $validator->addRequests($data_member);
     100            $validator->addRules($this->_getValidateRules());
     101            if (!$validator->validate()) {
     102                $errors = array_merge($errors, $validator->getErrors());
     103            }
     104            $member = $validator->getParams();
     105
     106            // mail_address
     107            if (!db_common_is_mailaddress($member['mail_address'])) {
     108                $errors[] = "メールアドレス [{$member['mail_address']}] はメールアドレスとして正しくありません";
     109            } elseif (db_member_is_sns_join4mail_address($member['mail_address'])) {
     110                $errors[] = "メールアドレス [{$member['mail_address']}] は既に登録済みです";
     111            } elseif (!db_member_is_limit_domain4mail_address($member['mail_address'])) {
     112                $errors[] = "メールアドレス [{$member['mail_address']}] は登録できません";
     113            }
     114
     115            // login_id
    47116            if (OPENPNE_AUTH_MODE == 'pneid') {
    48                 list($login_id, $nickname, $mail_address, $password) = $columns;
    49             } else {
    50                 $login_id = null;
    51                 list($nickname, $mail_address, $password) = $columns;
    52             }
    53             if (is_ktai_mail_address($mail_address)) {
    54                 $mail_address = str_replace('"', '', $mail_address);
    55             }
    56 
    57             if (count($columns) != $column_num) {
    58                 $this->handleError("{$lnum}行目:項目は{$column_num}つにしてください");
    59             }
    60 
    61             if ($nickname === '' || $mail_address === '' || $password === '' || $login_id === '') {
    62                 $this->handleError("{$lnum}行目:空の項目が存在します");
    63             }
    64 
    65             if (strlen($nickname) > 40) {
    66                 $this->handleError("{$lnum}行目:" . WORD_NICKNAME . "は40文字以内で入力してください");
    67             }
    68 
    69             if (!db_common_is_mailaddress($mail_address)) {
    70                 $this->handleError("{$lnum}行目:メールアドレス [{$mail_address}] はメールアドレスとして正しくありません");
    71             }
    72 
    73             if (db_member_is_sns_join4mail_address($mail_address)) {
    74                 $this->handleError("{$lnum}行目:メールアドレス [{$mail_address}] は既に登録済みです");
    75             }
    76 
    77             // ドメイン制限
    78             if (!db_member_is_limit_domain4mail_address($mail_address)) {
    79                 $this->handleError("{$lnum}行目:メールアドレス [{$mail_address}] は登録できません");
    80             }
    81 
    82             if (!preg_match('/^[a-z0-9]{6,12}$/i', $password)) {
    83                 $this->handleError("{$lnum}行目:パスワードは6~12文字の半角英数で入力してください");
    84             }
    85 
    86             // ログインIDを使用する場合
    87             if (OPENPNE_AUTH_MODE == 'pneid') {
    88                 if (!preg_match('/^[a-z0-9][a-z0-9\-_]+[a-z0-9]$/i', $login_id)) {
    89                     $this->handleError("{$lnum}行目:ログインIDは4~30文字の半角英数で入力してください");
    90                 }
    91 
    92                 if (db_member_c_member_id4username($login_id)) {
    93                     $this->handleError("{$lnum}行目:ログインID[{$login_id}]は既に登録済みです");
    94                 }
    95 
    96             }
     117                if (db_member_c_member_id4username($member['login_id'])) {
     118                    $errors[] = "ログインID[{$member['login_id']}]は既に登録済みです";
     119                }
     120            }
     121
     122            // 生年月日のチェック
     123            if ($member['birth_year'] || $member['birth_month'] || $member['birth_day']) {
     124                if (!t_checkdate($member['birth_month'], $member['birth_day'], $member['birth_year'])) {
     125                    $errors[] = '生年月日を正しく入力してください';
     126                } elseif (t_isFutureDate($member['birth_day'], $member['birth_month'], $member['birth_year'])) {
     127                    $errors[] = '生年月日を未来に設定することはできません';
     128                }
     129            }
     130
     131            if ($errors) {
     132                $this->handleError("{$row}行目:" . array_shift($errors));
     133            }
     134
     135            // profile
     136            $c_member_profile = db_member_check_profile($data_profile, array());
     137
     138            // register
    97139
    98140            // メールアドレスが携帯メールアドレスのドメインの場合は、
    99141            // 携帯メールアドレスとして登録する
    100             if (is_ktai_mail_address($mail_address)) {
    101                 $ktai_address = $mail_address;
     142            if (is_ktai_mail_address($member['mail_address'])) {
     143                $ktai_address = $member['mail_address'];
    102144                $pc_address   = '';
    103145            } else {
    104146                $ktai_address = '';
    105                 $pc_address   = $mail_address;
     147                $pc_address   = $member['mail_address'];
    106148            }
    107149
    108150            $c_member = array(
    109                 'nickname' => $nickname,
    110                 'birth_year' => 0,
    111                 'birth_month' => 0,
    112                 'birth_day' => 0,
     151                'nickname' => $member['nickname'],
     152                'birth_year' => $member['birth_year'],
     153                'birth_month' => $member['birth_month'],
     154                'birth_day' => $member['birth_day'],
    113155                'c_password_query_id' => 0,
    114156                'c_member_id_invite' => 1,
     
    116158                'is_receive_ktai_mail' => 1,
    117159                'is_receive_daily_news' => 1,
    118                 'public_flag_birth_year' => 'public',
    119                 'public_flag_birth_month_day' => 'public',
     160                'public_flag_birth_year' => $member['public_flag_birth_year'],
     161                'public_flag_birth_month_day' => $member['public_flag_birth_month_day'],
    120162            );
    121163
    122164            if (OPENPNE_AUTH_MODE == 'pneid') {
    123                 $c_member['login_id'] = $login_id;
     165                $c_member['login_id'] = $member['login_id'];
    124166            }
    125167
    126168            $c_member_secure = array(
    127                 'password' => $password,
     169                'password' => $member['password'],
    128170                'pc_address' => $pc_address,
    129171                'ktai_address' => $ktai_address,
    130                 'regist_address' => $mail_address,
    131             );
    132 
    133             $u = util_regist_c_member($c_member, $c_member_secure);
    134         }
    135 
    136         admin_client_redirect('import_c_member', "{$member_data_count}件のインポートが完了しました");
     172                'regist_address' => $member['mail_address'],
     173            );
     174
     175            if (!util_regist_c_member($c_member, $c_member_secure, $c_member_profile)) {
     176                $this->handleError("{$row}行目:メンバー登録に失敗しました");
     177            }
     178            $count++;
     179        }
     180        fclose($handle);
     181
     182        admin_client_redirect('import_c_member', "{$count}件のインポートが完了しました");
     183    }
     184
     185    function _getValidateRules()
     186    {
     187        $rules = array(
     188            'nickname' => array(
     189                'type' => 'string',
     190                'required' => '1',
     191                'caption' => WORD_NICKNAME,
     192                'max' => '40',
     193            ),
     194            'mail_address' => array(
     195                'type' => 'string',
     196                'required' => '1',
     197                'caption' => 'メールアドレス',
     198            ),
     199            'password' => array(
     200                'type' => 'regexp',
     201                'regexp' => '/^[a-z0-9]{6,12}$/i',
     202                'required' => '1',
     203                'caption' => 'パスワード',
     204                'type_error' => 'パスワードは6~12文字の半角英数で入力してください',
     205            ),
     206            'birth_year' => array(
     207                'type' => 'int',
     208                'caption' => '生まれた年',
     209                'min' => '1901',
     210                'default' => '0',
     211            ),
     212            'birth_month' => array(
     213                'type' => 'int',
     214                'caption' => '誕生月',
     215                'min' => '1',
     216                'max' => '12',
     217                'default' => '0',
     218            ),
     219            'birth_day' => array(
     220                'type' => 'int',
     221                'caption' => '誕生日',
     222                'min' => '1',
     223                'max' => '31',
     224                'default' => '0',
     225            ),
     226            'public_flag_birth_year' => array(
     227                'type' => 'regexp',
     228                'regexp' => '/^(public|friend|private)$/',
     229                'caption' => '生まれた年の公開範囲',
     230                'default' => 'public',
     231            ),
     232            'public_flag_birth_month_day' => array(
     233                'type' => 'regexp',
     234                'regexp' => '/^(public|friend|private)$/',
     235                'caption' => '誕生日の公開範囲',
     236                'default' => 'public',
     237            ),
     238        );
     239        if (OPENPNE_AUTH_MODE == 'pneid') {
     240            $rules['login_id'] = array(
     241                'type' => 'regexp',
     242                'regexp' => '/^[a-z0-9][a-z0-9\-_]+[a-z0-9]$/i',
     243                'required' => '1',
     244                'caption' => 'ログインID',
     245                'regexp_error' => 'ログインIDは4~30文字の半角英数で入力してください',
     246            );
     247        }
     248        return $rules;
    137249    }
    138250}
  • OpenPNE/trunk/webapp/modules/admin/page/import_c_member.php

    r4933 r6707  
    44 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
    55 */
    6 
    7 require_once 'OpenPNE/RSS.php';
    86
    97// メンバー情報のインポート
  • OpenPNE/trunk/webapp/modules/admin/templates/edit_c_profile.tpl

    r6617 r6707  
    169169<table class="basicType2">
    170170<tr>
     171<th>ID</th>
    171172<th>項目名</th>
    172173<th>並び順</th>
     
    176177<tr>
    177178<form action="./" method="post">
     179<td>({$option.c_profile_option_id})</td>
    178180<td>
    179181<input type="hidden" name="m" value="({$module_name})" />
     
    195197</form>
    196198</tr>
    197 </form>
    198199({/foreach})
    199200<tr>
    200201<form action="./" method="post">
     202<td>-</td>
    201203<td>
    202204<input type="hidden" name="m" value="({$module_name})" />
  • OpenPNE/trunk/webapp/modules/admin/templates/import_c_member.tpl

    r6397 r6707  
    1010<div class="contents">
    1111
    12 
    1312({if $requests.msg})
    1413<p class="actionMsg">({$requests.msg})</p>
    1514({/if})
    1615
    17 <h3 class="item">メンバー情報をデータベースに一括登録</h3>
     16<p>以下のフォームからメンバー情報の記載されたCSVファイルをアップロードすると、メンバーを登録することができます。</p>
    1817
    19 <p class="caution">※文字コード、ファイル形式、項目の順序を守ってください。この処理は10分以上かかる場合があります。</p>
     18<ul class="caution">
     19<li>※1ファイルで登録処理がおこなわれるのは1000行目までです。以降の行は無視されます。</li>
     20<li>※文字コード、ファイル形式を守ってください。</li>
     21<li>※この処理には10分以上かかる場合があります。</li>
     22</ul>
    2023
    2124<form action="./" method="post" enctype="multipart/form-data">
    22 <input type="hidden" name="m" value="({$module_name})">
    23 <input type="hidden" name="a" value="do_({$hash_tbl->hash('import_c_member','do')})">
    24 <input type="hidden" name="sessid" value="({$PHPSESSID})">
    25 <p>≪メンバーデータファイル≫<br>
    26 文字コード:UTF-8<br>
    27 ファイル形式:csv</p>
    28 <p>項目の順序({if $smarty.const.OPENPNE_AUTH_MODE == 'pneid'})「ログインID」({/if})「({$WORD_NICKNAME})」「登録メールアドレス」「パスワード」</p>
     25<input type="hidden" name="m" value="({$module_name})" />
     26<input type="hidden" name="a" value="do_({$hash_tbl->hash('import_c_member','do')})" />
     27<input type="hidden" name="sessid" value="({$PHPSESSID})" />
    2928<p><input type="file" name="member_file" /></p>
    30 <p class="textBtn"><input type="submit" class="submit" name="member_file_submit" value="登録" /></p>
     29<p class="textBtn"><input type="submit" class="submit" value="登録" /></p>
    3130</form>
    3231
     32<h3 class="item">メンバー情報CSVファイル形式</h3>
     33<ul>
     34<li>文字コード: UTF-8</li>
     35<li>ファイルの拡張子: .csv</li>
     36</ul>
     37<p>1行目にタイトル行、2行目以降にメンバー情報を記載します。</p>
     38<p>タイトル行には以下の項目が記載できます。</p>
     39<ul>
     40({if $smarty.const.OPENPNE_AUTH_MODE == 'pneid'})<li>login_id</li>({/if})
     41<li>nickname</li>
     42<li>mail_address</li>
     43<li>password</li>
     44<li>birth_year</li>
     45<li>birth_month</li>
     46<li>birth_day</li>
     47<li>public_flag_birth_year</li>
     48<li>public_flag_birth_month_day</li>
     49<li>profile[識別名]</li>
     50</ul>
     51<p>※({if $smarty.const.OPENPNE_AUTH_MODE == 'pneid'})「login_id」({/if})「nickname」「mail_address」「password」は必須項目です。</p>
     52
    3353({$inc_footer|smarty:nodefaults})
Note: See TracChangeset for help on using the changeset viewer.