From 53547143ef2e16845f4e16681732a8c04ed0be0f Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Tue, 23 May 2017 11:00:13 -0400 Subject: [PATCH 01/12] PHP7 Compatibility release --- extension.meta.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extension.meta.xml b/extension.meta.xml index 3fe24bf..6558b95 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -14,6 +14,9 @@ + + - PHP7 Compatibility + - Set 'entry_id' as unique From 5dc4bfcee38b9cb6a41ac9e8d8738e8108da9939 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Wed, 23 Aug 2017 11:29:19 -0400 Subject: [PATCH 02/12] Release version up to Symphony 3.x.x - PHP7 Compatibility --- extension.meta.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.meta.xml b/extension.meta.xml index 6558b95..de7823b 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -14,7 +14,7 @@ - + - PHP7 Compatibility From a962e231a62b92e5b68621ccfae37ceb27add408 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Wed, 23 Aug 2017 11:40:17 -0400 Subject: [PATCH 03/12] Release to 2.x.x max --- extension.meta.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.meta.xml b/extension.meta.xml index de7823b..636d4f1 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -14,7 +14,7 @@ - + - PHP7 Compatibility From 41a22917077b0ddcde3c550fbb586bf25892a512 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Wed, 23 Aug 2017 11:55:50 -0400 Subject: [PATCH 04/12] Release version for Symphony 2.x.x --- extension.meta.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.meta.xml b/extension.meta.xml index 636d4f1..db909f1 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -15,7 +15,7 @@ - - PHP7 Compatibility + - PHP7 Compatibility for Symphony 2.x.x - Set 'entry_id' as unique From 9401adc2e9c89eccae544f49f64a256e7aec4b8d Mon Sep 17 00:00:00 2001 From: Roman Klein Date: Tue, 22 Aug 2017 21:58:31 +0200 Subject: [PATCH 05/12] Documentation Fixes (#15) --- README.md | 13 +++++++++---- fields/field.number.php | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0d29742..b569b2b 100755 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Input field that provides built-in number validation and numeric sorting. The number field provides two additional datasource filtering methods: -### Range filtering +### 1) Range filtering You can easily filter by a numeric range on the number field on your datasource. Simply enter something like this: @@ -24,13 +24,18 @@ Just like any other datasource filter, you can make these values dynamic: {$url-lower-limit} to {$url-upper-limit} -This would let you pass through the upper and lower limit as url parameters. E.g. `/products/?lower-limit-10&upper-limit=20` +This would let you pass through the upper and lower limit as url parameters. E.g. `/products/?lower-limit=10&upper-limit=20` -### Less than or greater than +### 2) Less than or greater than You can also use standard greater than or less than symbols in the filter value or you can use words. e.g. > 20 greater than 20 -This will return all entries that have a value greater than 20. \ No newline at end of file +This will return all entries that have a value greater than 20. + + <= 20 + equal to or less than 20 + +This will return all entries that have a value of 20 or less. \ No newline at end of file diff --git a/fields/field.number.php b/fields/field.number.php index f3a991b..4c4dab4 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -230,7 +230,7 @@ public function fetchFilterableOperators() array( 'title' => 'between', 'filter' => 'x to y', - 'help' => __('Find values between two values with, %s to %s', array( + 'help' => __('Find values between two values with %s to %s', array( '$x', '$y' )) From 5635c196aa3bcc68732bad296bfa21177700226a Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Thu, 24 Aug 2017 15:53:28 -0400 Subject: [PATCH 06/12] SQL and PHP cases PHP true,false,null in lowercase SQL keywords uppercase --- extension.driver.php | 4 ++-- fields/field.number.php | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extension.driver.php b/extension.driver.php index dc0288d..57b782a 100755 --- a/extension.driver.php +++ b/extension.driver.php @@ -9,8 +9,8 @@ public function uninstall() { public function install() { return Symphony::Database()->query(" CREATE TABLE `tbl_fields_number` ( - `id` int(11) unsigned NOT NULL auto_increment, - `field_id` int(11) unsigned NOT NULL, + `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `field_id` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `field_id` (`field_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci diff --git a/fields/field.number.php b/fields/field.number.php index 4c4dab4..3862aa4 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -38,9 +38,9 @@ public function canPrePopulate() { public function createTable() { return Symphony::Database()->query( "CREATE TABLE IF NOT EXISTS `tbl_entries_data_" . $this->get('id') . "` ( - `id` int(11) unsigned NOT NULL auto_increment, - `entry_id` int(11) unsigned NOT NULL, - `value` double default NULL, + `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `entry_id` INT(11) UNSIGNED NOT NULL, + `value` DOUBLE DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `entry_id` (`entry_id`), KEY `value` (`value`) @@ -55,7 +55,7 @@ public function createTable() { public function displaySettingsPanel(XMLElement &$wrapper, $errors = null) { parent::displaySettingsPanel($wrapper, $errors); - $div = new XMLElement('div', NULL, array('class' => 'two columns')); + $div = new XMLElement('div', null, array('class' => 'two columns')); $this->appendRequiredCheckbox($div); $this->appendShowColumnCheckbox($div); $wrapper->appendChild($div); @@ -85,11 +85,11 @@ public function displayPublishPanel(XMLElement &$wrapper, $data = null, $flagWit $label->appendChild( Widget::Input( 'fields'.$fieldnamePrefix.'['.$this->get('element_name').']'.$fieldnamePostfix, - (strlen($value) != 0 ? $value : NULL) + (strlen($value) != 0 ? $value : null) ) ); - if($flagWithError != NULL) { + if($flagWithError != null) { $wrapper->appendChild(Widget::Error($label, $flagWithError)); } else { @@ -98,7 +98,7 @@ public function displayPublishPanel(XMLElement &$wrapper, $data = null, $flagWit } public function checkPostFieldData($data, &$message, $entry_id = null) { - $message = NULL; + $message = null; if($this->get('required') == 'yes' && strlen($data) == 0){ $message = __('ā€˜%sā€™ is a required field.', array($this->get('label'))); @@ -113,7 +113,7 @@ public function checkPostFieldData($data, &$message, $entry_id = null) { return self::__OK__; } - public function processRawFieldData($data, &$status, &$message=null, $simulate = false, $entry_id = null) { + public function processRawFieldData($data, &$status, &$message = null, $simulate = false, $entry_id = null) { $status = self::__OK__; if (strlen(trim($data)) == 0) return array(); From 60744becdcac2251dd94232ea4b8a11643566b01 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Fri, 25 Aug 2017 11:26:42 -0400 Subject: [PATCH 07/12] Relase infos .. Again --- extension.meta.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extension.meta.xml b/extension.meta.xml index db909f1..605721e 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -14,6 +14,9 @@ + + - Update for Symphony 4.x + - PHP7 Compatibility for Symphony 2.x.x From b75cadd351ad9cade0c9581255395d1510c2a6cc Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Wed, 30 May 2018 15:45:57 -0400 Subject: [PATCH 08/12] Code refactoring for Database --- extension.driver.php | 32 +++++++++++++++++++++++--------- extension.meta.xml | 3 ++- fields/field.number.php | 33 +++++++++++++++++++++++---------- 3 files changed, 48 insertions(+), 20 deletions(-) diff --git a/extension.driver.php b/extension.driver.php index 57b782a..0be7e37 100755 --- a/extension.driver.php +++ b/extension.driver.php @@ -3,18 +3,32 @@ Class extension_numberfield extends Extension { public function uninstall() { - Symphony::Database()->query("DROP TABLE `tbl_fields_number`"); + Symphony::Database() + ->drop('tbl_fields_number') + ->ifExists() + ->execute() + ->success(); } public function install() { - return Symphony::Database()->query(" - CREATE TABLE `tbl_fields_number` ( - `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, - `field_id` INT(11) UNSIGNED NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `field_id` (`field_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci - "); + return Symphony::Database() + ->create('tbl_fields_number') + ->ifNotExists() + ->charset('utf8') + ->collate('utf8_unicode_ci') + ->fields([ + 'id' => [ + 'type' => 'int(11)', + 'auto' => true, + ], + 'field_id' => 'int(11)', + ]) + ->keys([ + 'id' => 'primary', + 'field_id' => 'unique', + ]) + ->execute() + ->success(); } } diff --git a/extension.meta.xml b/extension.meta.xml index 605721e..fc06b4f 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -1,6 +1,6 @@ - Number Field + Field: Number Dedicated number storage https://github.com/symphonycms/numberfield http://getsymphony.com/discuss/thread/144/ @@ -16,6 +16,7 @@ - Update for Symphony 4.x + - Code refactoring for Database and EQFA - PHP7 Compatibility for Symphony 2.x.x diff --git a/fields/field.number.php b/fields/field.number.php index 3862aa4..2843dfa 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -36,16 +36,29 @@ public function canPrePopulate() { } public function createTable() { - return Symphony::Database()->query( - "CREATE TABLE IF NOT EXISTS `tbl_entries_data_" . $this->get('id') . "` ( - `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, - `entry_id` INT(11) UNSIGNED NOT NULL, - `value` DOUBLE DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `entry_id` (`entry_id`), - KEY `value` (`value`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci" - ); + return Symphony::Database() + ->create('tbl_entries_data_' . $this->get('id')) + ->ifNotExists() + ->charset('utf8') + ->collate('utf8_unicode_ci') + ->fields([ + 'id' => [ + 'type' => 'int(11)', + 'auto' => true, + ], + 'entry_id' => 'int(11)', + 'value' => [ + 'type' => 'double', + 'null' => true, + ], + ]) + ->keys([ + 'id' => 'primary', + 'entry_id' => 'unique', + 'value' => 'key', + ]) + ->execute() + ->success(); } /*------------------------------------------------------------------------- From 02ae0a6ab1d2a5ee6e3f761ce56d8ac3e38fec87 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Wed, 30 May 2018 16:44:59 -0400 Subject: [PATCH 09/12] Code refactoring for EQFA --- fields/field.number.php | 6 +- lib/class.entryquerynumberadapter.php | 115 ++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 lib/class.entryquerynumberadapter.php diff --git a/fields/field.number.php b/fields/field.number.php index 2843dfa..d8a3b47 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -2,12 +2,16 @@ require_once FACE . '/interface.exportablefield.php'; require_once FACE . '/interface.importablefield.php'; + require_once EXTENSIONS . '/numberfield/lib/class.entryquerynumberadapter.php'; class FieldNumber extends Field implements ExportableField, ImportableField { public function __construct() { parent::__construct(); + $this->entryQueryFieldAdapter = new EntryQueryNumberAdapter($this); + $this->_name = __('Number'); $this->_required = true; + $this->set('required', 'no'); } @@ -242,7 +246,7 @@ public function fetchFilterableOperators() ), array( 'title' => 'between', - 'filter' => 'x to y', + 'filter' => 'between ', 'help' => __('Find values between two values with %s to %s', array( '$x', '$y' diff --git a/lib/class.entryquerynumberadapter.php b/lib/class.entryquerynumberadapter.php new file mode 100644 index 0000000..b9b9079 --- /dev/null +++ b/lib/class.entryquerynumberadapter.php @@ -0,0 +1,115 @@ +field->get('id')); + $filter = $this->field->cleanValue($filter); + $matches = []; + preg_match('/^between:? ?(-?(?:\d+(?:\.\d+)?|\.\d+)) and (-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter, $matches); + + $conditions = []; + foreach ($columns as $key => $col) { + $conditions[] = [$this->formatColumn($col, $field_id) => ['between' => [(int)$matches[1], (int)$matches[2]]]]; + } + if (count($conditions) < 2) { + return $conditions; + } + return ['or' => $conditions]; + } + + public function isFilterEqualLesserGreater($filter) + { + return preg_match('/^(equal to or )?(less|greater) than\s*(-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter); + } + + public function createFilterEqualLesserGreater($filter, array $columns) + { + $field_id = General::intval($this->field->get('id')); + $filter = $this->field->cleanValue($filter); + $matches = []; + preg_match('/^(equal to or )?(less|greater) than\s*(-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter, $matches); + + switch($matches[2]) { + case 'less': + $expression .= '<'; + break; + + case 'greater': + $expression .= '>'; + break; + } + + if($matches[1]){ + $expression .= '='; + } + + $conditions = []; + foreach ($columns as $key => $col) { + $conditions[] = [$this->formatColumn($col, $field_id) => [$expression => (int)$matches[3]]]; + } + if (count($conditions) < 2) { + return $conditions; + } + return ['or' => $conditions]; + } + + public function isFilterSymbol($filter) + { + return preg_match('/^(=?[<>]=?)\s*(-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter); + } + + public function createFilterSymbol($filter, array $columns) + { + $field_id = General::intval($this->field->get('id')); + $filter = $this->field->cleanValue($filter); + $matches = []; + preg_match('/^(=?[<>]=?)\s*(-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter, $matches); + + $conditions = []; + foreach ($columns as $key => $col) { + $conditions[] = [$this->formatColumn($col, $field_id) => [$matches[1] => (int)$matches[2]]]; + } + if (count($conditions) < 2) { + return $conditions; + } + return ['or' => $conditions]; + } + + /** + * @see EntryQueryFieldAdapter::filterSingle() + * + * @param EntryQuery $query + * @param string $filter + * @return array + */ + protected function filterSingle(EntryQuery $query, $filter) + { + General::ensureType([ + 'filter' => ['var' => $filter, 'type' => 'string'], + ]); + if ($this->isFilterBetween($filter)) { + return $this->createFilterBetween($filter, $this->getFilterColumns()); + } elseif ($this->isFilterEqualLesserGreater($filter)) { + return $this->createFilterEqualLesserGreater($filter, $this->getFilterColumns()); + } elseif ($this->isFilterSymbol($filter)) { + return $this->createFilterSymbol($filter, $this->getFilterColumns()); + } + return $this->createFilterEquality($filter, $this->getFilterColumns()); + } +} From e06f916063412b132c8e91eade26afe93e6f2c07 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Thu, 31 May 2018 10:03:21 -0400 Subject: [PATCH 10/12] Add forgotten "return" for uninstall method --- extension.driver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension.driver.php b/extension.driver.php index 0be7e37..500842b 100755 --- a/extension.driver.php +++ b/extension.driver.php @@ -3,7 +3,7 @@ Class extension_numberfield extends Extension { public function uninstall() { - Symphony::Database() + return Symphony::Database() ->drop('tbl_fields_number') ->ifExists() ->execute() From 684eef9b8184c93b81dd88afa3ac8be1b0b165d2 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Tue, 18 Dec 2018 09:47:01 -0500 Subject: [PATCH 11/12] Remote SQL collate and charset definitions. --- extension.driver.php | 2 -- fields/field.number.php | 2 -- 2 files changed, 4 deletions(-) diff --git a/extension.driver.php b/extension.driver.php index 500842b..94187f7 100755 --- a/extension.driver.php +++ b/extension.driver.php @@ -14,8 +14,6 @@ public function install() { return Symphony::Database() ->create('tbl_fields_number') ->ifNotExists() - ->charset('utf8') - ->collate('utf8_unicode_ci') ->fields([ 'id' => [ 'type' => 'int(11)', diff --git a/fields/field.number.php b/fields/field.number.php index d8a3b47..a8c5934 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -43,8 +43,6 @@ public function createTable() { return Symphony::Database() ->create('tbl_entries_data_' . $this->get('id')) ->ifNotExists() - ->charset('utf8') - ->collate('utf8_unicode_ci') ->fields([ 'id' => [ 'type' => 'int(11)', From cc471cf13dbd34ada1274c3c7c166e64fe89ce79 Mon Sep 17 00:00:00 2001 From: Alexandra Nantel Date: Tue, 18 Dec 2018 13:28:02 -0500 Subject: [PATCH 12/12] Apply patch from @beaubbe. --- fields/field.number.php | 10 +++++++++- lib/class.entryquerynumberadapter.php | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/fields/field.number.php b/fields/field.number.php index a8c5934..3f663b0 100755 --- a/fields/field.number.php +++ b/fields/field.number.php @@ -244,7 +244,15 @@ public function fetchFilterableOperators() ), array( 'title' => 'between', - 'filter' => 'between ', + 'filter' => 'between: ', + 'help' => __('Find values between two values with %s and %s', array( + '$x', + '$y' + )) + ), + array( + 'title' => 'to', + 'filter' => ' to ', 'help' => __('Find values between two values with %s to %s', array( '$x', '$y' diff --git a/lib/class.entryquerynumberadapter.php b/lib/class.entryquerynumberadapter.php index b9b9079..e4ea908 100644 --- a/lib/class.entryquerynumberadapter.php +++ b/lib/class.entryquerynumberadapter.php @@ -33,6 +33,28 @@ public function createFilterBetween($filter, array $columns) return ['or' => $conditions]; } + public function isFilterTo($filter) + { + return preg_match('/^(-?(?:\d+(?:\.\d+)?|\.\d+)) to (-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter); + } + + public function createFilterTo($filter, array $columns) + { + $field_id = General::intval($this->field->get('id')); + $filter = $this->field->cleanValue($filter); + $matches = []; + preg_match('/^(-?(?:\d+(?:\.\d+)?|\.\d+)) to (-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter, $matches); + + $conditions = []; + foreach ($columns as $key => $col) { + $conditions[] = [$this->formatColumn($col, $field_id) => ['between' => [(int)$matches[1], (int)$matches[2]]]]; + } + if (count($conditions) < 2) { + return $conditions; + } + return ['or' => $conditions]; + } + public function isFilterEqualLesserGreater($filter) { return preg_match('/^(equal to or )?(less|greater) than\s*(-?(?:\d+(?:\.\d+)?|\.\d+))$/i', $filter); @@ -105,6 +127,8 @@ protected function filterSingle(EntryQuery $query, $filter) ]); if ($this->isFilterBetween($filter)) { return $this->createFilterBetween($filter, $this->getFilterColumns()); + } elseif ($this->isFilterTo($filter)) { + return $this->createFilterTo($filter, $this->getFilterColumns()); } elseif ($this->isFilterEqualLesserGreater($filter)) { return $this->createFilterEqualLesserGreater($filter, $this->getFilterColumns()); } elseif ($this->isFilterSymbol($filter)) {