/** * Запуск текущих рассылок * php cli.php --a subscribe.main.run > subscribe.log * php /path/to/your/site/cli.php --a subscribe.main.run > /path/to/your/site/log/subscribe.log */ public function runAction() { echo "---------------------------------------------------------------------------\n"; // Проверка рассылок, выполнение которых могло завершиться ошибкой $condition = array(array('next_run', date('Y-m-d H:i:s', cot::$sys['now']), '<='), array('active', 1), array('periodical', 1), array('running', 1)); $items = subscribe_model_Subscribe::find($condition); if (!empty($items)) { foreach ($items as $itemRow) { $pingTime = 0; if (!empty($itemRow->ping)) { $pingTime = strtotime($itemRow->ping); } // "Запущенная" когда-то рассылка уже ничего не делает более получаса. Вероятно она отвалилась if (!$pingTime || cot::$sys['now'] - $pingTime > 1800) { $itemRow->ping = '1970-01-01 00:00:00'; $itemRow->running = 0; // Считаем следующий запуск $itemRow->next_run = $itemRow->getNextRunDate(); $itemRow->save(); unset($itemRow); exit; } } unset($items); } // Получаем список рассылок: $condition = array(array('next_run', date('Y-m-d H:i:s', cot::$sys['now']), '<='), array('SQL', 'last_executed < next_run'), array('active', 1), array('running', 0)); $items = subscribe_model_Subscribe::find($condition); if (!$items) { echo "There are no scheduled mailings at this time\n"; ob_flush(); exit; } /* === Hook === */ foreach (cot_getextplugins('subscribe.run.main') as $pl) { include $pl; } /* ===== */ /* === Hook - Part1 : Set === */ $extp = cot_getextplugins('subscribe.run.loop'); /* ===== */ foreach ($items as $itemRow) { echo "Running: " . htmlspecialchars(strip_tags($itemRow->title)) . "\n"; ob_flush(); $lastSent = 0; $execute = true; /* === Hook - Part2 : Include === */ foreach ($extp as $pl) { include $pl; } /* ===== */ if ($execute) { // Установить флаг запущенной рассылки $itemRow->running = 1; $itemRow->save(); // Запустить рассылку $customFunc = ''; if (!empty($itemRow->alias)) { $customFunc = 'subscribe_run_' . $itemRow->alias; } if (!empty($customFunc) && function_exists($customFunc)) { $lastSent = $customFunc($itemRow); } else { $lastSent = static::subscribeRun($itemRow); } } // Сбросить флаг запущенной рассылки $itemRow->running = 0; $itemRow->last_sent = $lastSent; if ($lastSent !== false) { // Время последнего выполнения в случае успешного выполнения $itemRow->last_executed = date('Y-m-d H:i:s'); if ($itemRow->periodical) { $itemRow->next_run = $itemRow->getNextRunDate(); } else { // Если рассылка не периодическая, после выполнения, отключить ее $itemRow->active = 0; } } if ($lastSent > 0) { } elseif ($lastSent === false) { echo " - [ERROR] An error occurred during execution\n"; } else { echo " - No letter sent. Error or no subscribers\n"; } $itemRow->save(); } return ''; }
/** * Список рассылок * @return string * @throws Exception */ public function indexAction() { global $admintitle, $adminpath, $Ls; $admintitle = cot::$L['subscribe_subscribes']; $adminpath[] = array(cot_url('admin', array('m' => 'subscribe')), $admintitle); $sort = cot_import('s', 'G', 'ALP'); // order field name $way = cot_import('w', 'G', 'ALP', 4); // order way (asc, desc) $maxrowsperpage = cot::$cfg['maxrowsperpage']; if ($maxrowsperpage < 1) { $maxrowsperpage = 1; } list($pg, $d, $durl) = cot_import_pagenav('d', $maxrowsperpage); //page number for pages list /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.list.first') as $pl) { include $pl; } /* ===== */ $sort = empty($sort) ? 'title' : $sort; $way = empty($way) || !in_array($way, array('asc', 'desc')) ? 'asc' : $way; $urlParams = array('m' => 'subscribe'); if ($sort != 'title') { $urlParams['s'] = $sort; } if ($way != 'asc') { $urlParams['w'] = $way; } $where = array(); $states = array(-1 => cot::$R['code_option_empty'], 0 => cot::$L['Disabled'], 1 => cot::$L['Enabled']); // Фильтры $allowedFilters = array('id', 'title', 'active'); $f = cot_import('f', 'G', 'ARR'); $filterForm = array('hidden' => ''); if (!empty($f)) { foreach ($f as $key => $val) { if (!in_array($key, $allowedFilters)) { unset($f[$key]); } } if (!empty($f['id'])) { $where['id'] = array('id', $f['id']); $urlParams['f[id]'] = $f['id']; } $f['active'] = isset($_GET['f']['active']) ? cot_import($_GET['f']['active'], 'D', 'INT') : -2; if ($f['active'] == -1) { unset($where['active']); } elseif ($f['active'] >= 0 && $f['active'] < 2) { $where['active'] = array('active', $f['active']); $urlParams['f[active]'] = $f['active']; } if (!empty($f['title'])) { $where['title'] = array('title', '*' . $f['title'] . '*'); $urlParams['f[title]'] = $f['title']; } } if (isset(cot::$cfg['plugin']['urleditor']) && cot::$cfg['plugin']['urleditor']['preset'] != 'handy') { $filterForm['hidden'] .= cot_inputbox('hidden', 'm', 'brs'); } $condition = array(); foreach ($where as $key => $val) { $condition[] = $val; } $order = array(array($sort, $way)); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.list.query') as $pl) { include $pl; } /* ===== */ $totallines = subscribe_model_Subscribe::count($condition); $items = null; if ($totallines > 0) { $items = subscribe_model_Subscribe::find($condition, $maxrowsperpage, $d, $order); } // Если передан номер страницы превышающий максимальный if (empty($items) && $totallines > 0 && $pg > 1) { $totalpages = ceil($totallines / $maxrowsperpage); $args = $urlParams; if ($totalpages > 1) { if (cot::$cfg['easypagenav']) { $args['d'] = $totalpages; } else { $args['d'] = ($totalpages - 1) * $maxrowsperpage; } } cot_redirect(cot_url('admin', $args, '', true)); } $addNewUrl = cot_url('admin', array('m' => 'subscribe', 'a' => 'edit')); /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.list.main') as $pl) { include $pl; } /* ===== */ $pagenav = cot_pagenav('admin', $urlParams, $d, $totallines, $maxrowsperpage, 'd', '', true); if (empty($pagenav['current'])) { $pagenav['current'] = 1; } $pagenav['page'] = $pagenav['current']; if (!cot::$cfg['easypagenav']) { $pagenav['page'] = ($pagenav['current'] - 1) * $maxrowsperpage; } $template = array('subscribe', 'admin', 'list'); $view = new View(); $view->page_title = $admintitle; $view->fistNumber = $d + 1; $view->items = $items; $view->totalitems = $totallines; $view->filterForm = $filterForm; $view->pagenav = $pagenav; $view->addNewUrl = $addNewUrl; $view->urlParams = $urlParams; $view->filter = $f; $view->states = $states; /* === Hook === */ foreach (cot_getextplugins('subscribe.admin.list.view') as $pl) { include $pl; } /* ===== */ return $view->render($template); }
/** * Список рассылок * * @return string * @throws Exception */ public function indexAction() { $uid = cot_import('uid', 'G', 'INT'); if (!$uid || !cot::$usr['isadmin']) { $uid = cot::$usr['id']; } // Мои подписки - только для авторизованных пользователей if (!$uid) { cot_die_message('404'); } $user = cot_user_data($uid); if (!$user) { cot_die_message('404'); } cot::$out['canonical_uri'] = cot_url('subscribe', array('m' => 'user', 'uid' => $uid)); $urlParams = array('m' => 'user'); if ($uid != cot::$usr['id']) { $urlParams['uid'] = $uid; } $crumbs = array(); if ($uid != cot::$usr['id']) { cot::$out['subtitle'] = $title = cot::$L['subscribe_user_subscribes'] . ': ' . cot_user_full_name($user); $crumbs[] = array(cot_url("users"), cot::$L['Users']); $crumbs[] = array(cot_url("users", "m=details&id=" . $user["user_id"] . "&u=" . $user["user_name"]), cot_user_full_name($user)); $crumbs[] = cot::$L['subscribe_user_subscribes']; $urlParams['uid'] = $user['user_id']; } else { cot::$out['subtitle'] = $title = cot::$L['subscribe_my']; $crumbs[] = array(cot_url('users', array('m' => 'details')), cot::$L['subscribe_my_page']); $crumbs[] = cot::$L['subscribe_my']; } /* === Hook === */ foreach (cot_getextplugins('subscribe.user.list.query') as $pl) { include $pl; } /* ===== */ // Все подписки данного пользователя $userSubscribes = subscribe_model_Subscriber::find(array(array('user', $uid), array('email', $user['user_email'], '=', 'OR')), 0, 0, array(array('active', 'desc'))); $subIds = array(); $totallines = 0; if ($userSubscribes) { $totallines = count($userSubscribes); foreach ($userSubscribes as $subscriberRow) { $subIds[] = $subscriberRow->rawValue('subscribe'); } } $subscribes = null; if (!empty($subIds)) { $subIds = array_unique($subIds); $subscribes = subscribe_model_Subscribe::find(array(array('id', $subIds)), 0, 0, array(array('title', 'asc'))); if (!empty($subscribes)) { foreach ($userSubscribes as $key => $subscriberRow) { // маловероятная ситуация, но все же if (!isset($subscribes[$subscriberRow->rawValue('subscribe')])) { // Рассылки больше не существует. // Удалить подписку $subscriberRow->delete(); unset($userSubscribes[$key]); } } } } Resources::linkFileFooter(cot::$cfg['modules_dir'] . '/subscribe/js/subscriber.js'); $breadcrumbs = ''; if (!empty($crumbs)) { $breadcrumbs = cot_breadcrumbs($crumbs, cot::$cfg['homebreadcrumb'], true); } $template = array('subscribe', 'user', 'list'); $view = new View(); $view->breadcrumbs = $breadcrumbs; $view->page_title = htmlspecialchars($title); $view->fistNumber = 1; $view->userSubscribes = $userSubscribes; $view->subscribes = $subscribes; $view->totalitems = $totallines; $view->user = $user; /* === Hook === */ foreach (cot_getextplugins('subscribe.user.list.view') as $pl) { include $pl; } /* ===== */ return $view->render($template); }