/** * Сгенерировать код для отписки от рассылки */ public static function generateUnsubscribeCode() { for ($i = 0; $i <= 1000; $i++) { $code = md5(microtime() + $i); $cnt = subscribe_model_Subscriber::count(array(array('unsubscr_code', $code))); if ($cnt == 0) { return $code; } } return ''; }
/** * Обработка Ajax запроса на подписку на рассылку * Используется виджетом * Принимает email пользователя * Допускается подписка неавторизованными пользователями (они должны подтвердить email) */ public function ajxSubscribeAction() { global $db_users; $ret = array('error' => '', 'message' => ''); $id = cot_import('id', 'P', 'INT'); $email = cot_import('email', 'P', 'TXT'); if (!$id) { $ret['error'] = cot::$L['subscribe_err_not_found']; echo json_encode($ret); exit; } $subscribe = subscribe_model_Subscribe::getById($id); if (!$subscribe) { $ret['error'] = cot::$L['subscribe_err_not_found']; echo json_encode($ret); exit; } if (!$subscribe->active) { $ret['error'] = cot::$L['subscribe_err_disabled']; echo json_encode($ret); exit; } if (empty($email)) { $ret['error'] = cot::$L['field_required'] . ': ' . cot::$L['Email']; echo json_encode($ret); exit; } $tmp = subscribe_checkEmail($email); if ($tmp !== true) { $ret['error'] = $tmp; echo json_encode($ret); exit; } $email = mb_strtolower($email); $subscriber = subscribe_model_Subscriber::fetchOne(array(array('subscribe', $id), array('email', $email))); if ($subscriber) { if ($subscriber->active) { $ret['error'] = sprintf(cot::$L['subscribe_err_user_subscribed'], $email, $subscribe->title); echo json_encode($ret); exit; } } else { $subscriber = new subscribe_model_Subscriber(); } $sql = cot::$db->query("SELECT * FROM {$db_users} WHERE user_email = ? LIMIT 1", $email); $user = $sql->fetch(); $subscriber->subscribe = $id; $subscriber->email = $email; if (!empty($user)) { $subscriber->user = $user['user_id']; $subscriber->name = cot_user_full_name($user); } $needConfirm = cot::$cfg['subscribe']['guestConfirmMail']; if (cot::$usr['id'] > 0) { if (cot::$usr['id'] == $user['user_id'] || cot::$usr['isadmin']) { $needConfirm = false; } } if ($needConfirm) { // Возможно пользователь уже подтверждал свой email $tmp = subscribe_model_Subscriber::count(array(array('email', $email), array('email_valid', 1))); if ($tmp > 0) { $needConfirm = false; } } if (!$needConfirm) { $subscriber->email_valid = 1; $subscriber->email_valid_date = date('Y-m-d H:i:s', cot::$sys['now']); $subscriber->active = 1; } // Сохранение $subscriber->save(); $ret['message'] = sprintf(cot::$L['subscribe_msg_you_subscribed'], $subscribe->title); // Письмо для поджтверждения e-mail адреса if ($needConfirm) { $confirmUrl = cot_url('subscribe', array('m' => 'user', 'a' => 'confirm', 'code' => $subscriber->unsubscr_code)); if (!cot_url_check($confirmUrl)) { $confirmUrl = cot::$cfg['mainurl'] . '/' . $confirmUrl; } $mailView = new View(); $mailView->subscriber = $subscriber; $mailView->subscribe = $subscribe; $mailView->confirmUrl = $confirmUrl; $mailTpl = array('subscribe', 'mail_confirm', cot::$usr['lang']); $mailBody = $mailView->render($mailTpl); cot_mail($email, cot::$L['subscribe_confirm'], $mailBody, '', false, null, true); $ret['message'] .= cot::$L['subscribe_wait_confirm']; } echo json_encode($ret); exit; }
/** * Редактирование рассылки * @return string * @throws Exception */ public function editAction() { global $cot_extrafields, $admintitle, $adminpath; $id = cot_import('id', 'G', 'INT'); // id Рассылки $act = cot_import('act', 'G', 'ALP'); if (empty($act)) { $act = cot_import('act', 'P', 'ALP'); } $adminpath[] = array(cot_url('admin', array('m' => 'subscribe')), cot::$L['subscribe_subscribes']); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.edit.first') as $pl) { include $pl; } /* ===== */ if (!$id) { $item = new subscribe_model_Subscribe(); $admintitle = cot::$L['subscribe_add_new']; $adminpath[] = array(cot_url('admin', array('m' => 'subscribe', 'a' => 'edit')), $admintitle); } else { $item = subscribe_model_Subscribe::getById($id); if (!$item) { cot_error(cot::$L['subscribe_err_not_found']); cot_redirect(cot_url('admin', array('m' => 'subscribe'), '', true)); } if ($act == 'clone') { $id = null; $item = clone $item; $admintitle = cot::$L['subscribe_add_new']; $adminpath[] = array(cot_url('admin', array('m' => 'subscribe', 'a' => 'edit')), $admintitle); } else { $admintitle = $item->title . " [" . cot::$L['Edit'] . "]"; $adminpath[] = array(cot_url('admin', array('m' => 'subscribe', 'a' => 'edit', 'id' => $item->id)), $admintitle); } } // Сохранение if ($act == 'save') { unset($_POST['id'], $_POST['user'], $_POST['x'], $_POST['act']); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.save.first') as $pl) { include $pl; } /* ===== */ $data = $_POST; $data['next_run'] = cot_import_date('next_run'); if (!empty($data['next_run'])) { $data['next_run'] = date('Y-m-d H:i:s', $data['next_run']); } $item->setData($data); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.save.validate') as $pl) { include $pl; } /* ===== */ // There is some errors if (!$item->validate() || cot_error_found()) { $urlParams = array('m' => 'subscribe', 'a' => 'edit'); if ($item->id > 0) { $urlParams['id'] = $item->id; } cot_redirect(cot_url('admin', $urlParams, '', true)); } $isNew = $item->id == 0; // Перерасчет времени следующего запуска // Делать это в админке при редактировании рассылки и при выполнении рассылки // А то могут быть коллизии $recalculate = true; if (!empty($item->next_run)) { $tmp = strtotime($item->next_run); if ($tmp > cot::$sys['now']) { $recalculate = false; } } if ($recalculate) { $item->next_run = $item->getNextRunDate(); } // Сохранение if ($item->save()) { cot_message(cot::$L['Saved']); $urlParams = array('m' => 'subscribe', 'a' => 'edit', 'id' => $item->id); $redirectUrl = cot_url('admin', $urlParams, '', true); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.save.done') as $pl) { include $pl; } /* ===== */ // Редирект на станицу рассылки cot_redirect($redirectUrl); } } // 'input_textarea_editor', 'input_textarea_medieditor', 'input_textarea_minieditor', '' $editor = 'input_textarea_editor'; /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.edit.main') as $pl) { include $pl; } /* ===== */ $nextRun = 0; if (!empty($item->next_run)) { $nextRun = strtotime($item->next_run); } $formElements = array('hidden' => array('element' => cot_inputbox('hidden', 'act', 'save')), 'title' => array('element' => cot_inputbox('text', 'title', $item->rawValue('title')), 'required' => true, 'label' => subscribe_model_Subscribe::fieldLabel('title')), 'alias' => array('element' => cot_inputbox('text', 'alias', $item->rawValue('alias')), 'label' => subscribe_model_Subscribe::fieldLabel('alias')), 'admin_note' => array('element' => cot_textarea('admin_note', $item->rawValue('admin_note'), 5, 120, ''), 'label' => subscribe_model_Subscribe::fieldLabel('admin_note')), 'from_mail' => array('element' => cot_inputbox('text', 'from_mail', $item->rawValue('from_mail')), 'label' => subscribe_model_Subscribe::fieldLabel('from_mail'), 'hint' => cot::$L['subscribe_from_mail_hint']), 'from_title' => array('element' => cot_inputbox('text', 'from_title', $item->rawValue('from_title')), 'label' => subscribe_model_Subscribe::fieldLabel('from_title')), 'subject' => array('element' => cot_inputbox('text', 'subject', $item->rawValue('subject')), 'label' => subscribe_model_Subscribe::fieldLabel('subject')), 'description' => array('element' => cot_textarea('description', $item->rawValue('description'), 5, 120, '', $editor), 'label' => subscribe_model_Subscribe::fieldLabel('description')), 'content_url' => array('element' => cot_inputbox('text', 'content_url', $item->rawValue('content_url')), 'label' => subscribe_model_Subscribe::fieldLabel('content_url'), 'hint' => cot::$L['subscribe_content_url_hint']), 'text' => array('element' => cot_textarea('text', $item->rawValue('text'), 5, 120, '', $editor), 'label' => subscribe_model_Subscribe::fieldLabel('text'), 'hint' => cot::$L['subscribe_text_hint']), 'next_run' => array('element' => cot_selectbox_date($nextRun, 'long', 'next_run'), 'label' => subscribe_model_Subscribe::fieldLabel('next_run'), 'hint' => cot::$L['subscribe_next_run_hint'] . " " . cot::$usr['timetext']), 'sched_mday' => array('element' => cot_inputbox('text', 'sched_mday', $item->rawValue('sched_mday')), 'label' => subscribe_model_Subscribe::fieldLabel('sched_mday'), 'hint' => cot::$L['subscribe_sched_mday_hint']), 'sched_wday' => array('element' => cot_inputbox('text', 'sched_wday', $item->rawValue('sched_wday')), 'label' => subscribe_model_Subscribe::fieldLabel('sched_wday'), 'hint' => cot::$L['subscribe_sched_wday_hint']), 'sched_time' => array('element' => cot_inputbox('text', 'sched_time', $item->rawValue('sched_time')), 'label' => subscribe_model_Subscribe::fieldLabel('sched_time'), 'hint' => cot::$L['subscribe_sched_time_hint']), 'active' => array('element' => cot_checkbox($item->rawValue('active'), 'active', subscribe_model_Subscribe::fieldLabel('active'))), 'periodical' => array('element' => cot_checkbox($item->rawValue('periodical'), 'periodical', subscribe_model_Subscribe::fieldLabel('periodical'))), 'sort' => array('element' => cot_inputbox('text', 'sort', $item->rawValue('sort')), 'label' => subscribe_model_Subscribe::fieldLabel('sort'))); if (!empty($cot_extrafields[cot::$db->subscribe])) { // Extra fields for subscribe foreach ($cot_extrafields[cot::$db->subscribe] as $exfld) { $fName = $exfld['field_name']; $formElements[$fName] = array('element' => cot_build_extrafields($fName, $exfld, $item->rawValue($fName))); if ($exfld['field_type'] !== 'checkbox') { isset(cot::$L['subscribe_' . $exfld['field_name'] . '_title']) ? cot::$L['subscribe_' . $exfld['field_name'] . '_title'] : subscribe_model_Subscribe::fieldLabel($fName); } } } $subscribers = subscribe_model_Subscriber::count(array(array('subscribe', $item->id))); $activeSubscribers = subscribe_model_Subscriber::count(array(array('subscribe', $item->id), array('active', 1))); $actionParams = array('m' => 'subscribe', 'a' => 'edit'); if ($item->id > 0) { $actionParams['id'] = $item->id; } $template = array('subscribe', 'admin', 'edit'); $view = new View(); $view->page_title = $admintitle; $view->item = $item; $view->subscribers = $subscribers; $view->activeSubscribers = $activeSubscribers; $view->formElements = $formElements; $view->formAction = cot_url('admin', $actionParams); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.edit.view') as $pl) { include $pl; } /* ===== */ return $view->render($template); }
public function ajxEditAction() { global $db_users; $ret = array('error' => ''); $id = cot_import('subrid', 'P', 'INT'); unset($_POST['id'], $_POST['subrid']); if ($id > 0) { $subscriber = subscribe_model_Subscriber::getById($id); if (!$subscriber) { $ret['error'] = cot::$L['subscribe_err_subscriber_not_found']; echo json_encode($ret); exit; } } else { $subscriber = new subscribe_model_Subscriber(); } if (!empty($_POST['email'])) { $_POST['email'] = mb_strtolower($_POST['email']); } $subscriber->setData($_POST); $error = array(); $subscr = null; $tmp = $subscriber->rawValue('subscribe'); if (empty($tmp)) { $error[] = cot::$L['field_required'] . ': ' . cot::$L['subscribe_subscribe']; } else { $subscr = subscribe_model_Subscribe::getById($subscriber->rawValue('subscribe')); if (!$subscr) { $error[] = cot::$L['subscribe_err_not_found']; } } $user = null; if (!empty($subscriber->user)) { $user = cot_user_data($subscriber->user); // Если получили данные пользователя, то e-mail всегда берем из профиля if (isset($user['user_email'])) { $subscriber->email = mb_strtolower($user['user_email']); } } if (empty($subscriber->email)) { $error[] = cot::$L['field_required'] . ': ' . cot::$L['Email']; } else { $tmp = subscribe_checkEmail($subscriber->email); if ($tmp !== true) { $error[] = $tmp; } if ($subscriber->rawValue('subscribe') > 0) { if (!empty($subscr)) { $cond = array(array('email', $subscriber->email), array('subscribe', $subscr->id)); if ($subscriber->id > 0) { $cond[] = array('id', $subscriber->id, '<>'); } $cnt = subscribe_model_Subscriber::count($cond); if ($cnt > 0) { $error[] = sprintf(cot::$L['subscribe_err_user_subscribed'], $subscriber->email, htmlspecialchars($subscr->title)); } } } } if (!empty($error)) { $ret['error'] = implode('<br />', $error); echo json_encode($ret); exit; } if (empty($subscriber->name) && (!empty($subscriber->email) || !empty($user))) { if (!empty($user)) { $subscriber->name = cot_user_full_name($user); } else { $sql = cot::$db->query("SELECT * FROM {$db_users} WHERE user_email = ? LIMIT 1", $subscriber->email); $user = $sql->fetch(); if (!empty($user)) { $subscriber->name = cot_user_full_name($user); if (empty($subscriber->user)) { $subscriber->user = $user['user_id']; } } } } // Админ при сохранении подтверждает e-mail if (!$subscriber->email_valid && (empty($subscriber->id) || $subscriber->active)) { $subscriber->email_valid = 1; $subscriber->email_valid_date = date('Y-m-d H:i:s', cot::$sys['now']); } // Сохранение $subscriber->save(); cot_message(cot::$L['Saved']); echo json_encode($ret); exit; }