From 109545fc95fc8edf03e7686c1d19743ec6f4a517 Mon Sep 17 00:00:00 2001 From: mscherer <mark.scherer@spryker.com> Date: Mon, 8 Oct 2018 13:34:06 +0200 Subject: [PATCH 1/5] Add multi value separator --- README.md | 8 ++++++++ src/Model/Filter/Base.php | 37 ++++++++++++++++++++++++++++++------- src/Model/Filter/Like.php | 1 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7f31d3e3..6a53c540 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,10 @@ The following options are supported by all filters except `Callback` and `Finder multiple values. If disabled, and multiple values are being passed, the filter will fall back to using the default value defined by the `defaultValue` option. +- `multiValueSeparator` (`string`, defaults to `null`) Defines whether the filter should + auto-tokenize multiple values using a specific separator string. If disabled, the data + must be an in form of an array. + - `field` (`string|array`), defaults to the name passed to the first argument of the add filter method) The name of the field to use for searching. Works like the base `field` option but also accepts multiple field names as an array. When defining @@ -389,6 +393,10 @@ The following options are supported by all filters except `Callback` and `Finder - `multiValue` (`bool`, defaults to `false`) Defines whether the filter accepts multiple values. If disabled, and multiple values are being passed, the filter will fall back to using the default value defined by the `defaultValue` option. + +- `multiValueSeparator` (`string`, defaults to `null`) Defines whether the filter should + auto-tokenize multiple values using a specific separator string. If disabled, the data + must be an in form of an array. - `mode` (`string`, defaults to `OR`) The conditional mode to use when matching against multiple fields. Valid values are `OR` and `AND`. diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php index 50893d59..ee70ab7f 100644 --- a/src/Model/Filter/Base.php +++ b/src/Model/Filter/Base.php @@ -51,6 +51,7 @@ abstract class Base * @param string $name Name. * @param \Search\Manager $manager Manager. * @param array $config Config. + * @throws \InvalidArgumentException */ public function __construct($name, Manager $manager, array $config = []) { @@ -65,6 +66,7 @@ public function __construct($name, Manager $manager, array $config = []) 'filterEmpty' => false, 'defaultValue' => null, 'multiValue' => false, + 'multiValueSeparator' => null, 'flatten' => true, ]; $config += $defaults; @@ -188,13 +190,34 @@ public function skip() public function value() { $value = $this->_config['defaultValue']; - if (isset($this->_args[$this->name()])) { - $passedValue = $this->_args[$this->name()]; - if (!is_array($passedValue) || - $this->getConfig('multiValue') - ) { - return $passedValue; - } + + $passedValue = $this->passedValue(); + if ($passedValue === null) { + return $value; + } + + if (!is_array($passedValue) || + $this->getConfig('multiValue') + ) { + return $passedValue; + } + + return $value; + } + + /** + * @return string|array|null + */ + public function passedValue() + { + if (!isset($this->_args[$this->name()])) { + return null; + } + + $value = $this->_args[$this->name()]; + + if ($this->getConfig('multiValueSeparator')) { + return explode($this->getConfig('multiValueSeparator'), $value); } return $value; diff --git a/src/Model/Filter/Like.php b/src/Model/Filter/Like.php index 24bfc197..dd7b74ca 100644 --- a/src/Model/Filter/Like.php +++ b/src/Model/Filter/Like.php @@ -143,6 +143,7 @@ protected function _formatWildcards($value) * set configuration for escape driver name * * @return void + * @throws \InvalidArgumentException */ protected function _setEscaper() { From a3014123ce1c93f591d9178b48273bfcb988a0eb Mon Sep 17 00:00:00 2001 From: Mark Sch <dereuromark@users.noreply.github.com> Date: Mon, 8 Oct 2018 15:20:57 +0200 Subject: [PATCH 2/5] Wrap as protected method to keep exploding internally. --- src/Model/Filter/Base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php index ee70ab7f..f53b2aba 100644 --- a/src/Model/Filter/Base.php +++ b/src/Model/Filter/Base.php @@ -208,7 +208,7 @@ public function value() /** * @return string|array|null */ - public function passedValue() + protected function passedValue() { if (!isset($this->_args[$this->name()])) { return null; From 3894fcd65c1f770c06200d69e778e09727e32ba4 Mon Sep 17 00:00:00 2001 From: mscherer <mark.scherer@spryker.com> Date: Mon, 8 Oct 2018 15:26:15 +0200 Subject: [PATCH 3/5] Encapsulate passed value logic --- src/Model/Filter/Base.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php index f53b2aba..b3c0ac39 100644 --- a/src/Model/Filter/Base.php +++ b/src/Model/Filter/Base.php @@ -196,12 +196,6 @@ public function value() return $value; } - if (!is_array($passedValue) || - $this->getConfig('multiValue') - ) { - return $passedValue; - } - return $value; } @@ -216,6 +210,10 @@ protected function passedValue() $value = $this->_args[$this->name()]; + if (is_array($value)) { + return $this->getConfig('multiValue') ? $value : null; + } + if ($this->getConfig('multiValueSeparator')) { return explode($this->getConfig('multiValueSeparator'), $value); } From 07d634f1b0eeb3272276e6634df854c67d42bf8b Mon Sep 17 00:00:00 2001 From: mscherer <mark.scherer@spryker.com> Date: Mon, 8 Oct 2018 15:31:38 +0200 Subject: [PATCH 4/5] Add tests --- src/Model/Filter/Base.php | 4 +-- tests/TestCase/Model/Filter/BaseTest.php | 33 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php index b3c0ac39..2e77954f 100644 --- a/src/Model/Filter/Base.php +++ b/src/Model/Filter/Base.php @@ -196,7 +196,7 @@ public function value() return $value; } - return $value; + return $passedValue; } /** @@ -214,7 +214,7 @@ protected function passedValue() return $this->getConfig('multiValue') ? $value : null; } - if ($this->getConfig('multiValueSeparator')) { + if ($this->getConfig('multiValue') && $this->getConfig('multiValueSeparator')) { return explode($this->getConfig('multiValueSeparator'), $value); } diff --git a/tests/TestCase/Model/Filter/BaseTest.php b/tests/TestCase/Model/Filter/BaseTest.php index 013abfe5..663d1b5e 100644 --- a/tests/TestCase/Model/Filter/BaseTest.php +++ b/tests/TestCase/Model/Filter/BaseTest.php @@ -172,12 +172,45 @@ public function testValue() $filter->setArgs(['field' => ['value1', 'value2']]); $this->assertEquals('default', $filter->value()); + } + + /** + * @return void + */ + public function testValueMultiValue() + { + $filter = new TestFilter( + 'field', + $this->Manager, + ['defaultValue' => 'default'] + ); $filter->setConfig('multiValue', true); $filter->setArgs(['field' => ['value1', 'value2']]); $this->assertEquals(['value1', 'value2'], $filter->value()); } + /** + * @return void + */ + public function testValueMultiValueSeparator() + { + $filter = new TestFilter( + 'field', + $this->Manager, + ['defaultValue' => 'default'] + ); + + $filter->setConfig('multiValue', true); + $filter->setConfig('multiValueSeparator', '|'); + + $filter->setArgs(['field' => 'value1|value2']); + $this->assertEquals(['value1', 'value2'], $filter->value()); + + $filter->setArgs(['field' => ['value1', 'value2']]); + $this->assertEquals(['value1', 'value2'], $filter->value()); + } + /** * @return void */ From 10fa0d5711d98f211105d7df587087ea34508e1c Mon Sep 17 00:00:00 2001 From: mscherer <mark.scherer@spryker.com> Date: Mon, 8 Oct 2018 15:41:10 +0200 Subject: [PATCH 5/5] Add more tests --- src/Model/Filter/Base.php | 2 +- tests/TestCase/Model/Filter/BaseTest.php | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Model/Filter/Base.php b/src/Model/Filter/Base.php index 2e77954f..c7c44b58 100644 --- a/src/Model/Filter/Base.php +++ b/src/Model/Filter/Base.php @@ -214,7 +214,7 @@ protected function passedValue() return $this->getConfig('multiValue') ? $value : null; } - if ($this->getConfig('multiValue') && $this->getConfig('multiValueSeparator')) { + if ($this->getConfig('multiValueSeparator')) { return explode($this->getConfig('multiValueSeparator'), $value); } diff --git a/tests/TestCase/Model/Filter/BaseTest.php b/tests/TestCase/Model/Filter/BaseTest.php index 663d1b5e..f2174dd4 100644 --- a/tests/TestCase/Model/Filter/BaseTest.php +++ b/tests/TestCase/Model/Filter/BaseTest.php @@ -201,14 +201,27 @@ public function testValueMultiValueSeparator() ['defaultValue' => 'default'] ); - $filter->setConfig('multiValue', true); $filter->setConfig('multiValueSeparator', '|'); $filter->setArgs(['field' => 'value1|value2']); $this->assertEquals(['value1', 'value2'], $filter->value()); + } - $filter->setArgs(['field' => ['value1', 'value2']]); - $this->assertEquals(['value1', 'value2'], $filter->value()); + /** + * @return void + */ + public function testValueMultiValueSeparatorInvalid() + { + $filter = new TestFilter( + 'field', + $this->Manager, + ['defaultValue' => 'default'] + ); + + $filter->setConfig('multiValue', true); + + $filter->setArgs(['field' => 'value1|value2']); + $this->assertEquals('value1|value2', $filter->value()); } /**