contacts_events-8.x-1.x-dev/modules/accommodation/src/Plugin/Commerce/CheckoutPane/BookingCampingPane.php
modules/accommodation/src/Plugin/Commerce/CheckoutPane/BookingCampingPane.php
<?php
namespace Drupal\contacts_events_accommodation\Plugin\Commerce\CheckoutPane;
use Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface;
use Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CheckoutPaneBase;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\contacts_events_accommodation\AccommodationHelper;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\inline_entity_form\ElementSubmit;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides the camping pane.
*
* @CommerceCheckoutPane(
* id = "booking_accom_camping",
* label = @Translation("Camping"),
* default_step = "accommodation",
* wrapper_element = "container",
* review_link = @Translation("Manage accommodation")
* )
*/
class BookingCampingPane extends CheckoutPaneBase {
/**
* The accommodation helper service.
*
* @var \Drupal\contacts_events_accommodation\AccommodationHelper
*/
protected $accommodationHelper;
/**
* Constructs a new BookingCampingPane object.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface $checkout_flow
* The parent checkout flow.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\contacts_events_accommodation\AccommodationHelper $accommodation_helper
* The accommodation helper.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, CheckoutFlowInterface $checkout_flow, EntityTypeManagerInterface $entity_type_manager, AccommodationHelper $accommodation_helper) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $checkout_flow, $entity_type_manager);
$this->accommodationHelper = $accommodation_helper;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, CheckoutFlowInterface $checkout_flow = NULL) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$checkout_flow,
$container->get('entity_type.manager'),
$container->get('contacts_events_accommodation.helper')
);
}
/**
* {@inheritdoc}
*/
public function isVisible() {
/** @var \Drupal\contacts_events\Entity\EventInterface $event */
$event = $this->order->get('event')->entity;
// Not visible if there is no accommodation field.
if (!$event->hasField('accommodation_types')) {
return FALSE;
}
// Visible if camping accommodation is enabled.
foreach ($event->get('accommodation_types')->getValue() as $item) {
if ($item['target_id'] == 'camping') {
return TRUE;
}
}
// Otherwise not visible.
return FALSE;
}
/**
* {@inheritdoc}
*/
public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) {
$pane_form['camping'] = [
'#type' => 'inline_entity_form',
'#entity_type' => 'commerce_order',
'#default_value' => $this->order,
'#form_mode' => 'booking_accom_camping',
'#save_entity' => FALSE,
];
return $pane_form;
}
/**
* {@inheritdoc}
*/
public function buildPaneSummary() {
$content = [];
$content['camping'] = [
'#type' => 'table',
'#header' => [
'type' => $this->t('Type'),
'quantity' => $this->t('Quantity'),
],
'#rows' => [],
'#empty' => $this->t("You haven't chosen any accommodation yet."),
];
$event = $this->order->get('event')->entity;
$accommodations = $this->accommodationHelper
->getAccommodation($event, 'camping', FALSE);
$quantities = $this->accommodationHelper
->getBookingHelper($this->order->get('order_items'))
->getAllAccommodation();
$marker = '*';
$has_any_unconfirmed = FALSE;
foreach ($accommodations as $id => $accommodation) {
if (isset($quantities[$id])) {
$has_unconfirmed = $quantities[$id]['total'] != $quantities[$id]['confirmed'];
if ($has_unconfirmed) {
$has_any_unconfirmed = TRUE;
}
$content['camping']['#rows'][$id] = [
'type' => $accommodation->label(),
'quantity' => new FormattableMarkup('@quantity@marker', [
'@quantity' => $quantities[$id]['total'],
'@marker' => $has_unconfirmed ? $marker : '',
]),
];
}
}
if ($has_any_unconfirmed) {
$content['camping_note'] = [
'#type' => 'html_tag',
'#tag' => 'p',
'#value' => $this->t('@marker Some of this accommodation are awaiting confirmation. Please review and make any required payment to confirm.', [
'@marker' => $marker,
]),
];
}
return $content;
}
/**
* {@inheritdoc}
*/
public function submitPaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
ElementSubmit::trigger($complete_form, $form_state);
if (isset($pane_form['#pane_submit'])) {
foreach ($pane_form['#pane_submit'] as $callback) {
call_user_func($callback, $complete_form, $form_state);
}
}
}
}
