View source
<?php
namespace Drupal\smart_date_recur\Form;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\PrependCommand;
use Drupal\Core\Ajax\RemoveCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\field\Entity\FieldConfig;
use Drupal\smart_date\Plugin\Field\FieldWidget\SmartDateWidgetBase;
use Drupal\smart_date_recur\Controller\Instances;
use Drupal\smart_date_recur\Entity\SmartDateOverride;
class SmartDateOverrideForm extends FormBase {
public function getFormId() {
return 'smart_date_override_form';
}
public function buildForm(array $form, FormStateInterface $form_state, $rrule = NULL, $index = NULL, $ajax = FALSE) {
$instances = $rrule
->getRuleInstances();
if ($ajax) {
$form['#prefix'] = '<div id="manage-instances">';
$form['#suffix'] = '</div>';
}
$field_config = FieldConfig::loadByName($rrule
->get('entity_type')
->getString(), $rrule
->get('bundle')
->getString(), $rrule
->get('field_name')
->getString());
$defaults = $field_config
->getDefaultValueLiteral()[0];
$values['start'] = DrupalDateTime::createFromTimestamp($instances[$index]['value']);
$values['end'] = DrupalDateTime::createFromTimestamp($instances[$index]['end_value']);
$values['duration'] = ($instances[$index]['end_value'] - $instances[$index]['value']) / 60;
$element = [
'value' => [
'#type' => 'datetime',
],
];
SmartDateWidgetBase::createWidget($element, $values, $defaults);
$element['#attributes']['class'][] = 'field--type-smartdate';
$form['override'] = $element;
$form['#attached']['library'][] = 'smart_date/smart_date';
$form['rrule'] = [
'#type' => 'hidden',
'#value' => $rrule
->id(),
];
$form['rrule_index'] = [
'#type' => 'hidden',
'#value' => $index,
];
if (!empty($instances[$index]['oid'])) {
$form['oid'] = [
'#type' => 'hidden',
'#value' => $instances[$index]['oid'],
];
}
if ($ajax) {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save'),
'#button_type' => 'primary',
'#ajax' => [
'callback' => '::ajaxSubmit',
],
];
$cancelurl = new Url('smart_date_recur.instances', [
'rrule' => (int) $rrule
->id(),
'modal' => TRUE,
]);
$form['ajaxcancel'] = [
'#type' => 'link',
'#title' => $this
->t('Cancel'),
'#attributes' => [
'class' => [
'button',
'use-ajax',
],
],
'#url' => $cancelurl,
'#cache' => [
'contexts' => [
'url.query_args:destination',
],
],
];
}
else {
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save'),
'#button_type' => 'primary',
];
}
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function ajaxSubmit(array &$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$status_messages = [
'#type' => 'status_messages',
];
$messages = \Drupal::service('renderer')
->renderRoot($status_messages);
if (!empty($messages)) {
$response
->addCommand(new RemoveCommand('.messages-list'));
$response
->addCommand(new PrependCommand('#manage-instances', $messages));
return $response;
}
$form_state
->disableRedirect();
$entityTypeManager = \Drupal::service('entity_type.manager');
$rrule = $entityTypeManager
->getStorage('smart_date_rule')
->load($form_state
->getValue('rrule'));
$instanceController = new Instances();
$instanceController
->setSmartDateRule($rrule);
$instanceController
->setUseAjax(TRUE);
$instanceController
->setUpdateButton(FALSE);
$response = new AjaxResponse();
$response
->addCommand(new ReplaceCommand('#manage-instances', $instanceController
->listInstancesOutput()));
return $response;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$this
->override($form_state);
$form_state
->setRedirect('smart_date_recur.instances', [
'rrule' => $form_state
->getValue('rrule'),
]);
}
protected function override(FormStateInterface $form_state) {
if (!empty($form_state
->getValue('oid'))) {
$override = SmartDateOverride::load($form_state
->getValue('oid'));
$override
->set('value', $form_state
->getValue('value')
->getTimestamp());
$override
->set('end_value', $form_state
->getValue('end_value')
->getTimestamp());
$override
->set('duration', $form_state
->getValue('duration'));
}
else {
$values = [
'rrule' => $form_state
->getValue('rrule'),
'rrule_index' => $form_state
->getValue('rrule_index'),
'value' => $form_state
->getValue('value')
->getTimestamp(),
'end_value' => $form_state
->getValue('end_value')
->getTimestamp(),
'duration' => $form_state
->getValue('duration'),
];
$override = SmartDateOverride::create($values);
}
$override
->save();
}
}