You are here

CurrentTime.php in RNG - Events and Registrations 3.x

File

src/Plugin/Condition/CurrentTime.php
View source
<?php

namespace Drupal\rng\Plugin\Condition;

use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;

/**
 * Evaluates if the current date is before or after the the configured date.
 *
 * @Condition(
 *   id = "rng_current_time",
 *   label = @Translation("Current time")
 * )
 */
class CurrentTime extends ConditionPluginBase {

  /**
   * {@inheritdoc}
   *
   * @return array
   *   - date: int: Unix timestamp of a date the rule can be triggered, as a
   *     minimum. This value is canonical, the rng_rule_schedule date is a
   *     mirror and is reflected when this condition is saved.
   *   - negate: boolean: If TRUE, this condition will evaluate if current time
   *     is after $date. If FALSE, before $date.
   */
  public function defaultConfiguration() {
    return [
      'date' => NULL,
      'enable' => FALSE,
    ] + parent::defaultConfiguration();
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    if (is_numeric($this->configuration['date'])) {
      $date = DrupalDateTime::createFromTimestamp($this
        ->getDate());
    }
    else {
      $date = new DrupalDateTime();
    }

    // Add administrative comment publishing options.
    $form['date'] = [
      '#type' => 'datetime',
      '#date_date_element' => 'date',
      '#title' => $this
        ->t('Date'),
      '#default_value' => $date,
      '#size' => 20,
      '#weight' => 50,
    ];
    $form['enable'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Enable this condition?'),
      '#default_value' => $this
        ->getConfiguration()['enable'],
    ];
    $form['negate'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Timing'),
      '#description' => $this
        ->t('Condition will be true if the time when evaluating this condition is before or after the date.'),
      '#options' => [
        0 => $this
          ->t('After this date'),
        1 => $this
          ->t('Before this date'),
      ],
      '#default_value' => (int) $this
        ->isNegated(),
      '#weight' => 100,
    ];
    return $form;
  }

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

    // Disable saving this plugin if it is not actively enabled.
    $enabled = $form_state
      ->getValue('enable');
    if (!$enabled) {
      return;
    }
    $this
      ->setConfig('enable', $enabled);
    $this
      ->setConfig('date', $form_state
      ->getValue('date')
      ->format('U'));
    parent::submitConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function summary() {
    $t_args = [
      '@date' => DrupalDateTime::createFromTimestamp($this
        ->getDate()),
    ];
    if (!$this
      ->isNegated()) {
      return $this
        ->t('Current date is after @date', $t_args);
    }
    else {
      return $this
        ->t('Current date is before @date', $t_args);
    }
  }

  /**
   * Gets the date in configuration.
   */
  public function getDate() {
    return $this->configuration['date'];
  }

  /**
   * Formats the date for display.
   */
  public function getDateFormatted() {
    return is_numeric($this
      ->getDate()) ? DrupalDateTime::createFromTimestamp($this
      ->getDate()) : $this
      ->t('Not configured');
  }

  /**
   * {@inheritdoc}
   */
  public function evaluate() {
    $date = $this
      ->getDate();
    if ($date && is_numeric($date)) {
      if (!$this
        ->isNegated()) {
        return time() > $date;
      }
      else {
        return time() < $date;
      }
    }
    return FALSE;
  }

}

Classes

Namesort descending Description
CurrentTime Evaluates if the current date is before or after the the configured date.