View source
<?php
namespace Drupal\rng\Form;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\rng\EventManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormStateInterface;
class RegistrationForm extends ContentEntityForm {
protected $entity;
protected $eventManager;
public function setUp(EventManagerInterface $event_manager) {
$this->eventManager = $event_manager;
}
public static function create(ContainerInterface $container) {
$self = parent::create($container);
$self
->setup($container
->get('rng.event_manager'));
return $self;
}
public function form(array $form, FormStateInterface $form_state) {
$registration = $this
->getEntity();
$current_user = $this
->currentUser();
$event = $registration
->getEvent();
$event_meta = $this->eventManager
->getMeta($event);
$form = parent::form($form, $form_state);
if (!$registration
->isNew()) {
$form['#title'] = $this
->t('Edit Registration', [
'%event_label' => $event
->label(),
'%event_id' => $event
->id(),
'%registration_id' => $registration
->id(),
]);
}
$registrants = $registration
->getRegistrants();
$form['registrants_before'] = [
'#type' => 'value',
'#value' => $registrants,
];
$form['people'] = [
'#type' => 'details',
'#title' => $this
->t('People'),
'#description' => $this
->t('Select people to associate with this registration.'),
'#open' => TRUE,
'#tree' => TRUE,
];
$event_type = $event_meta
->getEventType();
$form['people']['registrants'] = [
'#type' => 'registrants',
'#event' => $event,
'#default_value' => $registrants,
'#allow_creation' => $event_meta
->getCreatableIdentityTypes(),
'#allow_reference' => $event_meta
->getIdentityTypes(),
'#registration' => $registration,
'#form_modes' => $event_type
->getIdentityTypeEntityFormModes(),
'#tree' => TRUE,
];
if (!$registration
->isNew()) {
$form['revision_information'] = [
'#type' => 'details',
'#title' => $this
->t('Revisions'),
'#optional' => TRUE,
'#open' => $current_user
->hasPermission('administer rng'),
'#weight' => 20,
];
$form['revision'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Create new revision'),
'#description' => $this
->t('Revisions record changes between saves.'),
'#default_value' => FALSE,
'#access' => $current_user
->hasPermission('administer rng'),
'#group' => 'revision_information',
];
}
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$registration = parent::validateForm($form, $form_state);
$registrants_before = $form_state
->getValue('registrants_before');
$registrants_after = $form_state
->getValue([
'people',
'registrants',
]);
$registrants_after_ids = [];
foreach ($registrants_after as $registrant) {
if (!$registrant
->isNew()) {
$registrants_after_ids[] = $registrant
->id();
}
}
$registrants_delete = [];
foreach ($registrants_before as $i => $registrant) {
if (!$registrant
->isNew()) {
if (!in_array($registrant
->id(), $registrants_after_ids)) {
$registrants_delete[] = $registrant;
}
}
}
$form_state
->set('registrants_after', $registrants_after);
$form_state
->set('registrants_delete', $registrants_delete);
return $registration;
}
public function save(array $form, FormStateInterface $form_state) {
$registration = $this->entity;
$t_args = [
'@type' => $registration
->bundle(),
'%label' => $registration
->label(),
'%id' => $registration
->id(),
];
if (!$registration
->isNew()) {
$registration
->setNewRevision(!$form_state
->isValueEmpty('revision'));
}
if ($registration
->save() == SAVED_NEW) {
$this
->messenger()
->addMessage($this
->t('Registration has been created.', $t_args));
}
else {
$this
->messenger()
->addMessage($this
->t('Registration was updated.', $t_args));
}
$registrants = $form_state
->get('registrants_after');
foreach ($registrants as $registrant) {
$registrant
->setRegistration($registration);
$registrant
->save();
}
$registrants_delete = $form_state
->get('registrants_delete');
foreach ($registrants_delete as $registrant) {
$registrant
->delete();
}
$event = $registration
->getEvent();
if ($registration
->access('view')) {
$form_state
->setRedirectUrl($registration
->toUrl());
}
else {
$form_state
->setRedirectUrl($event
->toUrl());
}
}
}