View source
<?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;
class ExtendMerciLineItem extends ConfigurableActionBase implements ContainerFactoryPluginInterface {
use ViewsBulkOperationsFormTrait;
protected $tempStoreFactory;
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;
}
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);
}
protected function currentUser() {
return $this->currentUser;
}
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();
}
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;
}
public function defaultConfiguration() {
return [
'extend_interval' => '+1 days',
];
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
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;
}
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();
}
}
public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
$access = $object
->access('update', $account, TRUE);
return $return_as_object ? $access : $access
->isAllowed();
}
}