arch-8.x-1.x-dev/modules/product/modules/group/src/Controller/ProductMatrixApiController.php

modules/product/modules/group/src/Controller/ProductMatrixApiController.php
<?php

namespace Drupal\arch_product_group\Controller;

use Drupal\arch_product\Entity\ProductInterface;
use Drupal\arch_product_group\Ajax\ProductReplaceContentCommand;
use Drupal\arch_product_group\GroupHandlerInterface;
use Drupal\arch_product_group\ProductMatrixInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/**
 * Product matrix API controller.
 *
 * @package Drupal\arch_product_group\Controller
 */
class ProductMatrixApiController extends ControllerBase {

  /**
   * Group handler.
   *
   * @var \Drupal\arch_product_group\GroupHandlerInterface
   */
  protected $groupHandler;

  /**
   * Product matrix.
   *
   * @var \Drupal\arch_product_group\ProductMatrixInterface
   */
  protected $productMatrix;

  /**
   * Entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Entity display repository.
   *
   * @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface
   */
  protected $entityDisplayRepository;

  /**
   * Product view builder.
   *
   * @var \Drupal\Core\Entity\EntityViewBuilderInterface
   */
  protected $productViewBuilder;

  /**
   * Entity field manager.
   *
   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
   */
  protected $entityFieldManager;

  /**
   * Current language.
   *
   * @var \Drupal\Core\Language\LanguageInterface
   */
  protected $currentLanguage;

  /**
   * Route match.
   *
   * @var \Drupal\Core\Routing\RouteMatchInterface
   */
  protected $routeMatch;

  /**
   * Renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * ProductMatrixApiController constructor.
   *
   * @param \Drupal\arch_product_group\GroupHandlerInterface $group_handler
   *   Group handler.
   * @param \Drupal\arch_product_group\ProductMatrixInterface $product_matrix
   *   Product matrix.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   Entity type manager.
   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
   *   Entity display repository.
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
   *   Entity field manager.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   Language manager.
   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
   *   Route match.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   Renderer.
   */
  public function __construct(
    GroupHandlerInterface $group_handler,
    ProductMatrixInterface $product_matrix,
    EntityTypeManagerInterface $entity_type_manager,
    EntityDisplayRepositoryInterface $entity_display_repository,
    EntityFieldManagerInterface $entity_field_manager,
    LanguageManagerInterface $language_manager,
    RouteMatchInterface $route_match,
    RendererInterface $renderer,
  ) {
    $this->groupHandler = $group_handler;
    $this->productMatrix = $product_matrix;
    $this->entityTypeManager = $entity_type_manager;
    $this->productViewBuilder = $entity_type_manager->getViewBuilder('product');
    $this->entityDisplayRepository = $entity_display_repository;
    $this->entityFieldManager = $entity_field_manager;
    $this->currentLanguage = $language_manager->getCurrentLanguage();
    $this->routeMatch = $route_match;
    $this->renderer = $renderer;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('product_group.handler'),
      $container->get('product_matrix'),
      $container->get('entity_type.manager'),
      $container->get('entity_display.repository'),
      $container->get('entity_field.manager'),
      $container->get('language_manager'),
      $container->get('current_route_match'),
      $container->get('renderer')
    );
  }

  /**
   * Get rendered product.
   *
   * @param int $group_id
   *   Group ID.
   * @param \Drupal\arch_product\Entity\ProductInterface $product
   *   Requested product.
   *
   * @return \Drupal\Core\Ajax\AjaxResponse
   *   Ajax response.
   *
   * @throws \Exception
   */
  public function product($group_id, ProductInterface $product) {
    if (
      !$this->groupHandler->isPartOfGroup($product)
      || $this->groupHandler->getGroupId($product) !== (int) $group_id
    ) {
      throw new NotFoundHttpException();
    }

    $langcode = $this->currentLanguage->getId();

    if ($product->hasTranslation($langcode)) {
      $product = $product->getTranslation($langcode);
    }

    $build = $this->productViewBuilder->view($product, 'full');
    $build['#page'] = TRUE;
    $content = $this->renderer->render($build);

    $selector = [
      '.product-' . $product->bundle(),
      '.product--full',
      '.product-' . $product->bundle() . '-full',
    ];
    $ajax_url = Url::fromRoute($this->routeMatch->getRouteName(), [
      'group_id' => (int) $group_id,
      'product' => (int) $product->id(),
    ]);
    $ajax_url->setAbsolute(FALSE);

    $response = new AjaxResponse();
    $response->addCommand(new ProductReplaceContentCommand(
      $product->toUrl(),
      $product->id() . '#' . $product->label(),
      implode('', $selector),
      $content,
      [
        'group_id' => (int) $group_id,
        'product_id' => (int) $product->id(),
        'ajax_url' => $ajax_url->toString(),
      ]
    ));

    return $response;
  }

}

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

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