Commit d2801d97 authored by Anwoon's avatar Anwoon
Browse files

Feature #3092175 - Added CustomListEntityListFilter and options for condition...

Feature #3092175 - Added CustomListEntityListFilter and options for condition type in multiple select
parent 7ffd9cfd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ class EntityListFilterParametersForm extends FormBase {

      $form['filter_id'] = [
        '#type' => 'hidden',
        '#value' => $filter_id,
        '#value' => $plugin_id === 'custom_list_entity_list_filter' ? $filter_id . '_' . uniqid() : $filter_id,
      ];

      $form['entity_list_id'] = [
+24 −0
Original line number Diff line number Diff line
@@ -217,12 +217,36 @@ class FiltersEntityListExtraDisplay extends EntityListExtraDisplayBase {
              }
            }
          }
          else if (str_contains($key, 'custom_list_entity_list_filter')) {
            $this->createFilterAvailableLayoutItem(
              $default_values,
              'custom_list_entity_list_filter',
              $plugins_definitions['custom_list_entity_list_filter'],
              $availableLayout,
              $this->getCustomFilterId('custom_list_entity_list_filter', $key)
            );
          }
      }
    }

    return $availableLayout;
  }

  /**
   * Get Custom Filter Id.
   *
   * @param string $plugin_key
   *   This is plugin key.
   * @param string $key
   *   This is key.
   *
   * @return string
   *   Return id of custom filter.
   */
  public function getCustomFilterId(string $plugin_key, string $key) {
    return substr($key, strlen($plugin_key) + 1, strlen($key) - strlen($plugin_key));
  }

  /**
   * Create filter available layout item function.
   *
+183 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\entity_list\Plugin\EntityListFilter;

use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\entity_list\Entity\EntityList;
use Drupal\entity_list\Service\ContentFilterService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Class CustomListEntityListFilter.
 *
 * @package Drupal\entity_list\Plugin
 *
 * @EntityListFilter(
 *   id = "custom_list_entity_list_filter",
 *   label = @Translation("Custom List Entity List Filter"),
 *   content_type = {},
 *   entity_type = {
 *     "node"
 *   },
 * )
 */
class CustomListEntityListFilter extends TaxonomiesEntityListFilter {

  /**
   * Drupal\entity_list\Service\ContentFilterService
   *
   * @var \Drupal\entity_list\Service\ContentFilterService
   */
  protected $contentFilterService;

