/** * 表示に必要なデータを取得し設定する * * @access private * @param array $input_data 入力データ * @return array * @author ida */ private function setupData($data) { $replace_data = array(); $replace_data['user'] = $this->user; $mail_magazine_type = $data['mail_magazine_type']; switch ($mail_magazine_type) { case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_ALL: break; case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_REQUEST: $this->set('prefectures', \Config::get('master.prefectures'), false); break; case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_RESEVED_ENTRY: $fleamarket_id = $data['reserved_fleamarket_id']; $fleamarket = \Model_Fleamarket::find($fleamarket_id); $replace_data['fleamarket'] = $fleamarket; $this->set('fleamarket', $fleamarket, false); break; case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_WAITING_ENTRY: $fleamarket_id = $data['waiting_fleamarket_id']; $fleamarket = \Model_Fleamarket::find($fleamarket_id); $replace_data['fleamarket'] = $fleamarket; $this->set('fleamarket', $fleamarket, false); break; } $users = \Model_Mail_Magazine_User::findListByMailMagazineId($this->mail_magazine_id, null, null); $this->set('users', $users, false); $body = $data['body']; $pattern = \Model_Mail_Magazine::getPatternParameter($mail_magazine_type); list($pattern, $replacement) = \Model_Mail_Magazine::createReplaceParameter($body, $pattern, $replace_data); $body = \Model_Mail_Magazine::replaceByParam($body, $pattern, $replacement); $this->set('body', $body, false); $this->set('input_data', $data, false); }
/** * メールマガジン送信 * * @access public * @param int $mail_magazine_id メルマガID * @param int $administrator_id 管理者ID * @param int $limit 1回で処理する件数 * @return void * @author ida */ public function run($mail_magazine_id, $administrator_id = 0, $limit = 1000) { $this->openLog($mail_magazine_id); $this->log('メルマガID: ' . $mail_magazine_id . ' の送信を開始します' . "\n"); if (\Model_Mail_Magazine::isProcess()) { $this->log('メルマガ送信中のため送信できません' . "\n"); exit; } $mail_magazine = \Model_Mail_Magazine::startProcess($mail_magazine_id); $offset = 0; if (!is_numeric($limit) || $limit <= 0) { $limit = 1000; } $total_count = 0; $success_count = 0; $fail_count = 0; while ($limit > 0) { $mail_magazine_users = \Model_Mail_Magazine_User::findByMailMagazineId($mail_magazine_id, $offset, $limit); if (count($mail_magazine_users) == 0) { break; } $is_stop = false; $replace_data = $this->makeReplaceData($mail_magazine); foreach ($mail_magazine_users as $mail_magazine_user) { try { usleep(300000); if (!\Model_Mail_Magazine::isProcess($mail_magazine_id)) { $is_stop = true; $this->log($mail_magazine_user->user_id . ": cancel.\n"); break; } $send_result = $this->send($mail_magazine_user, $mail_magazine, $replace_data); \Model_Mail_Magazine_User::updateStatus(array('send_status' => $send_result, 'error' => null, 'updated_user' => $administrator_id), array('mail_magazine_user_id' => $mail_magazine_user->mail_magazine_user_id)); $this->log($mail_magazine_user->user_id . " : success\n"); $success_count++; } catch (\Exception $e) { $message = $e->getMessage(); $this->log($mail_magazine_user->user_id . ' : fail ' . $message . "\n"); \Model_Mail_Magazine_User::updateStatus(array('send_status' => \Model_Mail_Magazine_User::SEND_STATUS_ERROR_END, 'error' => $message, 'updated_user' => $administrator_id), array('mail_magazine_user_id' => $mail_magazine_user->mail_magazine_user_id)); $fail_count++; } $total_count++; } $offset += $limit; } $this->log('[total] ' . $total_count . ' [success] ' . $success_count . ' [fail] ' . $fail_count . "\n"); $this->log('送信を終了しました'); $this->closeLog(); $mail_magazine->send_datetime = \Date::forge()->format('mysql'); if ($is_stop) { $mail_magazine->send_status = \Model_Mail_Magazine::SEND_STATUS_CANCEL; } else { $mail_magazine->send_status = \Model_Mail_Magazine::SEND_STATUS_NORMAL_END; } $mail_magazine->save(); }
/** * view method * * @access public * @return void * @author ida */ public function view() { $this->mail_magazine = \Model_Mail_Magazine::find($this->mail_magazine_id); $this->send_status = \Model_Mail_Magazine_User::getSendStatuses(); }
/** * 登録&送信 * * @access public * @param * @return void * @author ida */ public function action_thanks() { if (!Security::check_token()) { \Response::redirect('errors/doubletransmission'); } Asset::css('jquery-ui.min.css', array(), 'add_css'); Asset::js('jquery-ui.min.js', array(), 'add_js'); $input_data = $this->getInputData(true); $input_data['created_user'] = $this->administrator->administrator_id; $input_data['send_status'] = \Model_Mail_Magazine::SEND_STATUS_WAITING; $additional_data = $this->getAdditionalData($input_data); $input_data['additional_serialize_data'] = serialize($additional_data); try { $db = Database_Connection::instance('master'); \DB::start_transaction(); $mail_magazine = \Model_Mail_Magazine::forge(); $mail_magazine->set($input_data)->save(); // メルマガ対象ユーザ登録 $query = $input_data['query']; $users = \DB::query($query)->execute(); foreach ($users as $user) { $data = array('mail_magazine_id' => $mail_magazine->mail_magazine_id, 'user_id' => $user['user_id'], 'send_status' => \Model_Mail_Magazine_User::SEND_STATUS_WAITING, 'created_user' => $this->administrator->administrator_id); $mail_magazine_user = \Model_Mail_Magazine_User::forge(); $mail_magazine_user->set($data)->save(); } \DB::commit_transaction(); } catch (\Exception $e) { \DB::rollback_transaction(); throw new \SystemException(\Model_Error::ER00000); } $view_model = \ViewModel::forge('admin/mailmagazine/thanks'); list($view_model, $replace_data) = $this->setupData($view_model, $input_data); // タスク実行 $oil_path = realpath(APPPATH . '/../../') . DS; $param = $mail_magazine->mail_magazine_id . ' ' . $this->administrator->administrator_id; exec('php ' . $oil_path . 'oil refine mail_magazine ' . $param . ' > /dev/null &'); $view_model->set('mail_magazine', $mail_magazine, true); $this->template->content = $view_model; }