contacts_events-8.x-1.x-dev/modules/contacts_events_segments/src/Plugin/views/filter/SegmentFilter.php
modules/contacts_events_segments/src/Plugin/views/filter/SegmentFilter.php
<?php namespace Drupal\contacts_events_segments\Plugin\views\filter; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\views\Plugin\views\filter\InOperator; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Filter handler for Segments. * * @ingroup views_filter_handlers * * @ViewsFilter("contacts_event_segment") */ class SegmentFilter extends InOperator { /** * Entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * The argument used to build the value options. * * This is used to make sure we rebuild the options if the available argument * is changed. * * @var mixed */ protected $eventId; /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { $self = parent::create($container, $configuration, $plugin_id, $plugin_definition); $self->entityTypeManager = $container->get('entity_type.manager'); return $self; } /** * {@inheritdoc} */ public function buildExposeForm(&$form, FormStateInterface $form_state) { parent::buildExposeForm($form, $form_state); $form['value']['#description'] = $this->t('If this view uses an argument for the event, this list will be filtered to the enabled set of segments for the event when an argument is present.'); } /** * {@inheritdoc} */ public function getValueOptions() { // Reset the options if our event ID is different. $event_id = $this->getEventId(); if ($event_id != $this->eventId) { $this->valueOptions = NULL; } if (isset($this->valueOptions)) { return $this->valueOptions; } $this->valueOptions['any_segment'] = new TranslatableMarkup('- Any day ticket -'); // If we have an argument to pull the filtered list from, populate the // value options. if ($event_id) { $segments = $this->entityTypeManager->getStorage('contacts_event_segment') ->loadByProperties(['event' => $event_id]); foreach ($segments as $segment) { /** @var \Drupal\contacts_events_segments\Entity\Segment $segment */ $this->valueOptions[$segment->id()] = $segment->label(); } } return $this->valueOptions; } /** * {@inheritdoc} */ protected function exposedTranslate(&$form, $type) { parent::exposedTranslate($form, $type); // Rename the 'All' option from '- Any -' to '- All tickets -'. if (isset($form['#options']['All'])) { $form['#options']['All'] = new TranslatableMarkup('- All Tickets -'); } } /** * {@inheritdoc} */ protected function opSimple() { if (in_array('any_segment', $this->value)) { // If user has selected 'Any day ticket' then do a not null on // the segment field. $this->ensureMyTable(); $this->query->addWhere($this->options['group'], "$this->tableAlias.$this->realField", NULL, 'IS NOT NULL'); } else { parent::opSimple(); } } /** * Get the event ID we are filtering on. * * @return int|null * The event ID or NULL if we can't find the argument. */ protected function getEventId() { if (isset($this->view->argument)) { foreach ($this->view->argument as $argument) { if ($argument->table == 'contacts_ticket' && $argument->field == 'event') { $arg = $argument->getValue(); if ($arg && $argument->validateArgument($arg)) { return $arg; } return NULL; } } } return NULL; } }