acquia_commercemanager-8.x-1.122/modules/acm_customer/src/Controller/CustomerController.php

modules/acm_customer/src/Controller/CustomerController.php
<?php

namespace Drupal\acm_customer\Controller;

use Drupal\acm_customer\Ajax\CustomerFormCommand;
use Drupal\acm_customer\Ajax\CustomerFormRedirectCommand;
use Drupal\acm_customer\Ajax\CustomerFormSavedCommand;
use Drupal\acm_customer\Ajax\CustomerFormValidationErrorsCommand;
use Drupal\acm_customer\Ajax\CustomerFormValidationErrorsFieldsCommand;
use Drupal\Component\Plugin\PluginManagerInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Form\FormState;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Url;
use Drupal\acm_customer\Ajax\CustomerFormMessageCommand;
use Drupal\acm\Response\NeedsRedirectException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class CustomerController.
 */
class CustomerController extends ControllerBase {

  /**
   * The form builder.
   *
   * @var \Drupal\Core\Form\FormBuilderInterface
   */
  protected $formBuilder;

  /**
   * The form builder.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * The config factory object.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * The customer pages plugin manager.
   *
   * @var \Drupal\Component\Plugin\PluginManagerInterface
   */
  protected $customerPagesManager;

  /**
   * The customer pages plugin.
   *
   * @var string
   */
  private $customerPagesPlugin;

  /**
   * Constructs a new CustomerController.
   *
   * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
   *   The form builder.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   The renderer.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The factory for configuration objects.
   * @param \Drupal\Component\Plugin\PluginManagerInterface $acm_customer_pages_manager
   *   The customer pages plugin manager.
   */
  public function __construct(FormBuilderInterface $form_builder, RendererInterface $renderer, ConfigFactoryInterface $config_factory, PluginManagerInterface $acm_customer_pages_manager) {
    $this->formBuilder = $form_builder;
    $this->renderer = $renderer;
    $this->configFactory = $config_factory;
    $this->customerPagesManager = $acm_customer_pages_manager;
    $this->customerPagesPlugin = $config_factory
      ->get('acm.commerce_users')
      ->get('customer_pages_plugin');
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder'),
      $container->get('renderer'),
      $container->get('config.factory'),
      $container->get('plugin.manager.acm_customer_pages')
    );
  }

  /**
   * Gets the page title.
   *
   * @param string $page
   *   The page route parameter.
   * @param string $action
   *   The id action parameter.
   *
   * @return string
   *   The page title.
   */
  public function getTitle($page = NULL, $action = NULL) {
    $plugin = $this->customerPagesManager->createInstance($this->customerPagesPlugin);
    $page_id = $plugin->getPageId();
    $pages = $plugin->getPages();
    $page_config = $pages[$page_id];
    $title = isset($page_config['title']) ? $page_config['title'] : $page_id;

    if ($action == 'edit' && isset($page_config['edit_title'])) {
      $title = $page_config['edit_title'];
    }

    if (!$page) {
      $title = $this->t('Account');
    }

    return $title;
  }

  /**
   * Renders a customer page.
   *
   * @param string $action
   *   The action route parameter.
   * @param string $id
   *   The id route parameter.
   */
  public function formPage($action = NULL, $id = NULL) {
    $plugin = $this->customerPagesManager->createInstance($this->customerPagesPlugin, ['action' => $action, 'id' => $id]);
    $form_state = new FormState();
    $form = $this->formBuilder->buildForm($plugin, $form_state);
    $form['#attached']['library'][] = 'core/jquery.form';
    $form['#attached']['library'][] = 'core/drupal.ajax';
    $form['#attached']['library'][] = 'acm_customer/single_page_app';
    $form['#attached']['drupalSettings']['acm_customer'] = [
      'customerPagesPath' => Url::fromRoute('acm_customer.view_page')->toString(),
      'ajaxCustomerPagesPath' => Url::fromRoute('acm_customer.ajax_view_page')->toString(),
    ];
    return $form;
  }

  /**
   * Builds and processes the form provided by the order's checkout flow.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request object.
   * @param string $action
   *   The action route parameter.
   * @param string $id
   *   The id route parameter.
   *
   * @return \Drupal\Core\Ajax\AjaxResponse
   *   The form.
   */
  public function ajaxFormPage(Request $request, $action = NULL, $id = NULL) {
    $response = new AjaxResponse();

    try {
      $plugin = $this->customerPagesManager->createInstance($this->customerPagesPlugin, ['action' => $action, 'id' => $id]);
    }
    catch (NeedsRedirectException $e) {
      // Check if the page is redirecting somewhere.
      $response->addCommand(new CustomerFormRedirectCommand($e->getRedirectUrl()));
      return $response;
    }

    $form_state = (new FormState())
      ->disableRedirect();
    $form = $this->formBuilder->buildForm($plugin, $form_state);

    if ($form_state->isExecuted()) {
      $next_page = Url::fromRoute('acm_customer.view_page', [
        'page' => $plugin->getPageId(),
      ])->toString();
      $response->addCommand(new CustomerFormSavedCommand($next_page));
    }
    else {
      $output = $this->renderer->renderRoot($form);

      if ($request->request->get('nocssjs') !== 'true') {
        $response->setAttachments($form['#attached']);
      }
      else {
        // Libraries we always want attached.
        $attached = [];
        $attached['library'] = [
          'core/drupal.states',
          'core/drupal.ajax',
        ];
        $attached['drupalSettings'] = $form['#attached']['drupalSettings'];
        $response->setAttachments($attached);
      }

      $response->addCommand(new CustomerFormCommand($output));

      $errors = $form_state->getErrors();
      if (count($errors)) {
        $status_messages = [
          '#type' => 'status_messages',
        ];
        $response->addCommand(new CustomerFormValidationErrorsCommand($this->renderer->renderRoot($status_messages)));
        $response->addCommand(new CustomerFormValidationErrorsFieldsCommand(array_keys($errors)));
      }
    }

    // Render any uses of `drupal_set_message` that have are displaying status
    // messages. Error statuses should be caught with the form errors above.
    $messages = ['#type' => 'status_messages', '#display' => 'status'];
    $messages = $this->renderer->renderRoot($messages);
    if ($messages) {
      $response->addCommand(new CustomerFormMessageCommand($messages));
    }

    return $response;
  }

  /**
   * Checks access for the form page.
   *
   * @return \Drupal\Core\Access\AccessResult
   *   The access result.
   */
  public function checkAccess() {
    return AccessResult::allowedIf($this->customerPagesPlugin);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc