Changeset 6707
- Timestamp:
- Apr 23, 2008, 11:28:40 PM (12 years ago)
- Location:
- OpenPNE/trunk/webapp
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
OpenPNE/trunk/webapp/lib/db/member.php
r6630 r6707 860 860 $params = array(intval($v), intval($c_profile['c_profile_id'])); 861 861 $value = db_get_one($sql, $params); 862 $c_profile_option_id = $v;862 $c_profile_option_id = intval($v); 863 863 break; 864 864 case 'checkbox': -
OpenPNE/trunk/webapp/modules/admin/do/import_c_member.php
r6617 r6707 17 17 $member_file = $_FILES['member_file']; 18 18 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; // 行数制限 27 20 28 21 if (empty($member_file) || $member_file['error'] === UPLOAD_ERR_NO_FILE) { … … 35 28 } 36 29 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 47 116 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 97 139 98 140 // メールアドレスが携帯メールアドレスのドメインの場合は、 99 141 // 携帯メールアドレスとして登録する 100 if (is_ktai_mail_address($m ail_address)) {101 $ktai_address = $m ail_address;142 if (is_ktai_mail_address($member['mail_address'])) { 143 $ktai_address = $member['mail_address']; 102 144 $pc_address = ''; 103 145 } else { 104 146 $ktai_address = ''; 105 $pc_address = $m ail_address;147 $pc_address = $member['mail_address']; 106 148 } 107 149 108 150 $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'], 113 155 'c_password_query_id' => 0, 114 156 'c_member_id_invite' => 1, … … 116 158 'is_receive_ktai_mail' => 1, 117 159 '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'], 120 162 ); 121 163 122 164 if (OPENPNE_AUTH_MODE == 'pneid') { 123 $c_member['login_id'] = $ login_id;165 $c_member['login_id'] = $member['login_id']; 124 166 } 125 167 126 168 $c_member_secure = array( 127 'password' => $ password,169 'password' => $member['password'], 128 170 'pc_address' => $pc_address, 129 171 '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; 137 249 } 138 250 } -
OpenPNE/trunk/webapp/modules/admin/page/import_c_member.php
r4933 r6707 4 4 * @license http://www.php.net/license/3_01.txt PHP License 3.01 5 5 */ 6 7 require_once 'OpenPNE/RSS.php';8 6 9 7 // メンバー情報のインポート -
OpenPNE/trunk/webapp/modules/admin/templates/edit_c_profile.tpl
r6617 r6707 169 169 <table class="basicType2"> 170 170 <tr> 171 <th>ID</th> 171 172 <th>項目名</th> 172 173 <th>並び順</th> … … 176 177 <tr> 177 178 <form action="./" method="post"> 179 <td>({$option.c_profile_option_id})</td> 178 180 <td> 179 181 <input type="hidden" name="m" value="({$module_name})" /> … … 195 197 </form> 196 198 </tr> 197 </form>198 199 ({/foreach}) 199 200 <tr> 200 201 <form action="./" method="post"> 202 <td>-</td> 201 203 <td> 202 204 <input type="hidden" name="m" value="({$module_name})" /> -
OpenPNE/trunk/webapp/modules/admin/templates/import_c_member.tpl
r6397 r6707 10 10 <div class="contents"> 11 11 12 13 12 ({if $requests.msg}) 14 13 <p class="actionMsg">({$requests.msg})</p> 15 14 ({/if}) 16 15 17 < h3 class="item">メンバー情報をデータベースに一括登録</h3>16 <p>以下のフォームからメンバー情報の記載されたCSVファイルをアップロードすると、メンバーを登録することができます。</p> 18 17 19 <p class="caution">※文字コード、ファイル形式、項目の順序を守ってください。この処理は10分以上かかる場合があります。</p> 18 <ul class="caution"> 19 <li>※1ファイルで登録処理がおこなわれるのは1000行目までです。以降の行は無視されます。</li> 20 <li>※文字コード、ファイル形式を守ってください。</li> 21 <li>※この処理には10分以上かかる場合があります。</li> 22 </ul> 20 23 21 24 <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})" /> 29 28 <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> 31 30 </form> 32 31 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 33 53 ({$inc_footer|smarty:nodefaults})
Note: See TracChangeset
for help on using the changeset viewer.