From 4d06a21a06351ce56abd06bf6af3335fcd9022a4 Mon Sep 17 00:00:00 2001 From: Ivan Zgoniaiko Date: Tue, 22 Sep 2015 17:26:15 +0300 Subject: [PATCH 1/5] Add filter by multiple searchable columns --- Resources/views/Internal/script.html.twig | 3 +-- Util/Factory/Query/DoctrineBuilder.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Resources/views/Internal/script.html.twig b/Resources/views/Internal/script.html.twig index 52583b3..f5fc3e8 100644 --- a/Resources/views/Internal/script.html.twig +++ b/Resources/views/Internal/script.html.twig @@ -165,7 +165,6 @@ $(document).ready(function(){ } {% if search %} - $(".dataTables_filter").remove(); var search_selector = "#{{id}} input[searchable=true]"; $(search_selector).keypress( function (event) { var index = $(this).attr('index'); @@ -193,4 +192,4 @@ $(document).ready(function(){ } }); {% endif %} -}); \ No newline at end of file +}); diff --git a/Util/Factory/Query/DoctrineBuilder.php b/Util/Factory/Query/DoctrineBuilder.php index 496ee14..7f546d4 100644 --- a/Util/Factory/Query/DoctrineBuilder.php +++ b/Util/Factory/Query/DoctrineBuilder.php @@ -90,6 +90,22 @@ protected function _addSearch(\Doctrine\ORM\QueryBuilder $queryBuilder) $queryBuilder->setParameter("ssearch{$i}", '%' . $request->get("sSearch_{$i}") . '%'); } } + + $search_param = $request->get("sSearch"); + if ($search_param !== false && $search_param != '') + { + $search_dql = array(); + foreach ($search_fields as $i => $search_field) + { + $field = explode(' ', trim($search_field)); + $search_field = $field[0]; + + $search_dql[] = "$search_field like :ssearch"; + } + + $queryBuilder->andWhere(implode(' OR ', $search_dql)); + $queryBuilder->setParameter("ssearch", '%' . $request->get("sSearch") . '%'); + } } } From bea3a16f8a809d321ebb5a680a3ab16a8a4948a2 Mon Sep 17 00:00:00 2001 From: Ivan Zgoniaiko Date: Mon, 19 Oct 2015 12:49:36 +0300 Subject: [PATCH 2/5] Make global search configurable --- Resources/views/Internal/script.html.twig | 4 +++ .../DatatableBundle/Util/DatatableTest.php | 27 +++++++++++++++++++ Twig/Extension/AliDatatableExtension.php | 1 + Util/Datatable.php | 17 +++++++++++- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Resources/views/Internal/script.html.twig b/Resources/views/Internal/script.html.twig index f5fc3e8..f2edb8b 100644 --- a/Resources/views/Internal/script.html.twig +++ b/Resources/views/Internal/script.html.twig @@ -164,6 +164,10 @@ $(document).ready(function(){ }); } + {% if not search_global %} + $(".dataTables_filter").remove(); + {% endif %} + {% if search %} var search_selector = "#{{id}} input[searchable=true]"; $(search_selector).keypress( function (event) { diff --git a/Tests/Ali/DatatableBundle/Util/DatatableTest.php b/Tests/Ali/DatatableBundle/Util/DatatableTest.php index cdbc419..18baf96 100644 --- a/Tests/Ali/DatatableBundle/Util/DatatableTest.php +++ b/Tests/Ali/DatatableBundle/Util/DatatableTest.php @@ -200,6 +200,33 @@ public function test_getSearch() $this->assertInternalType('boolean', $this->_datatable->getSearch()); } + public function test_getSearchGlobalDisabled() + { + $this->_datatable + ->setEntity('Ali\DatatableBundle\Entity\Product', 'p') + ->setFields( + array( + "title" => 'p.name', + "_identifier_" => 'p.id')) + ->setOrder('p.id', 'asc') + ; + $this->assertFalse($this->_datatable->getSearchGlobal()); + } + + public function test_getSearchGlobalEnabled() + { + $this->_datatable + ->setEntity('Ali\DatatableBundle\Entity\Product', 'p') + ->setFields( + array( + "title" => 'p.name', + "_identifier_" => 'p.id')) + ->setOrder('p.id', 'asc') + ->setSearch(true, true) + ; + $this->assertTrue($this->_datatable->getSearchGlobal()); + } + public function test_setRenderders() { $out = $this->_datatable diff --git a/Twig/Extension/AliDatatableExtension.php b/Twig/Extension/AliDatatableExtension.php index c4bdf06..53ebfb9 100644 --- a/Twig/Extension/AliDatatableExtension.php +++ b/Twig/Extension/AliDatatableExtension.php @@ -53,6 +53,7 @@ public function datatable($options) $options['fields'] = $dt->getFields(); $options['delete_form'] = $this->createDeleteForm('_id_')->createView(); $options['search'] = $dt->getSearch(); + $options['search_global'] = $dt->getSearchGlobal(); $options['search_fields'] = $dt->getSearchFields(); $options['multiple'] = $dt->getMultiple(); $options['sort'] = is_null($dt->getOrderField()) ? NULL : array(array_search( diff --git a/Util/Datatable.php b/Util/Datatable.php index f0ee592..852e570 100644 --- a/Util/Datatable.php +++ b/Util/Datatable.php @@ -54,6 +54,9 @@ class Datatable /** @var boolean */ protected $_search; + /** @var boolean */ + protected $_search_global; + /** @var array */ protected $_search_fields = array(); @@ -294,6 +297,16 @@ public function getSearch() return $this->_search; } + /** + * get global search + * + * @return boolean + */ + public function getSearchGlobal() + { + return $this->_search_global; + } + /** * set entity * @@ -528,12 +541,14 @@ public function setGroupBy($groupby) * set search * * @param bool $search + * @param bool $global * * @return \Ali\DatatableBundle\Util\Datatable */ - public function setSearch($search) + public function setSearch($search, $global = false) { $this->_search = $search; + $this->_search_global = $global; $this->_queryBuilder->setSearch($search); return $this; } From 8291c276224a0af99f60eaf8d381b3d89d0246af Mon Sep 17 00:00:00 2001 From: Ivan Zgoniaiko Date: Wed, 21 Oct 2015 14:54:03 +0300 Subject: [PATCH 3/5] Use either global or per-field search --- Resources/views/Internal/script.html.twig | 5 +---- .../DatatableBundle/Util/DatatableTest.php | 19 +++++++++++++++++++ Util/Datatable.php | 6 +++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Resources/views/Internal/script.html.twig b/Resources/views/Internal/script.html.twig index f2edb8b..2df51b1 100644 --- a/Resources/views/Internal/script.html.twig +++ b/Resources/views/Internal/script.html.twig @@ -164,11 +164,8 @@ $(document).ready(function(){ }); } - {% if not search_global %} - $(".dataTables_filter").remove(); - {% endif %} - {% if search %} + $(".dataTables_filter").remove(); var search_selector = "#{{id}} input[searchable=true]"; $(search_selector).keypress( function (event) { var index = $(this).attr('index'); diff --git a/Tests/Ali/DatatableBundle/Util/DatatableTest.php b/Tests/Ali/DatatableBundle/Util/DatatableTest.php index 18baf96..94bf72e 100644 --- a/Tests/Ali/DatatableBundle/Util/DatatableTest.php +++ b/Tests/Ali/DatatableBundle/Util/DatatableTest.php @@ -211,6 +211,25 @@ public function test_getSearchGlobalDisabled() ->setOrder('p.id', 'asc') ; $this->assertFalse($this->_datatable->getSearchGlobal()); + + $this->_datatable + ->setSearch(true) + ; + + $this->assertFalse($this->_datatable->getSearchGlobal()); + + $this->_datatable + ->setSearch(true, false) + ; + + $this->assertFalse($this->_datatable->getSearchGlobal()); + + $this->_datatable + ->setSearch(false, false) + ; + + $this->assertFalse($this->_datatable->getSearchGlobal()); + } public function test_getSearchGlobalEnabled() diff --git a/Util/Datatable.php b/Util/Datatable.php index 852e570..3702d31 100644 --- a/Util/Datatable.php +++ b/Util/Datatable.php @@ -547,9 +547,9 @@ public function setGroupBy($groupby) */ public function setSearch($search, $global = false) { - $this->_search = $search; - $this->_search_global = $global; - $this->_queryBuilder->setSearch($search); + $this->_search = $search; + $this->_search_global = $search && $global; + $this->_queryBuilder->setSearch($this->_search || $this->_search_global); return $this; } From 7b36bbf114eb71bc89214b95a3e98b464027ed29 Mon Sep 17 00:00:00 2001 From: Ivan Zgoniaiko Date: Mon, 21 Mar 2016 15:55:47 +0200 Subject: [PATCH 4/5] Set default for multiple search --- Util/Datatable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Util/Datatable.php b/Util/Datatable.php index 3ffc1c3..acd6230 100644 --- a/Util/Datatable.php +++ b/Util/Datatable.php @@ -52,7 +52,7 @@ class Datatable protected $_search; /** @var boolean */ - protected $_search_global; + protected $_search_global = false; /** @var array */ protected $_search_fields = array(); From 6fecd9b54d51a2d9f9af9b37c25d30be3d4dfd86 Mon Sep 17 00:00:00 2001 From: Marcin Chwedziak Date: Tue, 19 Jan 2016 15:36:57 +0100 Subject: [PATCH 5/5] Make this bundle work with PHP 7.0.x releases --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b44f5ee..5e933b0 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ } ], "require": { - "php": "~5.3|7.0", + "php": "~5.3|~7.0.0", "twig/twig": ">=1.8,<2.0-dev", "doctrine/orm": "~2.3", "doctrine/doctrine-bundle": "~1.0"