commerce_product_bundles-8.x-1.0/src/ContextProvider/BundleVariationContext.php
src/ContextProvider/BundleVariationContext.php
<?php namespace Drupal\commerce_product_bundles\ContextProvider; use Drupal\commerce_product_bundles\Entity\ProductBundle; use Drupal\commerce_product_bundles\Entity\ProductBundleType; use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Entity\Display\EntityDisplayInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextProviderInterface; use Drupal\Core\Plugin\Context\EntityContextDefinition; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\layout_builder\DefaultsSectionStorageInterface; use Drupal\layout_builder\OverridesSectionStorageInterface; /** * Class BundleVariationContext * * Code was taken from and modified: * @see \Drupal\commerce_product\ContextProvider\ProductVariationContext * * @package Drupal\commerce_product_bundles\ContextProvider */ class BundleVariationContext implements ContextProviderInterface { use StringTranslationTrait; /** * The route match. * * @var \Drupal\Core\Routing\RouteMatchInterface */ protected $routeMatch; /** * The bundle variation storage. * * @var \Drupal\commerce_product_bundles\ProductBundleVariationStorageInterface */ protected $bundleVariationStorage; /** * BundleVariationContext constructor. * * @param \Drupal\Core\Routing\RouteMatchInterface $route_match * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function __construct(RouteMatchInterface $route_match, EntityTypeManagerInterface $entity_type_manager) { $this->routeMatch = $route_match; $this->bundleVariationStorage = $entity_type_manager->getStorage('commerce_bundle_variation'); } /** * {@inheritDoc} * * @param array $unqualified_context_ids * * @return \Drupal\Core\Plugin\Context\Context[] * @throws \Drupal\Component\Plugin\Exception\PluginException * @throws \Drupal\Core\Entity\EntityStorageException */ public function getRuntimeContexts(array $unqualified_context_ids) { $context_definition = new EntityContextDefinition('entity:commerce_bundle_variation', new TranslatableMarkup('Bundle variation')); $value = $this->routeMatch->getParameter('commerce_bundle_variation'); if ($value === NULL) { if ($bundle_product = $this->routeMatch->getParameter('commerce_product_bundles')) { $value = $this->bundleVariationStorage->loadFromContext($bundle_product); } /** @var \Drupal\commerce_product_bundles\Entity\ProductBundleType $product_bundle_type */ elseif ($product_bundle_type = $this->routeMatch->getParameter('commerce_product_bundles_type')) { if (is_string($product_bundle_type)) { $product_bundle_type = ProductBundleType::load($product_bundle_type); } $value = $this->bundleVariationStorage->createWithSampleValues($product_bundle_type->getBundleVariationTypeId()); } elseif (strpos($this->routeMatch->getRouteName(), 'layout_builder') !== FALSE) { /** @var \Drupal\layout_builder\SectionStorageInterface $section_storage */ $section_storage = $this->routeMatch->getParameter('section_storage'); if ($section_storage instanceof DefaultsSectionStorageInterface) { $context = $section_storage->getContextValue('display'); assert($context instanceof EntityDisplayInterface); if ($context->getTargetEntityTypeId() === 'commerce_product_bundles') { $product_bundle_type = ProductBundleType::load($context->getTargetBundle()); $value = $this->bundleVariationStorage->createWithSampleValues($product_bundle_type->getBundleVariationTypeId()); } } elseif ($section_storage instanceof OverridesSectionStorageInterface) { $context = $section_storage->getContextValue('entity'); if ($context instanceof ProductBundle) { $value = $context->getDefaultVariation(); if ($value === NULL) { $product_bundle_type = ProductBundleType::load($context->bundle()); $value = $this->bundleVariationStorage->createWithSampleValues($product_bundle_type->getBundleVariationTypeId()); } } } } } $cacheability = new CacheableMetadata(); $cacheability->setCacheContexts(['route']); $context = new Context($context_definition, $value); $context->addCacheableDependency($cacheability); return ['commerce_bundle_variation' => $context]; } /** * {@inheritdoc} */ public function getAvailableContexts() { return $this->getRuntimeContexts([]); } }