Commit 686a86fd authored by Guy Elsmore-Paddock's avatar Guy Elsmore-Paddock Committed by Thomas Seiber
Browse files

Issue #3232736 by GuyPaddock, idebr, drunken monkey: Added query tags as an option to Views.

parent 19beaf57
Loading
Loading
Loading
Loading
+2 −0
Changes for CHANGELOG.txt: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
Search API 1.x, dev (xxxx-xx-xx):
---------------------------------
- #3232736 by GuyPaddock, idebr, drunken monkey: Added query tags as an option
  to Views.
- #3188138 by drunken monkey, devad: Added an "Item URL" field to Views.

Search API 1.23 (2022-01-21):
+6 −0
Changes for config/schema/search_api.views.schema.yml: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -11,6 +11,12 @@ views.query.search_api_query:
    preserve_facet_query_args:
      type: boolean
      label: By default, changing an exposed filter would reset all selected facets. This option allows you to prevent this behavior.
    query_tags:
      type: sequence
      label: 'Query Tags'
      sequence:
        type: string
        label: 'Tag'

views.row.search_api:
  type: views_row
+33 −0
Changes for src/Plugin/views/query/SearchApiQuery.php: 33 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -369,6 +369,9 @@ class SearchApiQuery extends QueryPluginBase {
      'preserve_facet_query_args' => [
        'default' => FALSE,
      ],
      'query_tags' => [
        'default' => [],
      ],
    ];
  }

@@ -408,6 +411,29 @@ class SearchApiQuery extends QueryPluginBase {
        '#value' => FALSE,
      ];
    }

    $form['query_tags'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Query Tags'),
      '#description' => $this->t('If set, these tags will be appended to the query and can be used to identify the query in a module. This can be helpful for altering queries.'),
      '#default_value' => implode(', ', $this->options['query_tags']),
      '#element_validate' => ['views_element_validate_tags'],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function submitOptionsForm(&$form, FormStateInterface $form_state) {
    $value = &$form_state->getValue(['query', 'options', 'query_tags']);
    if (is_array($value)) {
      // We already ran on this form state. This happens when the user toggles a
      // display to override defaults or vice-versa – the submit handler gets
      // invoked twice, and we don't want to bash the values  from the original
      // call.
      return;
    }
    $value = array_filter(array_map('trim', explode(',', $value)));
  }

  /**
@@ -522,6 +548,13 @@ class SearchApiQuery extends QueryPluginBase {
      $this->query->setOption('search_api_base_path', $path);
    }

    // Add the query tags.
    if (!empty($this->options['query_tags'])) {
      foreach ($this->options['query_tags'] as $tag) {
        $this->query->addTag($tag);
      }
    }

    // Save query information for Views UI.
    $view->build_info['query'] = (string) $this->query;

+6 −0
Changes for tests/search_api_test_views/search_api_test_views.services.yml: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
services:
  search_api_test_views.event_listener:
    class: Drupal\search_api_test_views\EventListener
    arguments: ['@messenger']
    tags:
      - { name: event_subscriber }
+49 −0
Changes for tests/search_api_test_views/src/EventListener.php: 49 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Drupal\search_api_test_views;

use Drupal\Core\Messenger\MessengerInterface;
use Drupal\search_api\Event\SearchApiEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Provides an event listener for testing purposes.
 *
 * @see \Drupal\Tests\search_api\Functional\ViewsTest
 */
class EventListener implements EventSubscriberInterface {

  /**
   * The messenger.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * Constructs a new class instance.
   *
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   */
  public function __construct(MessengerInterface $messenger) {
    $this->messenger = $messenger;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      SearchApiEvents::QUERY_PRE_EXECUTE . '.weather' => 'queryTagAlter',
    ];
  }

  /**
   * Reacts to the query TAG alter event.
   */
  public function queryTagAlter(): void {
    $this->messenger->addStatus('Sunshine');
  }

}
Loading