contacts_events-8.x-1.x-dev/modules/accommodation/src/EventSubscriber/BookingCompletionValidationSubscriber.php
modules/accommodation/src/EventSubscriber/BookingCompletionValidationSubscriber.php
<?php
namespace Drupal\contacts_events_accommodation\EventSubscriber;
use Drupal\contacts_events\Event\BookingCompletionValidationEvent;
use Drupal\contacts_events_accommodation\AccommodationHelper;
use Drupal\Core\StringTranslation\PluralTranslatableMarkup;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Subscriber for booking completion validation.
*/
class BookingCompletionValidationSubscriber implements EventSubscriberInterface {
/**
* The accommodation helper service.
*
* @var \Drupal\contacts_events_accommodation\AccommodationHelper
*/
protected $accommodationHelper;
/**
* Construct the subscriber.
*
* @param \Drupal\contacts_events_accommodation\AccommodationHelper $accommodation_helper
* The accommodation helper service.
*/
public function __construct(AccommodationHelper $accommodation_helper) {
$this->accommodationHelper = $accommodation_helper;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[BookingCompletionValidationEvent::NAME][] = 'validateAccommodation';
return $events;
}
/**
* Validate accommodation totals.
*
* @param \Drupal\contacts_events\Event\BookingCompletionValidationEvent $event
* The validation event.
*/
public function validateAccommodation(BookingCompletionValidationEvent $event) {
$booking_helper = $this->accommodationHelper->getBookingHelper($event->getOrder()->get('order_items'));
$total_delegates = $booking_helper->getTotalDelegates();
$accommodation = $booking_helper->getAllAccommodation();
array_walk($accommodation, function (&$quantity, $key) {
$quantity = $quantity['total'];
});
$result = $this->accommodationHelper->validateAccommodationTotal($total_delegates, $accommodation);
switch ($result) {
case AccommodationHelper::VALIDATE_OK:
// No error, so nothing to do.
break;
case AccommodationHelper::VALIDATE_TOO_LITTLE:
$error = new TranslatableMarkup('It looks like you have not selected enough accommodation for the @count you are booking for.', [
'@count' => new PluralTranslatableMarkup($total_delegates, 'delegate', '@count delegates'),
]);
break;
case AccommodationHelper::VALIDATE_TOO_MUCH:
$error = new TranslatableMarkup('It looks like you have selected too much accommodation for the @count you are booking for.', [
'@count' => new PluralTranslatableMarkup($total_delegates, 'delegate', '@count delegates'),
]);
break;
default:
$error = new TranslatableMarkup('Sorry, we encountered an unknown error.');
break;
}
if (isset($error)) {
$event->addSoftError($error);
}
}
}
