arch-8.x-1.x-dev/modules/product/modules/group/src/Plugin/Field/FieldFormatter/ProductGroupDefaultFormatter.php
modules/product/modules/group/src/Plugin/Field/FieldFormatter/ProductGroupDefaultFormatter.php
<?php
namespace Drupal\arch_product_group\Plugin\Field\FieldFormatter;
use Drupal\arch_product\Entity\Builder\ProductViewBuilder;
use Drupal\arch_product\Entity\ProductInterface;
use Drupal\arch_product_group\GroupHandlerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
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 'product group' formatter.
*
* @FieldFormatter(
* id = "product_group_default",
* label = @Translation("Product group default", context = "arch_product_group__field_formatter"),
* field_types = {
* "integer"
* }
* )
*/
class ProductGroupDefaultFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
/**
* Group handler.
*
* @var \Drupal\arch_product_group\GroupHandlerInterface
*/
protected $groupHandler;
/**
* Entity display repository.
*
* @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface
*/
protected $entityDisplayRepository;
/**
* Product view builder.
*
* @var \Drupal\arch_product\Entity\Builder\ProductViewBuilder
*/
protected $productViewBuilder;
/**
* {@inheritdoc}
*/
public function __construct(
$plugin_id,
$plugin_definition,
FieldDefinitionInterface $field_definition,
array $settings,
$label,
$view_mode,
array $third_party_settings,
GroupHandlerInterface $group_handler,
EntityDisplayRepositoryInterface $entity_display_repository,
ProductViewBuilder $product_view_builder,
) {
parent::__construct(
$plugin_id,
$plugin_definition,
$field_definition,
$settings,
$label,
$view_mode,
$third_party_settings
);
$this->groupHandler = $group_handler;
$this->entityDisplayRepository = $entity_display_repository;
$this->productViewBuilder = $product_view_builder;
}
/**
* {@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('product_group.handler'),
$container->get('entity_display.repository'),
$container->get('entity_type.manager')->getViewBuilder('product')
);
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'view_mode' => '_link',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$view_modes = [
'_link' => $this->t('Link', [], ['context' => 'arch_product_group_formatter_mode']),
];
$view_modes += $this->entityDisplayRepository->getViewModeOptions('product');
$elements['view_mode'] = [
'#type' => 'select',
'#options' => $view_modes,
'#title' => $this->t('View mode'),
'#default_value' => $this->getSetting('view_mode'),
'#required' => TRUE,
];
return $elements;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
/** @var \Drupal\arch_product\Entity\ProductInterface $product */
$product = $items->getEntity();
if (!$this->groupHandler->isPartOfGroup($product)) {
return ['#markup' => ''];
}
$group = $this->groupHandler->getGroupProducts($product);
if (empty($group)) {
return ['#markup' => ''];
}
return [
'#theme' => 'item_list',
'#attributes' => [
'class' => [
'product-group--group-items',
],
],
'#items' => array_map(function (ProductInterface $group_item) use ($product) {
$item_classes = [
'product-group--group-item',
];
if ($product->id() == $group_item->id()) {
$item_classes[] = 'product-group--group-item--selected';
$item_classes[] = 'active';
}
$view_mode = $this->getSetting('view_mode');
if ($view_mode == '_link') {
$data = $group_item->toLink()->toRenderable();
}
else {
$data = $this->productViewBuilder->view($group_item, $view_mode);
}
return [
'data' => $data,
'#wrapper_attributes' => ['class' => $item_classes],
];
}, $group),
'#cache' => [
'contexts' => [
'url',
],
'tags' => $product->getCacheTags(),
],
];
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
if ($field_definition->getFieldStorageDefinition()->getTargetEntityTypeId() != 'product') {
return FALSE;
}
return $field_definition->getName() == 'group_id';
}
}
