diff --git a/config/schema/facetapi.facet.schema.yml b/config/schema/facetapi.facet.schema.yml index 107f409..ee8571d 100644 --- a/config/schema/facetapi.facet.schema.yml +++ b/config/schema/facetapi.facet.schema.yml @@ -14,6 +14,9 @@ facetapi.facet.*: status: type: boolean label: 'Status' + url_parameter: + type: label + label: 'URL Parameter name' facet_source_id: type: string label: 'Facet source id' diff --git a/src/Entity/Facet.php b/src/Entity/Facet.php index aeb2480..fb10862 100644 --- a/src/Entity/Facet.php +++ b/src/Entity/Facet.php @@ -37,6 +37,7 @@ use Drupal\facetapi\FacetInterface; * config_export = { * "id", * "name", + * "url_parameter", * "field_identifier", * "query_type_name", * "facet_source_id", @@ -73,6 +74,13 @@ class Facet extends ConfigEntityBase implements FacetInterface { protected $name; /** + * The name for the parameter when used in the URL. + * + * @var string + */ + protected $url_parameter; + + /** * A string describing the index. * * @var string @@ -416,6 +424,20 @@ class Facet extends ConfigEntityBase implements FacetInterface { /** * {@inheritdoc} */ + public function getUrlParameter() { + return $this->url_parameter; + } + + /** + * {@inheritdoc} + */ + public function setUrlParameter($url_parameter) { + $this->url_parameter = $url_parameter; + } + + /** + * {@inheritdoc} + */ protected function urlRouteParameters($rel) { $parameters = parent::urlRouteParameters($rel); return $parameters; diff --git a/src/FacetInterface.php b/src/FacetInterface.php index bffa349..1012989 100644 --- a/src/FacetInterface.php +++ b/src/FacetInterface.php @@ -74,6 +74,21 @@ interface FacetInterface extends ConfigEntityInterface { * @return mixed */ public function getName(); + + /** + * Gets the name of the facet for use in the URL. + * + * @param string $url_parameter + */ + public function getUrlParameter(); + + /** + * Sets the name of the facet for use in the URL. + * + * @param string $url_parameter + */ + public function setUrlParameter($url_parameter); + /** * Sets an item with value to active. * diff --git a/src/Form/FacetForm.php b/src/Form/FacetForm.php index c934fd5..91823df 100644 --- a/src/Form/FacetForm.php +++ b/src/Form/FacetForm.php @@ -174,6 +174,15 @@ class FacetForm extends EntityForm { ], ]; + $form['url_parameter'] = [ + '#type' => 'textfield', + '#title' => $this->t('The name of the facet for usage in URLs'), + '#description' => $this->t('Enter the name of the facet for usage in URLs, this has to adhere to the URL standards.'), + '#default_value' => $facet->getUrlParameter(), + '#maxlength' => 50, + '#required' => TRUE, + ]; + $facet_sources = []; foreach ($this->getFacetSourcePluginManager()->getDefinitions() as $facet_source_id => $definition) { $facet_sources[$definition['id']] = !empty($definition['label']) ? $definition['label'] : $facet_source_id; diff --git a/src/Plugin/facetapi/processor/QueryStringUrlProcessor.php b/src/Plugin/facetapi/processor/QueryStringUrlProcessor.php index 709e12f..4216bcc 100644 --- a/src/Plugin/facetapi/processor/QueryStringUrlProcessor.php +++ b/src/Plugin/facetapi/processor/QueryStringUrlProcessor.php @@ -32,6 +32,13 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { const SEPARATOR = ':'; /** + * A string of how to represent the facet in the url. + * + * @var string + */ + protected $url_parameter; + + /** * @var array * An array containing the active filters */ @@ -49,6 +56,7 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { * {@inheritdoc} */ public function build(FacetInterface $facet, array $results) { + // Create links for all the values. // First get the current list of get parameters. $get_params = $this->request->query; @@ -58,9 +66,11 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { return []; } + $this->url_parameter = $facet->getUrlParameter(); + /** @var \Drupal\facetapi\Result\ResultInterface $result */ foreach ($results as &$result) { - $filter_string = $facet->getFieldAlias() . ':' . $result->getRawValue(); + $filter_string = $this->url_parameter . ':' . $result->getRawValue(); $result_get_params = clone $get_params; $filter_params = $result_get_params->get($this->filter_key, [], TRUE); @@ -95,9 +105,12 @@ class QueryStringUrlProcessor extends UrlProcessorPluginBase { * {@inheritdoc} */ public function preQuery(FacetInterface $facet) { + + $this->url_parameter = $facet->getUrlParameter(); + // Get the filter key of the facet. - if (isset($this->active_filters[$facet->getFieldAlias()])) { - foreach ($this->active_filters[$facet->getFieldAlias()] as $value) { + if (isset($this->active_filters[$this->url_parameter])) { + foreach ($this->active_filters[$this->url_parameter] as $value) { $facet->setActiveItem(trim($value, '"')); } } diff --git a/src/Tests/IntegrationTest.php b/src/Tests/IntegrationTest.php index 84d4d4d..6c9a9e7 100644 --- a/src/Tests/IntegrationTest.php +++ b/src/Tests/IntegrationTest.php @@ -7,6 +7,7 @@ namespace Drupal\facetapi\Tests; +use Drupal\Component\Utility\Xss; use \Drupal\facetapi\Tests\WebTestBase as FacetWebTestBase; /** @@ -258,6 +259,7 @@ class IntegrationTest extends FacetWebTestBase { 'name' => '', 'id' => $facet_id, 'status' => 1, + 'url_parameter' => Xss::filter($facet_name), ]; // Try filling out the form, but without having filled in a name for the diff --git a/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php b/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php index ad41c24..a93467a 100644 --- a/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php +++ b/tests/src/Unit/Plugin/processor/QueryStringUrlProcessorTest.php @@ -52,7 +52,7 @@ class QueryStringUrlProcessorTest extends UnitTestCase { public function testSetSingleActiveItem() { $facet = new Facet([], 'facet'); $facet->setResults($this->original_results); - $facet->setFieldIdentifier('test'); + $facet->setUrlParameter('test'); $request = new Request; $request->query->set('f', ['test:badger']); @@ -66,7 +66,7 @@ class QueryStringUrlProcessorTest extends UnitTestCase { public function testSetMultipleActiveItems() { $facet = new Facet([], 'facet'); $facet->setResults($this->original_results); - $facet->setFieldIdentifier('test'); + $facet->setUrlParameter('test'); $request = new Request; $request->query->set('f', ['test:badger', 'test:mushroom', 'donkey:kong']); @@ -90,7 +90,7 @@ class QueryStringUrlProcessorTest extends UnitTestCase { public function testBuild() { $facet = new Facet([], 'facet'); - $facet->setFieldIdentifier('test'); + $facet->setUrlParameter('test'); $request = new Request; $request->query->set('f', []); @@ -107,9 +107,29 @@ class QueryStringUrlProcessorTest extends UnitTestCase { } } - public function testBuildWithActiveItem() { + public function testBuildChangedUrlParameter() { $facet = new Facet([], 'facet'); $facet->setFieldIdentifier('test'); + $facet->setUrlParameter('aah'); + + $request = new Request; + $request->query->set('f', []); + + $this->setRouter(); + + $this->processor = new QueryStringUrlProcessor([], 'query_string', [], $request); + $results = $this->processor->build($facet, $this->original_results); + + /** @var \Drupal\facetapi\Result\ResultInterface $r */ + foreach ($results as $r) { + $this->assertInstanceOf('\Drupal\facetapi\Result\ResultInterface', $r); + $this->assertEquals('route:test?f[0]=aah%3A' . $r->getRawValue(), $r->getUrl()->toUriString()); + } + } + + public function testBuildWithActiveItem() { + $facet = new Facet([], 'facet'); + $facet->setUrlParameter('test'); $original_results = $this->original_results; $original_results[2]->setActiveState(TRUE);