  /**
   * TaxonomiesEntityListFilter constructor.
   *
   * @param $configuration
   *   This is configuration.
   * @param $plugin_id
   *   This is plugin id.
   * @param $plugin_definition
   *   This is plugin definition.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   This is entity type manager.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   This is language manager.
   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
   *   This is entity repository interface.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   This is request stack.
   * @param \Drupal\entity_list\Service\ContentFilterService $content_filter_service
   *   This is content filter service.
   */
  public function __construct(
    $configuration,
    $plugin_id,
    $plugin_definition,
    EntityTypeManagerInterface $entity_type_manager,
    LanguageManagerInterface $language_manager,
    EntityRepositoryInterface $entity_repository,
    RequestStack $request_stack,
    ContentFilterService $content_filter_service){
    parent::__construct(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $entity_type_manager,
      $language_manager,
      $entity_repository,
      $request_stack
    );
    $this->contentFilterService = $content_filter_service;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration, $plugin_id, $plugin_definition,
      $container->get('entity_type.manager'),
      $container->get('language_manager'),
      $container->get('entity.repository'),
      $container->get('request_stack'),
      $container->get('service.content_filter'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function buildFilter(array $parameters, EntityList $entity_list) {
    $filters = [];
    $request = $this->requestStack->getCurrentRequest();
    $options = [];

    if (!empty($parameters['settings']['allowed_values'])) {
      $list = explode("\n", $parameters['settings']['allowed_values']);

      foreach ($list as $value) {
        $element = explode("|", $value);

        if (!empty($element)) {
          $options[$element[0]] = $element[1];
        }
      }
    }

    $filters[$parameters['settings']['id'] . 'fieldset'] = [
      '#type' => 'fieldset',
      '#title' => $this->t($parameters['settings']['title']),
    ];

    switch ($parameters['settings']['widget']) {
      case 'select':
        $filters[$parameters['settings']['id'] . 'fieldset'][$parameters['settings']['id']] = [
          '#type' => 'select',
          '#multiple' => $parameters['settings']['cardinality'],
          '#title_display' => 'invisible',
          '#title' => $this->t($parameters['settings']['title']),
          '#empty_option' => $this->t('- Select -'),
          '#default_value' => $request->get($parameters['settings']['id'], []),
          '#options' => $options,
        ];
        break;
      case 'checkbox':
        $filters[$parameters['settings']['id'] . 'fieldset'][$parameters['settings']['id']] = [
          '#type' => $parameters['settings']['cardinality'] ? 'checkboxes' : 'radios',
          '#title_display' => 'invisible',
          '#title' => $this->t($parameters['settings']['title']),
          '#default_value' => $request->get($parameters['settings']['id'], []),
          '#options' => $options,
        ];
        break;
    }

    return $filters;
  }

  /**
   * {@inheritdoc}
   */
  public function configurationFilter(array $default_value, EntityList $entity_list) {
    $configuration = parent::configurationFilter($default_value, $entity_list);
    unset($configuration['order']);
    unset($configuration['exclude']);

    $configuration['field_name'] = [
      '#type' => 'select',
      '#title' => $this->t('Field Name'),
      '#default_value' => $default_value['field_name'] ?? '',
      '#options' => $this->getFieldNameOptions($entity_list),
      '#required' => TRUE,
    ];

    $configuration['allowed_values'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Allowed Values'),
      '#default_value' => $default_value['allowed_values'] ?? '',
      '#required' => TRUE,
      '#description' => $this->t('You need to set values like: id|value per row like list_text'),
    ];

    return $configuration;
  }

  /**
   * Get fields names options
   *
   * @param \Drupal\entity_list\Entity\EntityList $entity_list
   *   This is entity list.
   * @return array
   *   Return array of fields names options.
   */
  public function getFieldNameOptions(EntityList $entity_list) {
    return array_map(function ($element) {
      return $element['label'];
    }, $this->contentFilterService->getAllField($entity_list));
  }

}
+24 −2
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  private $requestStack;
  protected $requestStack;

  /**
   * TaxonomiesEntityListFilter constructor.
@@ -168,6 +168,18 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain
      '#default_value' => $default_value['widget'] ?? '',
    ];

    $configuration['condition_type'] = [
      '#type' => 'select',
      '#title' => $this->t('Condition Type'),
      '#required' => TRUE,
      '#options' => [
        'and' => $this->t('And'),
        'or' => $this->t('Or'),
      ],
      '#default_value' => $default_value['condition_type'] ?? 'and',
      '#description' => $this->t('Condition type between element selected in this filter (or condition need multiple values)'),
    ];

    $configuration['order'] = [
      '#type' => 'select',
      '#title' => $this->t('Order of terms'),
@@ -247,6 +259,7 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain
        'name' => $settings['id'] ?? '',
        'callback_condition' => __CLASS__ . '::taxonomyFilter',
        'field_name' => $settings['field_name'] ?? '',
        'condition_type' => $settings['condition_type'],
      ],
    ];

@@ -272,7 +285,16 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain
      }
    }

    if (!empty($fieldValue)) {
    if (!empty($fieldValue) && $fieldSettings['condition_type'] === 'or' && is_array($fieldValue)) {
      $orCondition = $query->orConditionGroup();

      foreach ($fieldValue as $value) {
        $orCondition->condition($fieldSettings['field_name'], $value);
      }

      $query->condition($orCondition);
    }
    else if (!empty($fieldValue)) {
      $query->condition($fieldSettings['field_name'], $fieldValue, (is_array($fieldValue)) ? 'IN' : '=');
    }
  }
+14 −1
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ class ContentFilterService {
  }

  /**
   * Get field sortable in current node.
   * Get field sortable in current node selected.
   *
   * @param EntityList $entity_list
   *   This is current entity list.
@@ -193,6 +193,19 @@ class ContentFilterService {
   *   Return array of fields in node selected.
   */
  public function getFieldSortable(EntityList $entity_list) {
    return $this->getAllField($entity_list);
  }

  /**
   * Get all field current node selected.
   *
   * @param EntityList $entity_list
   *   This is current entity list.
   *
   * @return array
   *   Return array of fields in node selected.
   */
  public function getAllField(EntityList $entity_list) {
    if (!empty($entity_list->getEntityListQueryPlugin()) && $entity_list->getEntityListQueryPlugin()->getEntityTypeId() === 'node') {
      $bundles = $entity_list->getEntityListQueryPlugin()->getBundles();
      $fields = [];