Beispiel #1
0
 /**
  * Сгенерировать код для отписки от рассылки
  */
 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 '';
 }
Beispiel #2
0
 /**
  * Обработка 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;
 }
Beispiel #3
0
 /**
  * Редактирование рассылки
  * @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);
 }
Beispiel #4
0
 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;
 }