gentle_user_reminder-4.0.0/src/Form/ReminderForm.php

src/Form/ReminderForm.php
<?php

namespace Drupal\gentle_user_reminder\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\gentle_user_reminder\Entity\GentleUserReminder;
use Drupal\Core\Ajax\AfterCommand;
use Drupal\Core\Ajax\RemoveCommand;
use Drupal\Core\Ajax\RedirectCommand;

/**
 * Form controller for the gentle user reminder entity edit forms.
 */
class ReminderForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return "reminder_form";
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $user = NULL) {
    $userId = \Drupal::currentUser()->id();
    $form['verticaltabs'] = [
      '#type' => 'vertical_tabs',
    ];
    $form['reminder_set_form'] = [
      '#type' => 'details',
      '#title' => $this->t('Set a Reminder'),
      '#open' => TRUE,
      '#group' => 'verticaltabs',
    ];
    $form['reminder_set_form']["reminderform"] = [
      "#type" => "container",
      "#attributes" => [
        "class" => ["reminder-date-container"],
      ],
      "#prefix" => '<div class="reminder-functionality">',
      "#suffix" => "</div>",
    ];
    $form['reminder_set_form']['reminderform']['reminder_container'] = [
      '#type' => 'fieldset',
    ];
    $form['reminder_set_form']["reminderform"]['reminder_container']["description"] = [
      "#type" => "textarea",
      "#title" => $this->t("Reminder message"),
      "#description" => $this->t('Please add the following note of reminder.'),
      "#attributes" => [
        "class" => ["reminder-message"],
      ],
      "#prefix" => '<div class="nu-reminder-date-message">',
      "#suffix" => '</div><div class="reminder-message-button"></div>',
    ];
    $form['reminder_set_form']["reminderform"]['reminder_container']["send_email"] = [
      "#type" => "textarea",
      "#title" => $this->t("Send Email To"),
      "#description" => $this->t("Enter the email address you wish to use to send a reminder here. Enter the email addresses using comma separation if you wish to send multiple emails."),
      "#attributes" => [
        "class" => ["reminder-email-message"],
      ],
      "#prefix" => '<div class="nu-reminder-email-message">',
      "#suffix" => '</div><div class="reminder-send-button"></div>',
    ];
    $form['reminder_set_form']["reminderform"]['reminder_container']["interval"] = [
      "#type" => "radios",
      "#title" => t("Reminder Interval on"),
      "#description" => $this->t('Schedule the reminder at particular intervals. Select from the choices below.'),
      "#default_value" => "Daily Basis",
      "#options" => [
        "Daily Basis" => "Daily Basis",
        "Weekly Basis" => "Weekly Basis",
        "Monthly Basis" => "Monthly Basis",
        "On Selected Date" => "On Selected Date",
      ],
    ];
    $form['reminder_set_form']["reminderform"]['interval_container']["date"] = [
      "#type" => "date",
      "#states" => [
        "visible" => [
          ':input[name="interval"]' => ['value' => 'On Selected Date'],
        ],
      ],
      "#title" => $this->t("Set an email reminder for:"),
      "#attributes" => [
        "class" => ["reminder-date"],
      ],
      "#prefix" => '<div class="nu-reminder-date">',
      "#suffix" => '</div><div class="reminder-button"></div>',
    ];
    $form['reminder_set_form']["reminderform"]["actions"] = [
      "#type" => "actions",
      "#attributes" => [
        "class" => ["btn-wrapper"],
      ],
    ];
    $form['reminder_set_form']["reminderform"]["actions"]["reminder"] = [
      "#type" => "submit",
      "#value" => $this->t("Set a Reminder"),
      "#attributes" => [
        "class" => ["btn", "reminder-date-btn"],
      ],
      "#ajax" => [
        "callback" => [$this, "reminderFormAjaxSelectorCallback"],
        "event" => "click",
        "progress" => [
          "type" => "throbber",
          "message" => NULL,
        ],
      ],
    ];
    $form['reminder_list'] = [
      '#type' => 'details',
      '#title' => $this->t('Reminder Entries'),
      '#open' => FALSE,
      '#group' => 'verticaltabs',
    ];
    $form['reminder_list']['view'] = [
      '#type' => 'view',
      '#name' => 'reminder_entries',
      '#display_id' => 'page_1',
      '#arguments' => [
        $userId,
      ],
    ];
    $form["#attached"]["library"][] = "core/drupal.dialog.ajax";
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $reminderDesc = $form_state->getValue("description");
    if (!$reminderDesc) {
      $form_state->setErrorByName('description', $this->t('Please add the reminder message.'));
    }
    $sendEmail = trim($form_state->getValue("send_email"));
    if (!$sendEmail) {
      $form_state->setErrorByName('send_email', $this->t('Please fill in email.'));
    }
    elseif (!\Drupal::service('email.validator')->isValid($sendEmail)) {
      $form_state->setErrorByName('send_email', $this->t('Please provide a valid Email address.'));
    }
    $reminderDate = $form_state->getValue("date");
    $interval = $form_state->getValue("interval");
    if ($interval == 'On Selected Date') {
      if (!$reminderDate || $reminderDate == "undefined") {
        $form_state->setErrorByName('date', $this->t('Please set the reminder date.'));
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

  }

  /**
   * {@inheritdoc}
   */
  public function reminderFormAjaxSelectorCallback(&$form, &$form_state) {
    $response = new AjaxResponse();
    $response->addCommand(new RemoveCommand('.form-item--error-message'));
    $response->addCommand(new InvokeCommand('.form-textarea', 'removeClass', ['error']));
    $response->addCommand(new InvokeCommand('.form-date', 'removeClass', ['error']));
    if ($form_state->hasAnyErrors()) {
      $errors = $form_state->getErrors();
      foreach ($errors as $key => $value) {
        $key = str_replace('_', '-', $key);
        $elemId = '#edit-' . str_replace('][', '-', $key);
        $elemError = '<div class="form-item--error-message"><b>' . $value . '</b></div>';
        $response->addCommand(new InvokeCommand($elemId, 'addClass', ['error']));
        $response->addCommand(new AfterCommand($elemId, $elemError));
      }
    }
    else {
      $reminderDate = $form_state->getValue("date");
      $reminderDesc = $form_state->getValue("description");
      $userId = \Drupal::currentUser()->id();
      $interval = $form_state->getValue("interval");
      $sendEmail = $form_state->getValue("send_email");
      $emailList = preg_replace('/[\r\n]+/', "\n", $sendEmail);
      $emailIds = explode("\n", $emailList);

      $emailTo = implode(",", $emailIds);

      if (isset($interval) && !empty($interval)) {
        if ($interval == 'Daily Basis') {
          $reminderDate = date("Y-m-d", strtotime("+1 day"));
        }
        elseif ($interval == 'Weekly Basis') {
          $reminderDate = date("Y-m-d", strtotime("+1 week"));
        }
        elseif ($interval == 'Monthly Basis') {
          $reminderDate = date("Y-m-d", strtotime("+1 month"));
        }
        elseif ($interval == 'On Selected Date') {
          if (isset($reminderDate) && !empty($reminderDate)) {
            $reminderDate = $reminderDate;
          }
        }
      }
      if (isset($reminderDesc) && !empty($reminderDesc) && isset($emailTo) && !empty($emailTo)) {
        \Drupal::messenger()->addStatus(t('All done - look out for our reminder email!.<br>You will receive an email with a reminder in your inbox.'));
        $current_path = \Drupal::service('path.current')->getPath();
        $response->addCommand(new RedirectCommand($current_path));
      }
      /* Create the entity. */
      $entity = GentleUserReminder::create([
        "type" => "gentle_user_reminder",
        "date" => $reminderDate ?? '',
        "description" => $reminderDesc ?? '',
        "interval" => $interval ?? '',
        "email" => $emailTo ?? '',
        "status" => 0,
      ]);
      /* Save the entity */
      $entity->save();
    }
    return $response;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc