PageRenderTime 26ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/webapp/modules/admin/do/import_c_member.php

https://github.com/openpne/OpenPNE2
PHP | 252 lines | 208 code | 31 blank | 13 comment | 35 complexity | e7186998dc522f5feaa2780d78ef8720 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. <?php
  2. /**
  3. * @copyright 2005-2008 OpenPNE Project
  4. * @license http://www.php.net/license/3_01.txt PHP License 3.01
  5. */
  6. // メンバー情報一括登録
  7. class admin_do_import_c_member extends OpenPNE_Action
  8. {
  9. function handleError($msg)
  10. {
  11. admin_client_redirect('import_c_member', $msg);
  12. }
  13. function execute($requests)
  14. {
  15. $member_file = $_FILES['member_file'];
  16. $limit = 1000; // 行数制限
  17. if (empty($member_file) || $member_file['error'] === UPLOAD_ERR_NO_FILE) {
  18. $this->handleError('ファイルを指定してください');
  19. }
  20. $filename_parts = explode('.', $member_file['name']);
  21. if (array_pop($filename_parts) != 'csv') {
  22. $this->handleError('拡張子は.csvにしてください');
  23. }
  24. $handle = fopen($member_file['tmp_name'], 'r');
  25. if (($data = fgetcsv($handle, 4096)) === false) {
  26. $this->handleError('ファイルの内容が空です');
  27. }
  28. $required_list = array('nickname', 'mail_address', 'password');
  29. if (OPENPNE_AUTH_MODE == 'pneid') {
  30. $required_list[] = 'login_id';
  31. }
  32. foreach ($required_list as $required) {
  33. if (!in_array($required, $data)) {
  34. $this->handleError('1行目: ' . $required . 'は必須項目です');
  35. }
  36. }
  37. $title = array();
  38. foreach ($data as $key => $value) {
  39. $matches = array();
  40. if (preg_match('/^profile\[(.*)\]$/', $value, $matches)) {
  41. $is_profile = true;
  42. $name = $matches[1];
  43. $c_profile = db_member_c_profile4name($name);
  44. } else {
  45. $is_profile = false;
  46. $name = $value;
  47. $c_profile = null;
  48. }
  49. $title[$key] = array(
  50. 'is_profile' => $is_profile,
  51. 'name' => $name,
  52. 'c_profile' => $c_profile,
  53. );
  54. }
  55. $row = 1; // 1行目がタイトル行
  56. $count = 0; // メンバー登録に成功した数
  57. while (($data = fgetcsv($handle, 4096)) !== false && $row <= $limit) {
  58. $row++;
  59. $data_member = array();
  60. $data_profile = array();
  61. foreach ($data as $key => $value) {
  62. if (empty($title[$key])) {
  63. continue;
  64. }
  65. $name = $title[$key]['name'];
  66. if ($title[$key]['is_profile']) {
  67. if ($title[$key]['c_profile']['form_type'] === 'checkbox') {
  68. $data_profile[$name] = explode(',', $value);
  69. } else {
  70. $data_profile[$name] = $value;
  71. }
  72. } else {
  73. $data_member[$name] = $value;
  74. }
  75. }
  76. if (is_ktai_mail_address($data_member['mail_address'])) {
  77. $data_member['mail_address'] = str_replace('"', '', $data_member['mail_address']);
  78. }
  79. // validate
  80. $errors = array();
  81. $validator = new OpenPNE_Validator();
  82. $validator->addRequests($data_member);
  83. $validator->addRules($this->_getValidateRules());
  84. if (!$validator->validate()) {
  85. $errors = array_merge($errors, $validator->getErrors());
  86. }
  87. $member = $validator->getParams();
  88. // mail_address
  89. if (!db_common_is_mailaddress($member['mail_address'])) {
  90. $errors[] = "メールアドレス [{$member['mail_address']}] はメールアドレスとして正しくありません";
  91. } elseif (db_member_is_sns_join4mail_address($member['mail_address'])) {
  92. $errors[] = "メールアドレス [{$member['mail_address']}] は既に登録済みです";
  93. } elseif (!db_member_is_limit_domain4mail_address($member['mail_address'])) {
  94. $errors[] = "メールアドレス [{$member['mail_address']}] は登録できません";
  95. }
  96. // login_id
  97. if (OPENPNE_AUTH_MODE == 'pneid') {
  98. if (db_member_c_member_id4username($member['login_id'])) {
  99. $errors[] = "ログインID[{$member['login_id']}]は既に登録済みです";
  100. }
  101. }
  102. // 生年月日のチェック
  103. if ($member['birth_year'] || $member['birth_month'] || $member['birth_day']) {
  104. if (!t_checkdate($member['birth_month'], $member['birth_day'], $member['birth_year'])) {
  105. $errors[] = '生年月日を正しく入力してください';
  106. } elseif (t_isFutureDate($member['birth_day'], $member['birth_month'], $member['birth_year'])) {
  107. $errors[] = '生年月日を未来に設定することはできません';
  108. }
  109. }
  110. if ($errors) {
  111. $this->handleError("{$row}行目:" . array_shift($errors));
  112. }
  113. // profile
  114. $c_member_profile = db_member_check_profile($data_profile, array());
  115. // register
  116. // メールアドレスが携帯メールアドレスのドメインの場合は、
  117. // 携帯メールアドレスとして登録する
  118. if (is_ktai_mail_address($member['mail_address'])) {
  119. $ktai_address = $member['mail_address'];
  120. $pc_address = '';
  121. } else {
  122. $ktai_address = '';
  123. $pc_address = $member['mail_address'];
  124. }
  125. $c_member = array(
  126. 'nickname' => $member['nickname'],
  127. 'birth_year' => $member['birth_year'],
  128. 'birth_month' => $member['birth_month'],
  129. 'birth_day' => $member['birth_day'],
  130. 'c_password_query_id' => 0,
  131. 'c_member_id_invite' => 1,
  132. 'is_receive_mail' => 1,
  133. 'is_receive_ktai_mail' => 1,
  134. 'is_receive_daily_news' => 1,
  135. 'public_flag_birth_year' => $member['public_flag_birth_year'],
  136. 'public_flag_birth_month_day' => $member['public_flag_birth_month_day'],
  137. );
  138. if (OPENPNE_AUTH_MODE == 'pneid') {
  139. $c_member['login_id'] = $member['login_id'];
  140. }
  141. $c_member_secure = array(
  142. 'password' => $member['password'],
  143. 'pc_address' => $pc_address,
  144. 'ktai_address' => $ktai_address,
  145. 'regist_address' => $member['mail_address'],
  146. );
  147. if (!util_regist_c_member($c_member, $c_member_secure, $c_member_profile)) {
  148. $this->handleError("{$row}行目:メンバー登録に失敗しました");
  149. }
  150. $count++;
  151. }
  152. fclose($handle);
  153. admin_client_redirect('import_c_member', "{$count}件のインポートが完了しました");
  154. }
  155. function _getValidateRules()
  156. {
  157. $rules = array(
  158. 'nickname' => array(
  159. 'type' => 'string',
  160. 'required' => '1',
  161. 'caption' => WORD_NICKNAME,
  162. 'max' => '40',
  163. ),
  164. 'mail_address' => array(
  165. 'type' => 'string',
  166. 'required' => '1',
  167. 'caption' => 'メールアドレス',
  168. ),
  169. 'password' => array(
  170. 'type' => 'regexp',
  171. 'regexp' => '/^[a-z0-9]{6,12}$/i',
  172. 'required' => '1',
  173. 'caption' => 'パスワード',
  174. 'type_error' => 'パスワードは6~12文字の半角英数で入力してください',
  175. ),
  176. 'birth_year' => array(
  177. 'type' => 'int',
  178. 'caption' => '生まれた年',
  179. 'min' => '1901',
  180. 'default' => '0',
  181. ),
  182. 'birth_month' => array(
  183. 'type' => 'int',
  184. 'caption' => '誕生月',
  185. 'min' => '1',
  186. 'max' => '12',
  187. 'default' => '0',
  188. ),
  189. 'birth_day' => array(
  190. 'type' => 'int',
  191. 'caption' => '誕生日',
  192. 'min' => '1',
  193. 'max' => '31',
  194. 'default' => '0',
  195. ),
  196. 'public_flag_birth_year' => array(
  197. 'type' => 'regexp',
  198. 'regexp' => '/^(public|friend|private)$/',
  199. 'caption' => '生まれた年の公開範囲',
  200. 'default' => 'public',
  201. ),
  202. 'public_flag_birth_month_day' => array(
  203. 'type' => 'regexp',
  204. 'regexp' => '/^(public|friend|private)$/',
  205. 'caption' => '誕生日の公開範囲',
  206. 'default' => 'public',
  207. ),
  208. );
  209. if (OPENPNE_AUTH_MODE == 'pneid') {
  210. $rules['login_id'] = array(
  211. 'type' => 'regexp',
  212. 'regexp' => '/^[a-z0-9][a-z0-9\-_]+[a-z0-9]$/i',
  213. 'required' => '1',
  214. 'caption' => 'ログインID',
  215. 'regexp_error' => 'ログインIDは4~30文字の半角英数で入力してください',
  216. );
  217. }
  218. return $rules;
  219. }
  220. }
  221. ?>