arch-8.x-1.x-dev/modules/price/src/Plugin/Field/FieldFormatter/PriceDefaultFormatter.php

modules/price/src/Plugin/Field/FieldFormatter/PriceDefaultFormatter.php
<?php

namespace Drupal\arch_price\Plugin\Field\FieldFormatter;

use Drupal\arch_price\Negotiation\PriceNegotiation;
use Drupal\arch_price\Price\ModifiedPriceInterface;
use Drupal\arch_price\Price\PriceFormatterInterface;
use Drupal\arch_price\Price\PriceInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Plugin implementation of the 'price' formatter.
 *
 * @FieldFormatter(
 *   id = "price_default",
 *   label = @Translation("Price default", context = "arch_price__field_formatter"),
 *   field_types = {
 *     "price"
 *   }
 * )
 */
class PriceDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {

  /**
   * Price formatter.
   *
   * @var \Drupal\arch_price\Price\PriceFormatterInterface
   */
  protected $priceFormatter;

  /**
   * Price negotiation.
   *
   * @var \Drupal\arch_price\Negotiation\PriceNegotiation
   */
  protected $priceNegotiation;

  /**
   * {@inheritdoc}
   */
  public function __construct(
    $plugin_id,
    $plugin_definition,
    FieldDefinitionInterface $field_definition,
    array $settings,
    $label,
    $view_mode,
    array $third_party_settings,
    PriceFormatterInterface $price_formatter,
    PriceNegotiation $price_negotiotion,
  ) {
    parent::__construct(
      $plugin_id,
      $plugin_definition,
      $field_definition,
      $settings,
      $label,
      $view_mode,
      $third_party_settings
    );

    $this->priceFormatter = $price_formatter;
    $this->priceNegotiation = $price_negotiotion;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(
    ContainerInterface $container,
    array $configuration,
    $plugin_id,
    $plugin_definition,
  ) {
    return new static(
      $plugin_id,
      $plugin_definition,
      $configuration['field_definition'],
      $configuration['settings'],
      $configuration['label'],
      $configuration['view_mode'],
      $configuration['third_party_settings'],
      $container->get('price_formatter'),
      $container->get('price.negotiation')
    );
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      'view_mode' => PriceInterface::MODE_NET_GROSS,
      'label' => FALSE,
      'vat_info' => FALSE,
      'show_original' => FALSE,
    ] + parent::defaultSettings();
  }

  /**
   * Get view mode options.
   *
   * @return array
   *   View mode list.
   */
  protected function getViewModeOptions() {
    return [
      PriceInterface::MODE_NET => $this->t('Net', [], ['context' => 'arch_price']),
      PriceInterface::MODE_GROSS => $this->t('Gross', [], ['context' => 'arch_price']),
      PriceInterface::MODE_NET_GROSS => $this->t('Net + Gross', [], ['context' => 'arch_price']),
      PriceInterface::MODE_GROSS_NET => $this->t('Gross + Net', [], ['context' => 'arch_price']),
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $elements['view_mode'] = [
      '#type' => 'select',
      '#options' => $this->getViewModeOptions(),
      '#title' => $this->t('View mode'),
      '#default_value' => $this->getSetting('view_mode'),
      '#required' => TRUE,
    ];

    $elements['label'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Display price type label', [], ['context' => 'arch_price']),
      '#default_value' => $this->getSetting('label'),
    ];

    $elements['vat_info'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Display VAT information', [], ['context' => 'arch_price']),
      '#default_value' => $this->getSetting('vat_info'),
    ];

    $elements['show_original'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Show original price', [], ['context' => 'arch_price']),
      '#default_value' => $this->getSetting('show_original'),
    ];

    return $elements;
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $summary = [];

    $view_modes = $this->getViewModeOptions();
    $view_mode = $this->getSetting('view_mode');
    $summary[] = $this->t('Rendered as @mode', ['@mode' => $view_modes[$view_mode] ?? $view_mode]);
    if ($this->getSetting('label')) {
      $summary[] = $this->t('Display price type label', [], ['context' => 'arch_price']);
    }
    else {
      $summary[] = $this->t('Without price type label', [], ['context' => 'arch_price']);
    }

    if ($this->getSetting('vat_info')) {
      $summary[] = $this->t('Display VAT information', [], ['context' => 'arch_price']);
    }
    else {
      $summary[] = $this->t('Without VAT information', [], ['context' => 'arch_price']);
    }

    if ($this->getSetting('show_original')) {
      $summary[] = $this->t('Display original price', [], ['context' => 'arch_price']);
    }
    else {
      $summary[] = $this->t('Without original price', [], ['context' => 'arch_price']);
    }

    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    if ($items->isEmpty()) {
      return [];
    }

    /** @var \Drupal\arch_price\Plugin\Field\FieldType\PriceFieldItemList $items */
    /** @var \Drupal\arch_price\Price\PriceInterface $price */
    /** @var \Drupal\arch_product\Entity\ProductInterface $product */
    $product = $items->getEntity();
    $price = $this->priceNegotiation->getActivePrice($product);
    $mode = $this->getSetting('view_mode');
    $settings = [
      'label' => $this->getSetting('label'),
      'vat_info' => $this->getSetting('vat_info'),
      'show_original' => $this->getSetting('show_original'),
    ];

    $build = $this->buildPrice($price, $mode, $settings);
    $build['#original_price'] = TRUE;
    $build['#modified_price'] = FALSE;
    $build['#has_modified_price'] = FALSE;

    if (
      !empty($this->getSetting('show_original'))
      && $price instanceof ModifiedPriceInterface
    ) {
      $original_price = $price->getOriginalPrice();
      if ($original_price->getNetPrice() != $price->getNetPrice()) {
        $build_original_price = $this->buildPrice($original_price, $mode, $settings);
        $build_original_price['#original_price'] = TRUE;
        $build_original_price['#modified_price'] = FALSE;
        $build_original_price['#has_modified_price'] = TRUE;
        $build['#original_price'] = FALSE;
        $build['#modified_price'] = TRUE;
        if (!empty($build['#theme'])) {
          $price_build = $build;
          $build = [];
          $build[$mode] = $price_build;
        }
        $build['original_price'] = $build_original_price;
      }
    }

    return [
      $build,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildPrice($price, $mode, $settings) {
    switch ($mode) {
      case PriceInterface::MODE_NET:
        $build = $this->priceFormatter->buildNet($price, $settings);
        break;

      case PriceInterface::MODE_GROSS:
        $build = $this->priceFormatter->buildGross($price, $settings);
        break;

      case PriceInterface::MODE_GROSS_NET:
      case PriceInterface::MODE_NET_GROSS:
      default:
        $build = $this->priceFormatter->buildFull($price, $settings);
        if ($mode === PriceInterface::MODE_GROSS_NET) {
          $build['gross']['#weight'] = 1;
          $build['net']['#weight'] = 2;
        }
        elseif ($mode === PriceInterface::MODE_NET_GROSS) {
          $build['net']['#weight'] = 1;
          $build['gross']['#weight'] = 2;
        }

        // Hide VAT information.
        $build['net']['#vat_info_display'] = FALSE;
        $build['gross']['#vat_info_display'] = FALSE;
        break;
    }
    return $build;
  }

}

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

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