merci-8.x-2.x-dev/modules/merci_line_item/src/Plugin/Action/ExtendMerciLineItem.php

modules/merci_line_item/src/Plugin/Action/ExtendMerciLineItem.php
<?php

namespace Drupal\merci_line_item\Plugin\Action;

use Drupal\Core\Entity\DependencyTrait;
use Drupal\Core\Action\ConfigurableActionBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Action\ActionBase;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\user\PrivateTempStoreFactory;
use Drupal\views_bulk_operations\Form\ViewsBulkOperationsFormTrait;

/**
 * Promotes a merci_line_item.
 *
 * @Action(
 *   id = "merci_line_item_extend_action",
 *   label = @Translation("Extend item."),
 *   type = "merci_line_item"
 * )
 */
class ExtendMerciLineItem extends ConfigurableActionBase implements ContainerFactoryPluginInterface {


  use ViewsBulkOperationsFormTrait;
  /**
   * User private temporary storage factory.
   *
   * @var \Drupal\user\PrivateTempStoreFactory
   */
  protected $tempStoreFactory;

  /**
   * The current user object.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  use DependencyTrait;

  public function __construct(PrivateTempStoreFactory $tempStoreFactory, AccountInterface $currentUser, array $configuration, $plugin_id, $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->tempStoreFactory = $tempStoreFactory;
    $this->currentUser = $currentUser;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $container->get('user.private_tempstore'),
      $container->get('current_user'),
      $configuration,
      $plugin_id,
      $plugin_definition
    );
  }

  /**
   * Gets the current user.
   *
   * @return \Drupal\Core\Session\AccountInterface
   *   The current user.
   */
  protected function currentUser() {
    return $this->currentUser;
  }

  /**
   * {@inheritdoc}
   */
  public function execute($entity = NULL) {
    $extend_interval = $this->configuration['extend_interval'];
    $date_field = 'merci_reservation_date';
    $end_date = new DrupalDateTime($entity->{$date_field}->getValue()[0]['end_value'] . ' ' . $extend_interval);
    $end_date_string = $end_date->format(DATETIME_DATETIME_STORAGE_FORMAT);
    $date = $entity->{$date_field}->getValue();
    $date[0]['end_value'] = $end_date_string;
    $entity->{$date_field}->setValue($date);
    $entity->save();
  }

  /**
   * {@inheritdoc}
   */
  public function buildPreConfigurationForm(array $form, array $values, FormStateInterface $form_state) {
    $form['validate_entities'] = [
      '#title' => $this->t('Validate before processing'),
      '#type' => 'checkbox',
      '#default_value' => isset($values['validate_entities']) ? $values['validate_entities'] : '',
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'extend_interval' => '+1 days',
    ];
  }

  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
  //    $form_state ->setErrorByName('extend_interval', t('Fix the errors or override validation.'));
  }

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

    $form_data = $form_state->get('views_bulk_operations');

    $form['extend_interval'] = [
      '#type' => 'textfield',
      '#title' => t('Default checkin date and time.'),
      '#default_value' => $this->configuration['extend_interval'],
      '#required' => TRUE,
    ];

    $validation_errors = $this->getTempstore($form_data['view_id'], $form_data['display_id'])->get('validation_errors');

    if ($validation_errors) {
      foreach ($validation_errors as $entity_id => $violations) {
        $label = $violations->getEntity()->label();
        drupal_set_message(t('Errors for %label', ['%label' => $label]));
        foreach ($violations as $violation) {
          drupal_set_message($violation->getMessage());
        }
      }
      $form['override_validation'] = [
        '#type' => 'checkbox',
        '#title' => t('Override Validation Errors'),
        '#default_value' => $form_state->getValue('override_validation'),
      ];
      $this->getTempstore($form_data['view_id'], $form_data['display_id'])->delete('validation_errors');
    }

    return $form;
  }


  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration['extend_interval'] = $form_state->getValue('extend_interval');
    $violations = array();
    if ($form_data = $form_state->get('views_bulk_operations') and $form_data['preconfiguration']['validate_entities'] and $form_state->getValue('override_validation') == FALSE) {
      $form_data = $form_state->get('views_bulk_operations');
      if (!$form_data) {
        return;
      }
      $entity_ids = array();
      foreach ($form_data['list'] as $item) {
        $entity_ids[] = $item[0];
      }
      $entities = \Drupal::entityTypeManager()->getStorage('merci_line_item')->loadMultiple($entity_ids);
      $extend_interval = $form_state->getValue('extend_interval');
      $date_field = 'merci_reservation_date';

      foreach ($entities as $entity) {
        $end_date = new DrupalDateTime($entity->{$date_field}->getValue()[0]['end_value'] . ' ' . $extend_interval);
        $end_date_string = $end_date->format(DATETIME_DATETIME_STORAGE_FORMAT);
        $date = $entity->{$date_field}->getValue();
        $date[0]['end_value'] = $end_date_string;
        $entity->{$date_field}->setValue($date);
        $violation = $entity->validate();
        if ($violation->has(0) == TRUE) {
          $violations[$entity->id()] = $violation;
        }
      }
    }
    if (count($violations)) {
      $this->getTempstore($form_data['view_id'], $form_data['display_id'])->set('validation_errors', $violations);
      $form_state->setRebuild();
    }
  }

  /**
   * {@inheritdoc}
   */
  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
    /** @var \Drupal\merci_line_item\NodeInterface $object */
    $access = $object->access('update', $account, TRUE);
    return $return_as_object ? $access : $access->isAllowed();
  }

}

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

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