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();
}
}
