acquia_commercemanager-8.x-1.122/modules/acm_customer/src/Plugin/CustomerPages/CustomerPagesBase.php
modules/acm_customer/src/Plugin/CustomerPages/CustomerPagesBase.php
<?php namespace Drupal\acm_customer\Plugin\CustomerPages; use Drupal\acm_cart\CartStorageInterface; use Drupal\acm\Connector\APIWrapperInterface; use Drupal\acm\Response\NeedsRedirectException; use Drupal\acm_customer\CustomerFormManager; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\acm\User\AccountProxyInterface; use Drupal\Core\Url; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides the base CustomerPages class. */ abstract class CustomerPagesBase extends PluginBase implements CustomerPagesInterface, ContainerFactoryPluginInterface { /** * The config factory object. * * @var \Drupal\Core\Config\ConfigFactoryInterface */ protected $configFactory; /** * The shopping cart. * * @var \Drupal\acm_cart\CartStorageInterface */ protected $cartStorage; /** * The api wrapper. * * @var \Drupal\acm\Connector\APIWrapperInterface */ protected $apiWrapper; /** * The commerce user manager. * * @var \Drupal\acm\User\AccountProxyInterface */ protected $commerceUserManager; /** * The customer form manager. * * @var \Drupal\acm_customer\CustomerFormManager */ protected $formManager; /** * The current page ID. * * @var string */ protected $pageId; /** * Static cache of visible pages. * * @var array */ protected $visiblePages = []; /** * The initialized child form plugins. * * @var \Drupal\acm_customer\Plugin\CustomerForm\CustomerFormInterface[] */ protected $childForms = []; /** * Constructor. * * @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\Core\Routing\RouteMatchInterface $route_match * The route match. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The factory for configuration objects. * @param \Drupal\acm_cart\CartStorageInterface $cart_storage * The cart storage. * @param \Drupal\acm\Connector\APIWrapperInterface $api_wrapper * The api wrapper. * @param \Drupal\acm\User\AccountProxyInterface $commerce_user_manager * The commerce user manager. * @param \Drupal\acm_customer\CustomerFormManager $form_manager * The customer form manager. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match, ConfigFactoryInterface $config_factory, CartStorageInterface $cart_storage, APIWrapperInterface $api_wrapper, AccountProxyInterface $commerce_user_manager, CustomerFormManager $form_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->setConfiguration($configuration); $this->configFactory = $config_factory; $this->cartStorage = $cart_storage; $this->apiWrapper = $api_wrapper; $this->commerceUserManager = $commerce_user_manager; $this->formManager = $form_manager; $this->pageId = $this->processPageId($route_match->getParameter('page')); } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('current_route_match'), $container->get('config.factory'), $container->get('acm_cart.cart_storage'), $container->get('acm.api'), $container->get('acm.commerce_user_manager'), $container->get('plugin.manager.acm_customer_form') ); } /** * Processes the requested page ID. * * @param string $page_id * The page ID. * * @return string * The processed page ID. */ protected function processPageId($page_id) { $page_ids = array_keys($this->getVisiblePages()); // Redirect to default page (first page) if no page or invalid page is // requested. if (empty($page_id) || !in_array($page_id, $page_ids)) { $page_id = reset($page_ids); } return $page_id; } /** * {@inheritdoc} */ public function getConfigFactory() { return $this->configFactory; } /** * {@inheritdoc} */ public function getCart() { return $this->cartStorage; } /** * {@inheritdoc} */ public function getApiWrapper() { return $this->apiWrapper; } /** * {@inheritdoc} */ public function getCommerceUserManager() { return $this->commerceUserManager; } /** * {@inheritdoc} */ public function getPageId() { return $this->pageId; } /** * {@inheritdoc} */ public function redirectToPage($page_id) { throw new NeedsRedirectException(Url::fromRoute('acm_customer.view_page', [ 'page' => $page_id, ])->toString()); } /** * {@inheritdoc} */ public function getVisiblePages() { if (!empty($this->visiblePages)) { return $this->visiblePages; } $pages = $this->getPages(); foreach ($pages as $page_id => $page) { // A page is visible if it has at least one visible form. $is_visible = FALSE; foreach ($this->getChildForms($page_id) as $form) { if ($form->isVisible()) { $is_visible = TRUE; break; } } // If page is not visible, remove it from the static cache. if (!$is_visible) { unset($pages[$page_id]); } } $this->visiblePages = $pages; return $this->visiblePages; } /** * {@inheritdoc} */ public function getChildForms($page_id = NULL) { if (empty($this->childForms)) { foreach ($this->formManager->getDefinitions() as $form_id => $form_definition) { $form_configuration = $this->getFormConfiguration($form_id); $form = $this->formManager->createInstance($form_id, $form_configuration, $this); $this->childForms[$form_id] = [ 'form' => $form, 'weight' => $form->getWeight(), ]; } // Sort the forms and flatten the array. uasort($this->childForms, ['\Drupal\Component\Utility\SortArray', 'sortByWeightElement']); $this->childForms = array_map(function ($form_data) { return $form_data['form']; }, $this->childForms); } $child_forms = $this->childForms; if ($page_id) { $child_forms = array_filter($child_forms, function ($child_form) use ($page_id) { /** @var \Drupal\acm_customer\Plugin\CustomerForm\CustomerFormInterface $child_form */ return $child_form->getPageId() == $page_id; }); } return $child_forms; } /** * {@inheritdoc} */ public function calculateDependencies() { $dependencies = []; // Merge-in the form dependencies. foreach ($this->getChildForms() as $child_form) { foreach ($child_form->calculateDependencies() as $dependency_type => $list) { foreach ($list as $name) { $dependencies[$dependency_type][] = $name; } } } return $dependencies; } /** * {@inheritdoc} */ public function getConfiguration() { return $this->configuration; } /** * {@inheritdoc} */ public function setConfiguration(array $configuration) { $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration); } /** * {@inheritdoc} */ public function defaultConfiguration() { return [ 'action' => 'view', 'id' => NULL, 'child_forms' => [], ]; } /** * Gets the configuration for the given form. * * @param string $form_id * The form ID. * * @return array * The form configuration. */ protected function getFormConfiguration($form_id) { $form_configuration = []; if (isset($this->configuration['child_forms'][$form_id])) { $form_configuration = $this->configuration['child_forms'][$form_id]; } return $form_configuration; } /** * {@inheritdoc} */ public function getFormId() { return $this->pluginId; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $action = $this->configuration['action']; $id = $this->configuration['id']; $pages = $this->getVisiblePages(); $page_config = $pages[$this->pageId]; $child_forms = $this->getChildForms($this->pageId); $form['#tree'] = TRUE; $form['#attached'] = [ 'library' => [ 'acm_customer/base', ], ]; foreach ($child_forms as $child_form_id => $child_form) { $form[$child_form_id] = [ '#parents' => [$child_form_id], '#type' => $child_form->getWrapperElement(), '#title' => $child_form->getLabel(), '#access' => $child_form->isVisible(), ]; $form[$child_form_id] = $child_form->buildForm($form[$child_form_id], $form_state, $form, $action, $id); } return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { $child_forms = $this->getChildForms($this->pageId); foreach ($child_forms as $child_form_id => $child_form) { $child_form->validateForm($form[$child_form_id], $form_state, $form); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $child_forms = $this->getChildForms($this->pageId); foreach ($child_forms as $child_form_id => $child_form) { $child_form->submitForm($form[$child_form_id], $form_state, $form); } // If child form hasn't redirected anywhere then redirect back to the view // page. $redirect = $form_state->getRedirect(); if (!$redirect) { $form_state->setRedirect('acm_customer.view_page', [ 'page' => $this->pageId, ]); } } }