Loading src/Form/EntityListFilterParametersForm.php +1 −1 Original line number Diff line number Diff line Loading @@ -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'] = [ Loading src/Plugin/EntityListExtraDisplay/FiltersEntityListExtraDisplay.php +24 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading src/Plugin/EntityListFilter/CustomListEntityListFilter.php 0 → 100644 +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)); } } src/Plugin/EntityListFilter/TaxonomiesEntityListFilter.php +24 −2 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain * * @var \Symfony\Component\HttpFoundation\RequestStack */ private $requestStack; protected $requestStack; /** * TaxonomiesEntityListFilter constructor. Loading Loading @@ -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'), Loading Loading @@ -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'], ], ]; Loading @@ -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' : '='); } } Loading src/Service/ContentFilterService.php +14 −1 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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 = []; Loading Loading
src/Form/EntityListFilterParametersForm.php +1 −1 Original line number Diff line number Diff line Loading @@ -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'] = [ Loading
src/Plugin/EntityListExtraDisplay/FiltersEntityListExtraDisplay.php +24 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading
src/Plugin/EntityListFilter/CustomListEntityListFilter.php 0 → 100644 +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)); } }
src/Plugin/EntityListFilter/TaxonomiesEntityListFilter.php +24 −2 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ class TaxonomiesEntityListFilter extends EntityListFilterBase implements Contain * * @var \Symfony\Component\HttpFoundation\RequestStack */ private $requestStack; protected $requestStack; /** * TaxonomiesEntityListFilter constructor. Loading Loading @@ -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'), Loading Loading @@ -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'], ], ]; Loading @@ -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' : '='); } } Loading
src/Service/ContentFilterService.php +14 −1 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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 = []; Loading