Так как на начальном этапе подписчиков будет немного, то отправку писем я реализовал с помощью простого плагина на событие OnDocFormSave:
<?php switch ($modx->event->name) { case "OnDocFormSave": if ($mode != 'new' || $resource->template != 2) { return; break; } else { $salt = 'Соль для md5 при генерации ссылок на отписку'; // Используем механизм отправки писем из Tickets $Tickets = $modx->getService('tickets','Tickets', $modx->getOption('tickets.core_path',null, $modx->getOption('core_path') .'components/tickets/') .'model/tickets/',$scriptProperties); /* Получаем список подписчиков (если пользователь подписан, zip = 1) */ $subscribers = $modx->getCollection('modUserProfile', array('zip' => 1, 'email:!=' => '')); foreach ($subscribers as $subscriber) { $sendTo = $subscriber->get('email'); $mail = array("to" => $sendTo , "subject" => "Новая статья: ".$resource->pagetitle , "message" => "<b>В блоге Ильи Уткина новая статья.</b><h2>" .$resource->pagetitle."</h2> <table width=\"710\"><tbody><tr><td>".$resource->introtext ."</td></tr></tbody></table><a href=\"" .$modx->makeUrl($resource->id,'','','full') .'\">Читать далее »</a><p>Чтобы отписаться от рассылки перейдите по ссылке:</p><p> <a href=\"http://ilyaut.ru/profile/?email=' .$sendTo.'&hash='.md5($sendTo.$salt).'\"> http://ilyaut.ru/profile/?email=' .$sendTo.'&hash='.md5($sendTo.$salt).'</a></p>'); $Tickets->sendMail($mail); } } }Этот код отправляет письма всем пользователям, у которых параметр zip равен 1.
Теперь надо дать пользователям возможность подписаться на новости. Для пользователей есть форма, в которую они вписывают свой электронный адрес. Вот обработчик формы:
<?php $email = $hook->getValue('email'); $success = false; // Если пользователь неавторизован, то if (!$modx->user->get('id')) { // Если уже есть пользователь с таким e-mail'ом, ошибка if ($users = $modx->getCollection('modUserProfile', array('email' => $email))) { $hook->addError('email','На сайте уже есть пользователь с таким электронным адресом. Если это вы, то для управления рассылкой придется авторизоваться'); return false; } else { // Если нет, создаем пользователя и подписываем $user = $modx->newObject('modUser'); $user->fromArray(array('username' => $email , 'password' => $email)); $Profile = $modx->newObject('modUserProfile'); $Profile->set('email', $email); $Profile->set('fullname', 'Подписчик'); $Profile->set('zip', 1); // подписан на новости $Profile->save(); $user->addOne($Profile); $user->save(); $success = true; } } else { // Если пользователь авторизован, просто вносим изменения $profile = $modx->user->getOne('Profile'); $profile->set('zip',1); $profile->set('email',$email); $profile->save(); $success = true; } if ($success) { // Отправляем письмо, с помощью которого можно отписаться $Tickets = $modx->getService('tickets','Tickets' ...; $Tickets->sendMail(array('to' => $email, 'subject' => 'Подписка на новые статьи успешно оформлена', 'message' => '</h3>Вы подписались на новые статьи.</h3> <p>Если это были не вы, просто перейдите по ссылке и подписка аннулируется:</p> <p><a href="http://ilyaut.ru/profile/?email=' .$email.'&hash='.md5($email.$salt).'"> http://ilyaut.ru/profile/?email='.$email.'&hash=' .md5($email.$salt).'</a></p>')); return true; } else { $hook->addError('email','Что-то не так'); return false; }Соль везде одинаковая, только я вам не скажу, какая))))
И теперь делаем отписку от рассылки. На старнице /profile/ сниппет:
// Если в ссылке нет email или hash ничего не делаем if (!$_GET['email'] || !$_GET['hash']) return; // Если хеш неправильный, показываем ошибку if ($_GET['hash'] != md5($_GET['email'].$salt)) { return '<h1 style="color: #c00;">Ошибка. Вы не отписаны от рассылки.</h1>'; } // Если все верно, находим пользователя по email $Profile = $modx->getCollection('modUserProfile', array('email' => $_GET['email'])); if (!$Profile) return '<h1 style="color: #c00;">Ошибка. Вы не отписаны от рассылки.</h1>'; foreach ($Profile as $prof) { $user = $prof->getOne('User'); // Если это не просто подписчик, а именно пользователь if ($prof->get('fullname') != 'Подписчик') { // то просто отписываем его от рассылки $prof->set('zip',2); // отписан $prof->save(); } else { // А если это просто подписчик, удаляем его $user->remove(); } } return '<h1 style="color: #0c0;">Вы отписаны от рассылки.</h1>';
Можно было сделать хеш похитрее, но так как он защищает только от несанкционированной отписки от рассылки, то и так пойдет =) G+
Вы добавляете новость в дереве документов на сайте, она автоматически разлетается подписчикам?
Только что сообразила, что везде решения для Revo, эх, не мой вариант в данном проекте
Ввожу emai в Input, нажимаю отправить, открывается пустая страница "[адрес сайта]/core/components/tsender/subscribeNews.php". Письма не приходят, когда создаешь новый тикет. Подскажите, что не так сделал?