Я разрабатываю форум на основе Drupal и использую модули стека сообщений в сочетании с измененной версией этого пользовательского модуля. https://github.com/Lullabot/message_integration
Идея состоит в том, что все пользователи получают электронное письмо, когда публикуется новая ветка, но только пользователи, подписавшиеся на ветку, получают уведомление о комментариях, оставленных в этой ветке.
Часть, где люди получают электронные письма для новых тем, работает, но когда оставлен комментарий, все пользователи также получают уведомление по электронной почте об этом. На данный момент я не могу сказать, связана ли проблема с пользовательским модулем или с подпиской на сообщения. Я включил отладку, но я не вижу никаких сообщений о том, что он решает, кому и не отправлять электронные письма, просто он готовит сообщение и отправляет его.
Мой пользовательский модуль ничем не отличается от того, что настроил Lullabot.
Это код, который создает список подписчиков:
функция message_integration_subscribe_options_comment() {
$query = \Drupal::entityQuery('пользователь')
->условие('статус', 1);
$query->condition('uid', [0, 1], 'НЕ ВНУТРИ');
$subscribe_uids = $query->execute();
$notifiers = ['электронная почта'];
$subscribe_options = [
'уведомить владельца сообщения' => FALSE,
'уиды' => [],
];
foreach ($subscribe_uids как $uid) {
$subscribe_options['uids'][$uid] = new DeliveryCandidate([], $notifiers, $uid);
}
вернуть $subscribe_options;
}
И вот код, когда комментарий оставлен:
функция message_integration_comment_insert (комментарий $ комментарий) {
// Посмотрим, следует ли пропустить эту обработку.
$config = \Drupal::config('message_integration.settings');
$skip = $config->get('skip');
если (! пусто ($ пропустить)) {
возвращаться;
}
$node = $comment->get('entity_id')->first()->get('entity')->getTarget()->getValue();
если (!in_array($node->bundle(), MESSAGE_INTEGRATION_CONTENT_TYPES)) {
возвращаться;
}
// Создать сообщение.
$сообщение = Сообщение::создать([
'шаблон' => 'создать_комментарий',
'uid' => $node->getOwnerId(),
]);
$message->set('field_comment_reference', $comment);
$message->set('field_published', $comment->isPublished());
$сообщение->сохранить();
// Поставить сообщения в очередь, чтобы уведомить всех подписчиков узла о новом комментарии.
$subscribers = \Drupal::service('message_subscribe.subscribers');
// Создайте собственный список подписчиков, чтобы уведомить всех активных пользователей.
// Это конец обычной системы подписки на флаги, так как мы
// не нужно подписывать каждого пользователя на каждую часть контента.
$subscribe_options = message_integration_subscribe_options_comment();
$options = $subscribe_options;
foreach ($subscribe_options['uids'] as $uid => $values) {
$options['uids'] = [$uid => $values];
$subscribers->sendMessage($node, $message, [], $options);
}
}
Я ходил по кругу и рвал на себе волосы, поэтому любая помощь будет оценена по достоинству.