layout_builder_tomsaw-1.0.x-dev/src/Plugin/Condition/SegmentCondition.php

src/Plugin/Condition/SegmentCondition.php
<?php declare(strict_types = 1);

namespace Drupal\layout_builder_tomsaw\Plugin\Condition;

use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Routing\CurrentRouteMatch;
use Symfony\Component\DependencyInjection\ContainerInterface;

use Drupal\layout_builder_tomsaw\Entity\Segment;
/**
 * Provides a 'Segment Condition' condition.
 *
 * @Condition(
 *   id = "segment_condition",
 *   label = @Translation("Segements"),
 * )
 */
final class SegmentCondition extends ConditionPluginBase implements ContainerFactoryPluginInterface {

  /**
   * Constructs a new SegmentCondition instance.
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    private readonly EntityTypeManagerInterface $entityTypeManager,
    private readonly CurrentRouteMatch $currentRoute
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

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

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration(): array {
    return ['segments' => []] + parent::defaultConfiguration();
  }

  private function getOptions() {
    $storage = $this->entityTypeManager->getStorage('segment');

    foreach($storage->loadMultiple() as $id => $segment) {
      $options[$id] = $segment->label();
    }

    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state): array {
    $form['segments'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Segments'),
      '#options' => $this->getOptions(),
      '#default_value' => $this->configuration['segments'],
    ];
    return parent::buildConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state): void {
    $this->configuration['segments'] = array_filter($form_state->getValue('segments'));
    parent::submitConfigurationForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function summary(): string {
    $storage = $this->entityTypeManager->getStorage('segment');
    $entities = $storage->loadMultiple($this->configuration['segments']);
    $labels = array_map(function($entity) { return $entity->label(); }, $entities);

    $message = $this->isNegated() ? "All Segments but @segments" : "Segments ";
    return (string) $this->t($message, [
        '@segments' => join(', ', $labels)
      ],
    );
  }

  /**
   * {@inheritdoc}
   */
  public function evaluate(): bool {
    // @fixme using $this->isNegated() == true is evaluated falsy
    // Returns true if no segments are selected and negate option is disabled.
    if (empty($this->configuration['segments']) && !$this->isNegated()) {
      return TRUE;
    }

    // @workaround presence of section_storage suggests an edit form
    if($this->currentRoute->getParameter('section_storage'))
      return FALSE;

    if ($segment = $this->currentRoute->getParameter('segment')) {
      assert($segment instanceof Segment);
      return in_array($segment->id(), $this->configuration['segments']);
    }
    return FALSE;
  }

}

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

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