Подскажите пожалуйста как можно добавить форматированный код в контент сайта на MODX Revo. Может есть специальный сниппет или плагин?
Прикрутил восстановление пароля, так что если кто-то забыл свои данные для входа, можете восстановить их по логину или емейлу.
Прикрутил подсветку кода PrettyPrint, код на сайте читать стало легче. Правда все равно еще предстоит большое внимание уделить типографике передаваемого кода на стороне сервера. Но лучше что-то, чем ничего :)
Все, разобрался. Оказалась целая история :) Это из разряда сложных логических ошибок. Для начала кратко напомню задачу и суть проблемы: я решил всем пользователям разослать кратенькую новость. Для этого я сделал выборку всех активных пользователей и в цикле запустил отправку писем каждому через метод $user->sendEmail() (скрипт смотрите выше). Проблемы выразилась в том, что каждому новому письму помимо самого адресата добавлялся список всех предыдущих адресатов, то есть с каждым новым письмом количество адресатов увеличивалось на одного и некоторые пользователи получили десяток и больше писем. Благо я быстро заметил и понял проблему и рестартанул веб-сервер и сендмейл. Сейчас вот полтора часа разбирался в сути проблемы и разобрался. Оказывается, все дело в моем личном емейле. Ну и плюс логическая ошибка в методе modUser::sendMail(). Ошибка заключалась в том, что если отправка письма выполняется с ошибкой, то метод возвращает false, не доходя до очистки списка получателей. Вот эти строчки: if ($this->xpdo->mail->send() == false) { return false; } $this->xpdo->mail->reset(); return true; Как видите, в случае ошибки $this->xpdo->mail->reset() просто не может выполниться. А раз список не очищается, в нем присутствует и мой злополучный емейл. А это значит, что при следующей попытке отправить письмо (точнее письма) phpMailer опять вернет ошибку (хотя всем, кроме меня он письма отправит успешно), ну и так далее в цикле. Конечно же это бага, и пуллреквест я отправил https://github.com/modxcms/revolution/pull/11931/files Так а в чем косяк моего емейла? В чем он виноват? А вот это вообще отдельная история :) Дело в том, что домен modxclub.ru привязан к серверу, на котором и размещается сайт modxclub.ru (что вполне логично). Так вот, при попытке отправки письма сервер определял, что он сам и является машиной-получателем, а не на гугл надо слать, где на самом деле почта и располагается. И он такой шлет запрос-отправку на локалхост, но шлет он для info@. А инфо (как и любой другой ящик) - это пользователь. И он такой спрашивает "а есть такой пользователь info?", на что система отвечает "нет, такого пользователя нет", и веб-сервер такой "а, ну тогда я не могу письмо доставить", и phpMailer возвращает false. Ну а все остальное я описал выше :) Вот такая веселая бага)))
Сегодня была написана и введена на сайте система емейл-уведомлений о новых комментариях в топиках. Уведомления четырех типов: Если это ответ на чужой комментарий, то отправляется уведомление автору родительского комментария. Затем отправляется уведомление автору топика, если он не был автором родительского комментария. Затем всем участникам дискуссии в этом топике. И напоследок администрации. Сам собой один пользователь получит только одно письмо по приоритету события. Правда предстоит еще написать личные настройки пользователей, где каждый мог бы указать какие уведомления он хочет получать, а какие нет. Постараемся написать это как можно быстрее. Когда это реализуем, введем и механизм уведомлений на новые топики (сейчас он не запущен, так как это слишком глобальный спам-охват). Вот примерная логическая схема: https://www.lucidchart.com/documents/view/4f91f952-779b-4c62-beeb-ee6210a22ad6 А вот часть кода в процессоре создания комментария, которая как раз и отвечает за этот механизм. Если у опытных MODX-разработчиков не возникнет никаких вопросов по коду на предмет необычности, я этого не пойму;) <?php public function afterSave(){ $comment = $this->modx->getObject('SocietyComment', $this->object->comment_id); $topic = $this->modx->getObject($this->object->target_class, $this->object->target_id);
if(empty($this->modx->smarty)){
$this->modx->invokeEvent('OnHandleRequest');
}
$this->modx->smarty->assign('topic',
$topic->toArray());
$this->modx->smarty->assign('comment',
$comment->toArray());
$this->modx->smarty->assign('topic_url',
$this->modx->makeUrl($topic->id, '', '', 'full'));
/*
Рассылаем емейл-уведомления.
Схема: https://www.lucidchart.com/documents/view/4f91f952-779b-4c62-beeb-ee6210a22ad6
*/
// Кому уже отправлялось, чтобы не отправлять повторно
// Сразу добавляем и того, кто пишет
$sended_to = array(
$this->modx->user->id,
);
// Не используем этот объект запроса, а только его клоны
$users_query = $this->modx->newQuery('modUser');
$users_query->innerJoin('modUserProfile', 'Profile');
$users_query->where(array(
"active" => 1,
"Profile.blocked" => 0,
));
$users_query->where(array(
"Profile.blockeduntil" => 0,
"OR:Profile.blockeduntil:<" => time(),
));
// Комментарий в ответ на другой комментарий?
if($parent = $comment->Parent){
// Автор комментария - автор родительского комментария?
if($parent->createdby != $this->modx->user->id){
// Если текущий пользователь не автор родительского комментария,
// то отслыаем уведомление об ответе на комментарий
if(
$ParentAuthor = $parent->Author
AND $ParentAuthor->active
AND !$ParentAuthor->Profile->blocked
){
$message = $this->modx->smarty->fetch('messages/society/new_comment/comment_reply.tpl');
$ParentAuthor->sendEmail($message, array(
"subject" => "Новый ответ на ваш комментарий",
));
$sended_to[] = $ParentAuthor->id;
$this->modx->mail->reset();
}
}
}
else{
}
// Отправляем уведомление автору топика о новом комментарии
$sended_to = array_unique($sended_to);
$q = clone($users_query);
$q->where(array(
"id" => $topic->createdby,
));
if($sended_to){
$q->where(array(
"id:not in" => $sended_to,
));
}
if($user = $this->modx->getObject('modUser', $q)){
$message = $this->modx->smarty->fetch('messages/society/new_comment/topic_author.tpl');
$user->sendEmail($message, array(
"subject" => "В вашем топике добавлен новый комментарий",
));
$sended_to[] = $user->id;
$this->modx->mail->reset();
}
// Отсылаем комментарии всем, кто в этом топике писал
// Получаем всех пользователей всех комментариев данной ветки
$sended_to = array_unique($sended_to);
$q = clone($users_query);
$q->innerJoin(
'SocietyComment',
"Comments",
"Comments.thread_id = {$comment->thread_id}
AND Comments.id != {$comment->id}
AND Comments.createdby = modUser.id"
);
if($sended_to){
$q->where(array(
"id:not in" => $sended_to,
));
}
if($users = $this->modx->getCollection('modUser', $q)){
foreach($users as $user){
$message = $this->modx->smarty->fetch('messages/society/new_comment/participants.tpl');
$user->sendEmail($message, array(
"subject" => "В топике добавлен новый комментарий",
));
$sended_to[] = $user->id;
$this->modx->mail->reset();
}
}
// Отсылаем уведомление администрации
$sended_to = array_unique($sended_to);
$q = clone($users_query);
$q->innerJoin('modUserGroupMember', 'UserGroupMembers');
$q->where(array(
"UserGroupMembers.user_group" => '1',
));
if($sended_to){
$q->where(array(
"id:not in" => $sended_to,
));
}
if($users = $this->modx->getCollection('modUser', $q)){
foreach($users as $user){
$message = $this->modx->smarty->fetch('messages/society/new_comment/administration.tpl');
$user->sendEmail($message, array(
"subject" => "В топике добавлен новый комментарий",
));
$sended_to[] = $user->id;
$this->modx->mail->reset();
}
}
return parent::afterSave();
}
Уже отчаялся повторить эту ошибку. Гнал по несколько емейлов на свои ящики, и все шло ОК, то есть без кучи копий в адресатах. Вроде тот же самый скрипт, а ошибки нет... И тут меня осенило! Я все письма гнал на разные ящики, но одного домена. А что если на разные? Добавил в список получателей емейл с другим доменом. И вот тут ошибка и проявилась))) Чуть позже более предметно ее изучу, разберусь в чем проблема и отпишусь.
Блин, я думал у меня только кнопки Редактировать :) (на самом деле у меня еще и Скрыть и Удалить, но они тоже пока не работают). Забыл что авторам комментов эта кнопка тоже выводится. Скрыл пока. Появится позже, когда заработает.
Николай! кстати не работает "Редактировать" только "Ответить" норм, хочу добавить ничего не происходит, ну это так мелкий баг.. В тему редизайна, концепций, и прочих измышлений (всё-таки тема по-любому требует пристального взгляда так или иначе), вот из свежего про редизайн вКонтакте на хабре статья небольшая
Вот я не сразу заметил, а мне никто не сказал, что на сайте страница создания топиков не была доступна просто зарегистрировавшимся пользователям, а только полноценным членам Клуба. Видимо тот, кто заметил, посчитал что так и надо, что просто не ввели функционал. Нет, это просто я политики не перепроверил. Сейчас все поправил, и теперь авторизованным пользователям в главном меню виден пункт "Написать". Вот там и создаем свои новые топики, то есть задаем вопросы, делимся опытом и т.п.
Да это понятно конечно)) я в русле такого минимального набора изменений и отписался собственно)) согласен конечно, что это все в конечной стадии доработать можно. )