You are here

abstract class CartBlockBase in Commerce Cart Blocks 8

CartBlockBase class.

Hierarchy

Expanded class hierarchy of CartBlockBase

File

src/Plugin/Block/CartBlockBase.php, line 19

Namespace

Drupal\commerce_cart_blocks\Plugin\Block
View source
abstract class CartBlockBase extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * The cart provider.
   *
   * @var \Drupal\commerce_cart\CartProviderInterface
   */
  protected $cartProvider;

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

  /**
   * Constructs a new CartBlock.
   *
   * @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_cart\CartProviderInterface $cart_provider
   *   The cart provider.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, CartProviderInterface $cart_provider, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->cartProvider = $cart_provider;
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('commerce_cart.cart_provider'), $container
      ->get('entity_type.manager'));
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'hide_if_empty' => FALSE,
      'display_links' => [
        'cart' => 'cart',
      ],
      'cart_link_text' => 'Cart',
      'checkout_link_text' => 'Checkout',
      'count_text_singular' => '@count item',
      'count_text_plural' => '@count items',
      'count_text_empty' => '',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $form['hide_if_empty'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Hide if empty'),
      '#description' => $this
        ->t('When checked, then the block will be hidden if the cart is empty.'),
      '#default_value' => $this->configuration['hide_if_empty'],
    ];
    $form['display_links'] = [
      '#type' => 'checkboxes',
      '#title' => $this
        ->t('Display links'),
      '#description' => $this
        ->t('Choose which links to display within the block content.'),
      '#options' => [
        'cart' => $this
          ->t('Cart'),
        'checkout' => $this
          ->t('Checkout'),
      ],
      '#default_value' => $this->configuration['display_links'],
    ];
    $form['cart_link_text'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Cart link text'),
      '#description' => $this
        ->t('Enter the text for the Cart link, if shown.'),
      '#default_value' => $this->configuration['cart_link_text'],
    ];
    $form['checkout_link_text'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Checkout link text'),
      '#description' => $this
        ->t('Enter the text for the Checkout link, if shown.'),
      '#default_value' => $this->configuration['checkout_link_text'],
    ];
    $form['count_text_plural'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Count text (plural)'),
      '#description' => $this
        ->t('The text to use when describing the number of cart items, including the @count placeholder.'),
      '#default_value' => $this->configuration['count_text_plural'],
    ];
    $form['count_text_singular'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Count text (singular)'),
      '#description' => $this
        ->t('The text to use when describing a single cart item, including the @count placeholder.'),
      '#default_value' => $this->configuration['count_text_singular'],
    ];
    $form['count_text_empty'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Count text (empty)'),
      '#description' => $this
        ->t('The text to use when describing an empty cart item, including the @count placeholder.'),
      '#default_value' => $this->configuration['count_text_empty'],
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function blockSubmit($form, FormStateInterface $form_state) {
    $this
      ->setConfigurationValue('hide_if_empty', $form_state
      ->getValue('hide_if_empty'));
    $this
      ->setConfigurationValue('display_links', $form_state
      ->getValue('display_links'));
    $this
      ->setConfigurationValue('cart_link_text', $form_state
      ->getValue('cart_link_text'));
    $this
      ->setConfigurationValue('checkout_link_text', $form_state
      ->getValue('checkout_link_text'));
    $this
      ->setConfigurationValue('count_text_plural', $form_state
      ->getValue('count_text_plural'));
    $this
      ->setConfigurationValue('count_text_singular', $form_state
      ->getValue('count_text_singular'));
    $this
      ->setConfigurationValue('count_text_empty', $form_state
      ->getValue('count_text_empty'));
  }

  /**
   * {@inheritdoc}
   */
  protected function buildCache() {
    $cacheableMetadata = $this
      ->getCacheabilityMetadata();
    return [
      'contexts' => $cacheableMetadata
        ->getCacheContexts(),
      'tags' => $cacheableMetadata
        ->getCacheTags(),
      'max-age' => $cacheableMetadata
        ->getCacheMaxAge(),
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function isInCart() {
    return \Drupal::routeMatch()
      ->getRouteName() === 'commerce_cart.page';
  }

  /**
   * {@inheritdoc}
   */
  protected function buildLinks() {
    $links = [];
    $displayLinks = $this->configuration['display_links'];
    if ($displayLinks['checkout']) {
      $carts = $this
        ->getCarts();
      if (!empty($carts)) {

        /** @var \Drupal\commerce_order\Entity\OrderInterface $cart */
        $cart = array_shift($carts);
        $links[] = [
          '#type' => 'link',
          '#title' => $this->configuration['checkout_link_text'],
          '#url' => Url::fromRoute('commerce_checkout.form', [
            'commerce_order' => $cart
              ->id(),
          ]),
        ];
      }
    }
    if ($displayLinks['cart']) {
      $links[] = [
        '#type' => 'link',
        '#title' => $this->configuration['cart_link_text'],
        '#url' => Url::fromRoute('commerce_cart.page'),
      ];
    }
    return $links;
  }

  /**
   * Gets the text representation of the count of items.
   */
  protected function getCountText() {
    if (!$this
      ->getCartCount()) {
      return $this->configuration['count_text_empty'];
    }
    return $this
      ->formatPlural($this
      ->getCartCount(), $this->configuration['count_text_singular'], $this->configuration['count_text_plural']);
  }

  /**
   * Gets the total price of the carts.
   */
  protected function getTotal() {
    $carts = $this
      ->getCarts();

    /** @var \Drupal\commerce_order\Entity\OrderInterface $firstCart */
    $firstCart = array_shift($carts);
    if (!empty($firstCart)) {
      $price = $firstCart
        ->getTotalPrice();
      foreach ($carts as $cart_id => $cart) {
        $price
          ->add($cart
          ->getTotalPrice());
      }
    }
    else {
      $price = $this
        ->createPrice(0);
    }
    return $price;
  }

  /**
   *
   */
  protected function createPrice($amount) {

    /** @var \Drupal\commerce_store\StoreStorageInterface $storage */
    $storage = $this->entityTypeManager
      ->getStorage('commerce_store');
    $defaultStore = $storage
      ->loadDefault();
    $currencyCode = $defaultStore ? $defaultStore
      ->getDefaultCurrencyCode() : 'USD';
    return new Price($amount, $currencyCode);
  }

  /**
   * Gets the total price as a formatted string.
   *
   * @return mixed|null
   */
  protected function getTotalText() {
    $element = [];
    $element['price'] = [
      '#type' => 'inline_template',
      '#template' => '{{ price|commerce_price_format }}',
      '#context' => [
        'price' => $this
          ->getTotal(),
      ],
    ];
    return \Drupal::service('renderer')
      ->renderPlain($element);
  }

  /**
   * {@inheritdoc}
   */
  protected function getLibraries() {
    return [];
  }

  /**
   * {@inheritdoc}
   */
  protected function getCacheabilityMetadata() {
    $carts = $this
      ->getCarts();
    $cacheableMetadata = new CacheableMetadata();
    $cacheableMetadata
      ->addCacheContexts([
      'user',
      'session',
    ]);
    foreach ($carts as $cart) {
      $cacheableMetadata
        ->addCacheableDependency($cart);
    }
    return $cacheableMetadata;
  }

  /**
   * {@inheritdoc}
   */
  protected function getCartCount() {
    $carts = $this
      ->getCarts();
    $count = 0;
    foreach ($carts as $cart_id => $cart) {
      foreach ($cart
        ->getItems() as $order_item) {
        $count += (int) $order_item
          ->getQuantity();
      }
    }
    return $count;
  }

  /**
   * {@inheritdoc}
   */
  protected function getCarts() {

    /** @var \Drupal\commerce_order\Entity\OrderInterface[] $carts */
    $carts = $this->cartProvider
      ->getCarts();
    return array_filter($carts, function ($cart) {

      /** @var \Drupal\commerce_order\Entity\OrderInterface $cart */
      return $cart
        ->hasItems() && $cart->cart->value;
    });
  }

  /**
   * {@inheritdoc}
   */
  protected function shouldHide() {
    return $this->configuration['hide_if_empty'] && !$this
      ->getCartCount();
  }

  /**
   * Gets the cart views for each cart.
   *
   * @return array
   *   An array of view ids keyed by cart order ID.
   */
  protected function getCartViews() {
    $carts = $this
      ->getCarts();
    $availableViews = $this
      ->getAvailableViews($carts);
    $cartViews = [];
    foreach ($carts as $cartId => $cart) {
      $cartViews[] = [
        '#prefix' => '<div class="cart cart-block">',
        '#suffix' => '</div>',
        '#type' => 'view',
        '#name' => $availableViews[$cartId],
        '#arguments' => [
          $cartId,
        ],
        '#embed' => TRUE,
      ];
    }
    return $cartViews;
  }

  /**
   * {@inheritdoc}
   */
  private function getOrderTypeIds(array $carts) {
    return array_map(function ($cart) {
      return $cart
        ->bundle();
    }, $carts);
  }

  /**
   * {@inheritdoc}
   */
  private function getAvailableViews(array $carts) {
    try {
      $orderTypeIds = $this
        ->getOrderTypeIds($carts);
      $orderTypeStorage = $this->entityTypeManager
        ->getStorage('commerce_order_type');
      $orderTypes = $orderTypeStorage
        ->loadMultiple(array_unique($orderTypeIds));
      $availableViews = [];
      foreach ($orderTypeIds as $cartId => $order_type_id) {

        /** @var \Drupal\commerce_order\Entity\OrderTypeInterface $order_type */
        $order_type = $orderTypes[$order_type_id];
        $availableViews[$cartId] = $order_type
          ->getThirdPartySetting('commerce_cart', 'cart_block_view', 'commerce_cart_block');
      }
      return $availableViews;
    } catch (InvalidPluginDefinitionException $e) {
      return [];
    }
  }

  /**
   * {@inheritdoc}
   *
   * @todo Find proper cache tags to make this cacheable
   */
  public function getCacheMaxAge() {
    return 0;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BlockPluginInterface::BLOCK_LABEL_VISIBLE constant Indicates the block label (title) should be displayed to end users.
BlockPluginInterface::build public function Builds and returns the renderable array for this block plugin. 47
BlockPluginTrait::$transliteration protected property The transliteration service.
BlockPluginTrait::access public function
BlockPluginTrait::baseConfigurationDefaults protected function Returns generic default configuration for block plugins.
BlockPluginTrait::blockAccess protected function Indicates whether the block should be shown. 16
BlockPluginTrait::blockValidate public function 3
BlockPluginTrait::buildConfigurationForm public function Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. 2
BlockPluginTrait::calculateDependencies public function
BlockPluginTrait::getConfiguration public function 1
BlockPluginTrait::getMachineNameSuggestion public function 1
BlockPluginTrait::getPreviewFallbackString public function 3
BlockPluginTrait::label public function
BlockPluginTrait::setConfiguration public function
BlockPluginTrait::setConfigurationValue public function
BlockPluginTrait::setTransliteration public function Sets the transliteration service.
BlockPluginTrait::submitConfigurationForm public function Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit().
BlockPluginTrait::transliteration protected function Wraps the transliteration service.
BlockPluginTrait::validateConfigurationForm public function Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). 1
CartBlockBase::$cartProvider protected property The cart provider.
CartBlockBase::$entityTypeManager protected property The entity type manager.
CartBlockBase::blockForm public function Overrides BlockPluginTrait::blockForm 1
CartBlockBase::blockSubmit public function Overrides BlockPluginTrait::blockSubmit 1
CartBlockBase::buildCache protected function
CartBlockBase::buildLinks protected function
CartBlockBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
CartBlockBase::createPrice protected function
CartBlockBase::defaultConfiguration public function Overrides BlockPluginTrait::defaultConfiguration 1
CartBlockBase::getAvailableViews private function
CartBlockBase::getCacheabilityMetadata protected function
CartBlockBase::getCacheMaxAge public function @todo Find proper cache tags to make this cacheable Overrides ContextAwarePluginBase::getCacheMaxAge
CartBlockBase::getCartCount protected function
CartBlockBase::getCarts protected function
CartBlockBase::getCartViews protected function Gets the cart views for each cart. 1
CartBlockBase::getCountText protected function Gets the text representation of the count of items.
CartBlockBase::getLibraries protected function 1
CartBlockBase::getOrderTypeIds private function
CartBlockBase::getTotal protected function Gets the total price of the carts.
CartBlockBase::getTotalText protected function Gets the total price as a formatted string.
CartBlockBase::isInCart protected function
CartBlockBase::shouldHide protected function
CartBlockBase::__construct public function Constructs a new CartBlock. Overrides BlockPluginTrait::__construct
ContextAwarePluginAssignmentTrait::addContextAssignmentElement protected function Builds a form element for assigning a context to a given slot.
ContextAwarePluginAssignmentTrait::contextHandler protected function Wraps the context handler.
ContextAwarePluginBase::$context protected property The data objects representing the context of this plugin.
ContextAwarePluginBase::$contexts Deprecated private property Data objects representing the contexts passed in the plugin configuration.
ContextAwarePluginBase::createContextFromConfiguration protected function Overrides ContextAwarePluginBase::createContextFromConfiguration
ContextAwarePluginBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts 9
ContextAwarePluginBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags 4
ContextAwarePluginBase::getContext public function This code is identical to the Component in order to pick up a different Context class. Overrides ContextAwarePluginBase::getContext
ContextAwarePluginBase::getContextDefinition public function Overrides ContextAwarePluginBase::getContextDefinition
ContextAwarePluginBase::getContextDefinitions public function Overrides ContextAwarePluginBase::getContextDefinitions
ContextAwarePluginBase::getContextMapping public function Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::getContextMapping
ContextAwarePluginBase::getContexts public function Gets the defined contexts. Overrides ContextAwarePluginInterface::getContexts
ContextAwarePluginBase::getContextValue public function Gets the value for a defined context. Overrides ContextAwarePluginInterface::getContextValue
ContextAwarePluginBase::getContextValues public function Gets the values for all defined contexts. Overrides ContextAwarePluginInterface::getContextValues
ContextAwarePluginBase::setContext public function Set a context on this plugin. Overrides ContextAwarePluginBase::setContext
ContextAwarePluginBase::setContextMapping public function Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::setContextMapping
ContextAwarePluginBase::setContextValue public function Sets the value for a defined context. Overrides ContextAwarePluginBase::setContextValue
ContextAwarePluginBase::validateContexts public function Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface::validateContexts
ContextAwarePluginBase::__get public function Implements magic __get() method.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginWithFormsTrait::getFormClass public function
PluginWithFormsTrait::hasFormClass public function
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2