diff --git a/config/schema/facets.facetsource.schema.yml b/config/schema/facets.facetsource.schema.yml index 962703e..8cf0e35 100644 --- a/config/schema/facets.facetsource.schema.yml +++ b/config/schema/facets.facetsource.schema.yml @@ -14,3 +14,6 @@ facets.facet_source.*: filterKey: type: string label: 'Filter key' + url_processor: + type: string + label: 'Url processor' diff --git a/facets.services.yml b/facets.services.yml index c33a611..01d4ee8 100644 --- a/facets.services.yml +++ b/facets.services.yml @@ -11,6 +11,9 @@ services: plugin.manager.facets.processor: class: Drupal\facets\Processor\ProcessorPluginManager arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@string_translation'] + plugin.manager.facets.url_processor: + class: Drupal\facets\UrlProcessor\UrlProcessorPluginManager + parent: default_plugin_manager facets.manager: class: Drupal\facets\FacetManager\DefaultFacetManager arguments: diff --git a/src/Annotation/FacetsUrlProcessor.php b/src/Annotation/FacetsUrlProcessor.php new file mode 100644 index 0000000..1075384 --- /dev/null +++ b/src/Annotation/FacetsUrlProcessor.php @@ -0,0 +1,48 @@ +filterKey; } + /** + * {@inheritdoc} + */ + public function setUrlProcessor($processor_name) { + $this->urlProcessor = $processor_name; + } + + /** + * {@inheritdoc} + */ + public function getUrlProcessor() { + + // If the instance is already loaded, don't bother trying to reload it, just + // return it. + if ($this->urlProcessorInstance instanceof UrlProcessorInterface) { + return $this->urlProcessorInstance; + } + + $manager = \Drupal::getContainer()->get('plugin.manager.facets.url_processor'); + $this->urlProcessorInstance = $manager->createInstance($this->urlProcessor); + + return $this->urlProcessorInstance; + } + + /** + * {@inheritdoc} + */ + public function getUrlProcessorName() { + return $this->urlProcessor; + } + } diff --git a/src/FacetSourceInterface.php b/src/FacetSourceInterface.php index 8395760..a02cac8 100644 --- a/src/FacetSourceInterface.php +++ b/src/FacetSourceInterface.php @@ -38,4 +38,28 @@ interface FacetSourceInterface extends ConfigEntityInterface { */ public function setFilterKey($filter_key); + /** + * Set the processor name to be used. + * + * @param string $processor_name + * Plugin name of the url processor. + */ + public function setUrlProcessor($processor_name); + + /** + * Returns an instance of the url processor. + * + * @return \Drupal\facets\UrlProcessor\UrlProcessorInterface + * The url processor to be used. + */ + public function getUrlProcessor(); + + /** + * Returns a string version of the url processor. + * + * @return string + * The url processor to be used as a string. + */ + public function getUrlProcessorName(); + } diff --git a/src/Form/FacetSourceEditForm.php b/src/Form/FacetSourceEditForm.php index 067a39f..1eaba54 100644 --- a/src/Form/FacetSourceEditForm.php +++ b/src/Form/FacetSourceEditForm.php @@ -8,8 +8,11 @@ namespace Drupal\facets\Form; use Drupal\Core\Entity\EntityForm; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\facets\Entity\FacetSource; +use Drupal\facets\UrlProcessor\UrlProcessorPluginManager; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form for editing facet sources. @@ -20,10 +23,32 @@ use Drupal\facets\Entity\FacetSource; class FacetSourceEditForm extends EntityForm { /** + * The plugin manager for URL Processors. + * + * @var \Drupal\facets\UrlProcessor\UrlProcessorPluginManager + */ + protected $urlProcessorPluginManager; + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $etm */ + $etm = $container->get('entity_type.manager'); + + /** @var \Drupal\facets\UrlProcessor\UrlProcessorPluginManager $uppm */ + $uppm = $container->get('plugin.manager.facets.url_processor'); + + return new static($etm, $uppm); + } + + /** * Constructs a FacetSourceEditForm. */ - public function __construct() { - $facet_source_storage = \Drupal::entityTypeManager()->getStorage('facets_facet_source'); + public function __construct(EntityTypeManagerInterface $entity_type_manager, UrlProcessorPluginManager $url_processor_plugin_manager) { + $facet_source_storage = $entity_type_manager->getStorage('facets_facet_source'); + + $this->urlProcessorPluginManager = $url_processor_plugin_manager; // Make sure we remove colons from the source id, those are disallowed in // the entity id. @@ -81,6 +106,17 @@ class FacetSourceEditForm extends EntityForm { ), ]; + $url_processors = array(); + foreach ($this->urlProcessorPluginManager->getDefinitions() as $definition) { + $url_processors[$definition['id']] = $definition['label']; + } + $form['urlProcessor'] = [ + '#type' => 'select', + '#title' => $this->t('URL Processor'), + '#options' => $url_processors, + '#default_value' => $facet_source->getUrlProcessorName(), + ]; + // The parent's form build method will add a save button. return parent::buildForm($form, $form_state); } diff --git a/src/Plugin/facets/processor/UrlProcessorHandler.php b/src/Plugin/facets/processor/UrlProcessorHandler.php new file mode 100644 index 0000000..aa653fd --- /dev/null +++ b/src/Plugin/facets/processor/UrlProcessorHandler.php @@ -0,0 +1,72 @@ +getFacetSourceConfig(); + + $this->processor = $fs->getUrlProcessor(); + } + + /** + * {@inheritdoc} + */ + public function build(FacetInterface $facet, array $results) { + $this->processor->buildUrls($facet, $results); + } + + /** + * {@inheritdoc} + */ + public function preQuery(FacetInterface $facet) { + $this->processor->setActiveItems($facet); + } + +} diff --git a/src/Plugin/facets/processor/QueryStringUrlProcessor.php b/src/Plugin/facets/url_processor/QueryString.php similarity index 86% rename from src/Plugin/facets/processor/QueryStringUrlProcessor.php rename to src/Plugin/facets/url_processor/QueryString.php index 3c53a32..346b294 100644 --- a/src/Plugin/facets/processor/QueryStringUrlProcessor.php +++ b/src/Plugin/facets/url_processor/QueryString.php @@ -2,31 +2,26 @@ /** * @file - * Contains Drupal\facets\Plugin\facets\url_processor\UrlProcessorQueryString. + * Contains Drupal\facets\Plugin\facets\url_processor\QueryString. */ -namespace Drupal\facets\Plugin\facets\processor; +namespace Drupal\facets\Plugin\facets\url_processor; use Drupal\Core\Url; use Drupal\facets\FacetInterface; -use Drupal\facets\Processor\UrlProcessorPluginBase; +use Drupal\facets\UrlProcessor\UrlProcessorPluginBase; use Symfony\Component\HttpFoundation\Request; /** - * The basic url processor, uses query strings. + * Query string URL processor. * - * @FacetsProcessor( + * @FacetsUrlProcessor( * id = "query_string", * label = @Translation("Query string url processor"), - * description = @Translation("Most simple url processor which uses the query sting."), - * stages = { - * "pre_query" = 50, - * "build" = 15, - * }, - * locked = true + * description = @Translation("Most simple url processor which uses the query sting.") * ) */ -class QueryStringUrlProcessor extends UrlProcessorPluginBase { +class QueryString extends UrlProcessorPluginBase { /** * A string that separates the filters in the query string. @@ -59,7 +54,7 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { /** * {@inheritdoc} */ - public function build(FacetInterface $facet, array $results) { + public function buildUrls(FacetInterface $facet, array $results) { // Create links for all the values. // First get the current list of get parameters. $get_params = $this->request->query; @@ -108,7 +103,7 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { /** * {@inheritdoc} */ - public function preQuery(FacetInterface $facet) { + public function setActiveItems(FacetInterface $facet) { // Set the url alias from the the facet object. $this->url_alias = $facet->getUrlAlias(); diff --git a/src/Tests/FacetSourceTest.php b/src/Tests/FacetSourceTest.php index 3beef1d..92d179e 100644 --- a/src/Tests/FacetSourceTest.php +++ b/src/Tests/FacetSourceTest.php @@ -29,11 +29,17 @@ class FacetSourceTest extends FacetWebTestBase { $this->clickLink($this->t('Configure')); // Test the edit page. + $edit = array( + 'filterKey' => 'fq', + 'urlProcessor' => 'query_string', + ); $this->assertField('filterKey'); - $this->drupalPostForm(NULL, array('filterKey' => 'fq'), $this->t('Save')); + $this->assertField('urlProcessor'); + $this->drupalPostForm(NULL, $edit, $this->t('Save')); // Test that saving worked. $this->assertField('filterKey'); + $this->assertField('urlProcessor'); $this->assertRaw('fq'); } diff --git a/src/Processor/UrlProcessorInterface.php b/src/UrlProcessor/UrlProcessorInterface.php similarity index 65% rename from src/Processor/UrlProcessorInterface.php rename to src/UrlProcessor/UrlProcessorInterface.php index 31aeb9c..e040db4 100644 --- a/src/Processor/UrlProcessorInterface.php +++ b/src/UrlProcessor/UrlProcessorInterface.php @@ -1,10 +1,12 @@ request = $request; if (!isset($configuration['facet'])) { - throw new InvalidProcessorException(); + throw new InvalidProcessorException("The url processor doesn't have the required 'facet' in the configuration array."); } /** @var \Drupal\facets\FacetInterface $facet */ diff --git a/src/UrlProcessor/UrlProcessorPluginManager.php b/src/UrlProcessor/UrlProcessorPluginManager.php new file mode 100644 index 0000000..d3f3dcf --- /dev/null +++ b/src/UrlProcessor/UrlProcessorPluginManager.php @@ -0,0 +1,36 @@ +setCacheBackend($cache_backend, 'facets_url_processors'); + } + +} diff --git a/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php b/tests/src/Unit/Plugin/url_processor/QueryStringUrlProcessorTest.php similarity index 83% rename from tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php rename to tests/src/Unit/Plugin/url_processor/QueryStringUrlProcessorTest.php index 1b4c58f..9698c84 100644 --- a/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php +++ b/tests/src/Unit/Plugin/url_processor/QueryStringUrlProcessorTest.php @@ -2,14 +2,14 @@ /** * @file - * Contains \Drupal\Tests\facets\Plugin\Processor\QueryStringUrlProcessorTest. + * Contains \Drupal\Tests\facets\Plugin\url_processor\QueryStringTest. */ -namespace Drupal\Tests\facets\Unit\Plugin\Processor; +namespace Drupal\Tests\facets\Unit\Plugin\url_processor; use Drupal\facets\Entity\Facet; use Drupal\facets\Entity\FacetSource; -use Drupal\facets\Plugin\facets\processor\QueryStringUrlProcessor; +use Drupal\facets\Plugin\facets\url_processor\QueryString; use Drupal\facets\Result\Result; use Drupal\Tests\UnitTestCase; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -21,12 +21,12 @@ use Symfony\Component\HttpFoundation\Request; * * @group facets */ -class QueryStringUrlProcessorTest extends UnitTestCase { +class QueryStringTest extends UnitTestCase { /** * The processor to be tested. * - * @var \Drupal\facets\Plugin\facets\processor\QueryStringUrlProcessor + * @var \Drupal\facets\Plugin\facets\url_processor\QueryString */ protected $processor; @@ -66,8 +66,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('f', ['test:badger']); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $this->processor->preQuery($facet); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $this->processor->setActiveItems($facet); $this->assertEquals(['badger'], $facet->getActiveItems()); } @@ -84,8 +84,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('f', ['test:badger', 'test:mushroom', 'donkey:kong']); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $this->processor->preQuery($facet); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $this->processor->setActiveItems($facet); $this->assertEquals(['badger', 'mushroom'], $facet->getActiveItems()); } @@ -101,8 +101,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('f', []); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $results = $this->processor->build($facet, []); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $results = $this->processor->buildUrls($facet, []); $this->assertEmpty($results); } @@ -118,8 +118,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('f', []); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $results = $this->processor->build($facet, $this->originalResults); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $results = $this->processor->buildUrls($facet, $this->originalResults); /** @var \Drupal\facets\Result\ResultInterface $r */ foreach ($results as $r) { @@ -143,8 +143,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('f', ['king:kong']); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $results = $this->processor->build($facet, $original_results); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $results = $this->processor->buildUrls($facet, $original_results); /** @var \Drupal\facets\Result\ResultInterface $r */ foreach ($results as $k => $r) { @@ -188,8 +188,8 @@ class QueryStringUrlProcessorTest extends UnitTestCase { $request = new Request(); $request->query->set('ab', []); - $this->processor = new QueryStringUrlProcessor(['facet' => $facet], 'query_string', [], $request); - $results = $this->processor->build($facet, $this->originalResults); + $this->processor = new QueryString(['facet' => $facet], 'query_string', [], $request); + $results = $this->processor->buildUrls($facet, $this->originalResults); /** @var \Drupal\facets\Result\ResultInterface $r */ foreach ($results as $r) {