pino-8.x-1.2-no-core/modules/member_mailer/src/Form/MailMembersForm.php
modules/member_mailer/src/Form/MailMembersForm.php
<?php
namespace Drupal\member_mailer\Form;
use Drupal\taxonomy\Entity\Term;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\ConfirmFormBase;
use Drupal\Core\Url;
/**
* Form for mailing members.
*/
class MailMembersForm extends ConfirmFormBase {
protected $step = 1;
protected $data = [];
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'mail_members_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// For step 2, display the confirmation form.
if ($this->step == 2) {
return parent::buildForm($form, $form_state);
}
$receivers_options = [
'active' => t('Active members'),
'all' => t('All members (including inactive)'),
];
$tids = \Drupal::EntityQuery('taxonomy_term')
->condition('vid', 'positions')
->execute();
$terms = Term::loadMultiple($tids);
foreach ($terms as $term) {
$receivers_options['tid_' . $term->id()] = t('Active members with position:') . ' ' . $term->getName();
}
$form['receivers'] = [
'#type' => 'select',
'#title' => t('Receivers'),
'#required' => TRUE,
'#options' => $receivers_options,
];
$form['from'] = [
'#type' => 'email',
'#title' => t('From address'),
'#default_value' => \Drupal::currentUser()->getEmail(),
'#required' => TRUE,
];
$form['subject'] = [
'#required' => TRUE,
'#type' => 'textfield',
'#title' => t('Subject'),
];
$form['message'] = [
'#required' => TRUE,
'#type' => 'textarea',
'#title' => t('Message'),
];
$form['send'] = [
'#type' => 'submit',
'#value' => t('Send'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
// Step 2 requires no validation.
if ($this->step == 2) {
return;
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// In step 1, rebuild the form, save the values and set the step to 2.
if ($this->step == 1) {
$form_state->setRebuild();
$this->step = 2;
$this->data = $form_state->getValues();
return;
}
// This is step 2, process the data and create a batch.
switch (TRUE) {
case strstr($this->data['receivers'], 'active'):
$members = \Drupal::EntityQuery('member')
->condition('field_is_active', 1)
->execute();
break;
case strstr($this->data['receivers'], 'all'):
$members = \Drupal::EntityQuery('member')
->execute();
break;
case strstr($this->data['receivers'], 'tid_'):
$tid = str_replace("tid_", "", $this->data['receivers']);
$members = \Drupal::EntityQuery('member')
->condition('field_is_active', 1)
->condition('field_position', $tid)
->execute();
break;
}
$operations = [];
foreach ($members as $member) {
$operations[] = [
'member_mailer_batch_send', [
$member,
$this->data['subject'],
$this->data['message'],
$this->data['from'],
],
];
}
$batch = [
'title' => t('Sending mail to members'),
'operations' => $operations,
'finished' => 'member_mailer_batch_send_finished',
'init_message' => t('Starting to send mail to members.'),
'progress_message' => t('Processed @current out of @total. Estimated time: @estimate.'),
'error_message' => t('The mailing process has encountered an error.'),
'file' => drupal_get_path('module', 'member_mailer') . '/member_mailer.batch.inc',
];
batch_set($batch);
}
/**
* {@inheritdoc}
*/
public function getCancelUrl() {
return new Url('member_mailer.form');
}
/**
* {@inheritdoc}
*/
public function getQuestion() {
switch (TRUE) {
case strstr($this->data['receivers'], 'active'):
$member_count = \Drupal::EntityQuery('member')
->condition('field_is_active', 1)
->count()
->execute();
break;
case strstr($this->data['receivers'], 'all'):
$member_count = \Drupal::EntityQuery('member')
->count()
->execute();
break;
case strstr($this->data['receivers'], 'tid_'):
$tid = str_replace("tid_", "", $this->data['receivers']);
$member_count = \Drupal::EntityQuery('member')
->condition('field_is_active', 1)
->condition('field_position', $tid)
->count()
->execute();
break;
}
return t('Are you sure you want to send the mail %subject to %members members?', [
'%subject' => $this->data['subject'],
'%members' => $member_count,
]);
}
}
