public function ActivitySendEmailWorker::processItem in Open Social 10.3.x
Same name and namespace in other branches
- 8.9 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.2 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.3 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.4 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.5 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.6 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.7 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 8.8 modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 10.0.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 10.1.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
- 10.2.x modules/custom/activity_send/modules/activity_send_email/src/Plugin/QueueWorker/ActivitySendEmailWorker.php \Drupal\activity_send_email\Plugin\QueueWorker\ActivitySendEmailWorker::processItem()
Works on a single queue item.
Parameters
mixed $data: The data that was passed to \Drupal\Core\Queue\QueueInterface::createItem() when the item was queued.
Throws
\Drupal\Core\Queue\RequeueException Processing is not yet finished. This will allow another process to claim the item immediately.
\Exception A QueueWorker plugin may throw an exception to indicate there was a problem. The cron process will log the exception, and leave the item in the queue to be processed again later.
\Drupal\Core\Queue\SuspendQueueException More specifically, a SuspendQueueException should be thrown when a QueueWorker plugin is aware that the problem will affect all subsequent workers of its queue. For example, a callback that makes HTTP requests may find that the remote server is not responding. The cron process will behave as with a normal Exception, and in addition will not attempt to process further items from the current item's queue during the current cron run.
Overrides QueueWorkerInterface::processItem
See also
\Drupal\Core\Cron::processQueues()
File
- modules/
custom/ activity_send/ modules/ activity_send_email/ src/ Plugin/ QueueWorker/ ActivitySendEmailWorker.php, line 127
Class
- ActivitySendEmailWorker
- An activity send email worker.
Namespace
Drupal\activity_send_email\Plugin\QueueWorkerCode
public function processItem($data) {
// First make sure it's an actual Activity entity.
$activity_storage = $this->entityTypeManager
->getStorage('activity');
if (!empty($data['entity_id']) && ($activity = $activity_storage
->load($data['entity_id']))) {
// Check if activity related entity exist.
/** @var \Drupal\activity_creator\Entity\Activity $activity */
if (!$activity
->getRelatedEntity() instanceof EntityInterface) {
$activity
->delete();
$this->activityNotifications
->deleteNotificationsbyIds([
$activity
->id(),
]);
return;
}
// Is the website multilingual.
$is_multilingual = $this->languageManager
->isMultilingual();
if (empty($data['recipients'])) {
$recipients = array_column($activity->field_activity_recipient_user
->getValue(), 'target_id');
if (count($recipients) > 50) {
if ($is_multilingual) {
// We also want to send emails to users per language in a given
// frequency.
foreach ($languages = $this->languageManager
->getLanguages() as $language) {
$langcode = $language
->getId();
// Load all user by given language.
$user_ids_per_language = $this->database
->select('users_field_data', 'ufd')
->fields('ufd', [
'uid',
])
->condition('uid', $recipients, 'IN')
->condition('preferred_langcode', $langcode)
->execute()
->fetchAllKeyed(0, 0);
// Prepare the batch per language.
$this
->prepareBatch($data, $user_ids_per_language, $langcode);
}
}
else {
$this
->prepareBatch($data, $recipients);
}
// We split up in batches. We can stop processing this specific queue
// item.
return;
}
}
else {
$recipients = $data['recipients'];
}
if (!empty($recipients)) {
// Get Message Template id.
$message_storage = $this->entityTypeManager
->getStorage('message');
/** @var \Drupal\message\Entity\Message $message */
$message = $message_storage
->load($activity->field_activity_message->target_id);
$message_template_id = $message
->getTemplate()
->id();
// Prepare an array of all details required to process the item.
$parameters = [
'activity' => $activity,
'message' => $message,
'message_template_id' => $message_template_id,
];
// We want to give preference to users who have set notification
// settings as 'immediately'.
$email_frequencies = [
'immediately',
'daily',
'weekly',
'none',
];
// Let's store the users IDs which will be processed by the loop.
$processed_users = [];
foreach ($email_frequencies as $email_frequency) {
// Get the 'target recipients' of who have their 'email notification
// preference' matching to current $email_frequency.
if ($target_recipients = EmailActivityDestination::getSendEmailUsersIdsByFrequency($recipients, $message_template_id, $email_frequency)) {
// Update process users.
$processed_users = array_merge($processed_users, $target_recipients);
// We load all the target accounts.
$parameters['target_recipients'] = $target_recipients;
// We set the frequency of email.
$parameters['frequency'] = $email_frequency;
// If the batch has langcode.
if (!empty($data['langcode'])) {
$parameters['langcode'] = $data['langcode'];
}
// Send for further processing.
$this
->sendToFrequencyManager($parameters);
}
}
// There is possibility where the users have not saved their
// 'email notification preferences'. So, we check the difference
// between the processed user IDs and original recipients users IDs
// and send emails according to default 'frequency' set by site
// manager. If SM has also not set, take 'immediately' as frequency.
if ($remaining_users = array_diff($recipients, $processed_users)) {
// Grab the platform default "Email notification frequencies".
$template_frequencies = $this->swiftmailSettings
->get('template_frequencies') ?: [];
// Determine email frequency to use, defaults to immediately.
$parameters['frequency'] = $template_frequencies[$message_template_id] ?? FREQUENCY_IMMEDIATELY;
$parameters['target_recipients'] = $remaining_users;
$this
->sendToFrequencyManager($parameters);
}
}
}
}