diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Query.php b/lib/Alchemy/Phrasea/Controller/Prod/Query.php index 971a086bd1..7b8e6bc675 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Query.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Query.php @@ -12,6 +12,7 @@ namespace Alchemy\Phrasea\Controller\Prod; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; +use Alchemy\Phrasea\Controller\SearchEngineRequest; use Silex\Application; use Silex\ControllerProviderInterface; use Symfony\Component\HttpFoundation\JsonResponse; @@ -99,89 +100,9 @@ class Query implements ControllerProviderInterface $mod = $app['phraseanet.user']->getPrefs('view'); $json = array(); - - $options = new SearchEngineOptions(); - $options->disallowBusinessFields(); - - $bas = $app['phraseanet.user']->ACL()->get_granted_base(); - - if (is_array($request->request->get('bas'))) { - $bas = array_map(function($base_id) use ($app) { - return \collection::get_from_base_id($app, $base_id); - }, $request->request->get('bas')); - } - - $databoxes = array(); - - foreach ($bas as $collection) { - if (!isset($databoxes[$collection->get_sbas_id()])) { - $databoxes[$collection->get_sbas_id()] = $collection->get_databox(); - } - } - - if ($app['phraseanet.user']->ACL()->has_right('modifyrecord')) { - $BF = array_filter($bas, function($collection) use ($app) { - return $app['phraseanet.user']->ACL()->has_right_on_base($collection->get_base_id(), 'canmodifrecord'); - }); - - $options->allowBusinessFieldsOn($BF); - } - - $status = is_array($request->request->get('status')) ? $request->request->get('status') : array(); - $fields = is_array($request->request->get('fields')) ? $request->request->get('fields') : array(); - - $databoxFields = array(); - - foreach ($databoxes as $databox) { - foreach ($fields as $field) { - try { - $databoxField = $databox->get_meta_structure()->get_element_by_name($field); - } catch (\Exception $e) { - continue; - } - if ($databoxField) { - $databoxFields[] = $databoxField; - } - } - } - - - $options->setFields($databoxFields); - $options->setStatus($status); - $options->onCollections($bas); - - $options->setSearchType($request->request->get('search_type')); - $options->setRecordType($request->request->get('recordtype')); - - $min_date = $max_date = null; - if ($request->request->get('datemin')) { - $min_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->request->get('datemin') . ' 00:00:00'); - } - if ($request->request->get('datemax')) { - $max_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->request->get('datemax') . ' 23:59:59'); - } - - $options->setMinDate($min_date); - $options->setMaxDate($max_date); - - $databoxDateFields = array(); - - foreach ($databoxes as $databox) { - foreach (explode('|', $request->request->get('datefield')) as $field) { - try { - $databoxField = $databox->get_meta_structure()->get_element_by_name($field); - } catch (\Exception $e) { - continue; - } - if ($databoxField) { - $databoxDateFields[] = $databoxField; - } - } - } - - $options->setDateFields($databoxDateFields); - $options->setSort($request->request->get('sort'), $request->request->get('ord', PHRASEA_ORDER_DESC)); - $options->useStemming($request->request->get('stemme')); + + $SearchRequest = SearchEngineRequest::fromRequest($app, $request); + $options = $SearchRequest->getOptions(); $form = $options->serialize(); diff --git a/lib/Alchemy/Phrasea/Controller/SearchEngineRequest.php b/lib/Alchemy/Phrasea/Controller/SearchEngineRequest.php new file mode 100644 index 0000000000..f9c9277a4d --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/SearchEngineRequest.php @@ -0,0 +1,119 @@ +options = $options; + } + + public function getOptions() + { + return $this->options; + } + + public static function fromRequest(Application $app, Request $request) + { + $options = new SearchEngineOptions(); + + $options->disallowBusinessFields(); + + $bas = $app['phraseanet.user']->ACL()->get_granted_base(); + + if (is_array($request->request->get('bases'))) { + $bas = array_map(function($base_id) use ($app) { + return \collection::get_from_base_id($app, $base_id); + }, $request->request->get('bases')); + } + + $databoxes = array(); + + foreach ($bas as $collection) { + if (!isset($databoxes[$collection->get_sbas_id()])) { + $databoxes[$collection->get_sbas_id()] = $collection->get_databox(); + } + } + + if ($app['phraseanet.user']->ACL()->has_right('modifyrecord')) { + $BF = array_filter($bas, function($collection) use ($app) { + return $app['phraseanet.user']->ACL()->has_right_on_base($collection->get_base_id(), 'canmodifrecord'); + }); + + $options->allowBusinessFieldsOn($BF); + } + + $status = is_array($request->request->get('status')) ? $request->request->get('status') : array(); + $fields = is_array($request->request->get('fields')) ? $request->request->get('fields') : array(); + + $databoxFields = array(); + + foreach ($databoxes as $databox) { + foreach ($fields as $field) { + try { + $databoxField = $databox->get_meta_structure()->get_element_by_name($field); + } catch (\Exception $e) { + continue; + } + if ($databoxField) { + $databoxFields[] = $databoxField; + } + } + } + + $options->setFields($databoxFields); + $options->setStatus($status); + $options->onCollections($bas); + + $options->setSearchType($request->request->get('search_type')); + $options->setRecordType($request->request->get('record_type')); + + $min_date = $max_date = null; + if ($request->request->get('date_min')) { + $min_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->request->get('date_min') . ' 00:00:00'); + } + if ($request->request->get('date_max')) { + $max_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->request->get('date_max') . ' 23:59:59'); + } + + $options->setMinDate($min_date); + $options->setMaxDate($max_date); + + $databoxDateFields = array(); + + foreach ($databoxes as $databox) { + foreach (explode('|', $request->request->get('date_field')) as $field) { + try { + $databoxField = $databox->get_meta_structure()->get_element_by_name($field); + } catch (\Exception $e) { + continue; + } + if ($databoxField) { + $databoxDateFields[] = $databoxField; + } + } + } + + $options->setDateFields($databoxDateFields); + $options->setSort($request->request->get('sort'), $request->request->get('ord', SearchEngineOptions::SORT_MODE_DESC)); + $options->useStemming((Boolean) $request->request->get('stemme')); + + return new static($options); + } +} diff --git a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php b/lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php index d59a5cc83d..8f2d3f8da1 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php +++ b/lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php @@ -109,7 +109,7 @@ class SearchEngineOptions */ public function setLocale($locale) { - if (!preg_match('/[a-z]{2,3}/', $locale)) { + if ($locale && !preg_match('/[a-z]{2,3}/', $locale)) { throw new \InvalidArgumentException('Locale must be a valid i18n code'); } @@ -501,7 +501,7 @@ class SearchEngineOptions throw new \InvalidArgumentException('SearchEngineOptions data are corrupted'); } - $options = new SearchEngineOptions(); + $options = new static(); $options->disallowBusinessFields(); foreach ($serialized as $key => $value) { diff --git a/lib/classes/API/V1/adapter.class.php b/lib/classes/API/V1/adapter.class.php index 266200892e..e5c86a1670 100644 --- a/lib/classes/API/V1/adapter.class.php +++ b/lib/classes/API/V1/adapter.class.php @@ -9,11 +9,11 @@ * file that was distributed with this source code. */ +use Alchemy\Phrasea\Controller\SearchEngineRequest; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Border\File; use Alchemy\Phrasea\Border\Attribute\Status; use Alchemy\Phrasea\Border\Manager as BorderManager; -use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; use Symfony\Component\HttpFoundation\Request; /** @@ -1010,10 +1010,10 @@ class API_V1_adapter extends API_V1_Abstract $this->app['phraseanet.SE']->setOptions($options); $this->app['phraseanet.SE']->resetCache(); - $search_result = $this->app['phraseanet.SE']->query($params['query'], $params["offset_start"], $perPage); + $search_result = $this->app['phraseanet.SE']->query($request->get('query'), $offsetStart, $perPage); $ret = array( - 'offset_start' => $params["offset_start"], + 'offset_start' => $offsetStart, 'per_page' => $perPage, 'available_results' => $search_result->available(), 'total_results' => $search_result->total(), diff --git a/lib/classes/phrasea.class.php b/lib/classes/phrasea.class.php index befe33ab9a..8d9bb7623c 100644 --- a/lib/classes/phrasea.class.php +++ b/lib/classes/phrasea.class.php @@ -116,12 +116,12 @@ class phrasea $parm["sel"] = ''; $parm["ord"] = null; $parm["search_type"] = 0; - $parm["recordtype"] = ''; + $parm["record_type"] = ''; $parm["status"] = array(); $parm["fields"] = array(); - $parm["datemin"] = ''; - $parm["datemax"] = ''; - $parm["datefield"] = ''; + $parm["date_min"] = ''; + $parm["date_max"] = ''; + $parm["date_field"] = ''; } if ($context == "client") { $parm["mod"] = $app['phraseanet.user']->getPrefs('client_view'); @@ -133,10 +133,10 @@ class phrasea $parm["opAdv"] = array(); $parm["status"] = ''; $parm["nba"] = ''; - $parm["datemin"] = ''; - $parm["datemax"] = ''; - $parm["recordtype"] = ''; - $parm["datefield"] = ''; + $parm["date_min"] = ''; + $parm["date_max"] = ''; + $parm["record_type"] = ''; + $parm["date_field"] = ''; $parm["sort"] = $app['phraseanet.registry']->get('GV_phrasea_sort'); $parm["stemme"] = ''; $parm["dateminfield"] = array(); diff --git a/templates/web/prod/index.html.twig b/templates/web/prod/index.html.twig index 3d1a90e988..ae62d0ea36 100644 --- a/templates/web/prod/index.html.twig +++ b/templates/web/prod/index.html.twig @@ -25,7 +25,7 @@ onclick="cancelEvent(event);return false;" onmousedown="infoSbas(this, {{sbas_id}}, false, event); return false;" id="ck_{{collection["base_id"]}}_{{unique_id}}" type="checkbox" - name="bas[]" value="{{collection["base_id"]}}" {% if collection["selected"] %}checked="checked"{% endif %} /> + name="bases[]" value="{{collection["base_id"]}}" {% if collection["selected"] %}checked="checked"{% endif %} /> {% endfor %} @@ -308,7 +308,7 @@ {% else %} {% endif %} - @@ -412,7 +412,7 @@
- {% for field in app['phraseanet.SE'].getAvailableDateFields() %} @@ -426,11 +426,11 @@
{% trans 'phraseanet::time:: de' %}
- +
{% trans 'phraseanet::time:: a' %}
- +
diff --git a/templates/web/prod/thesaurus.js b/templates/web/prod/thesaurus.js index f81d3414d1..7c10c0550b 100644 --- a/templates/web/prod/thesaurus.js +++ b/templates/web/prod/thesaurus.js @@ -776,7 +776,7 @@ function CXdblClick(e) function doThesSearch(type, sbid, term, field) { var nck = 0; - $('#adv_search input[name="bas[]"]').each( + $('#adv_search input[name="bases[]"]').each( function(i,n) { var base_id = $(n).val(); diff --git a/www/client/answer.php b/www/client/answer.php index 4921c45c3b..c2fea2819f 100644 --- a/www/client/answer.php +++ b/www/client/answer.php @@ -9,7 +9,9 @@ */ use Alchemy\Phrasea\Application; +use Alchemy\Phrasea\Controller\SearchEngineRequest; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; +use Symfony\Component\HttpFoundation\Request; /** * @@ -20,16 +22,17 @@ use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; require_once __DIR__ . "/../../lib/bootstrap.php"; $app = new Application(); +$request = Request::createFromGlobals(); if ( ! isset($parm)) { - $request = http_request::getInstance(); - $parm = $request->get_parms("mod", "bas" + $http_request = http_request::getInstance(); + $parm = $http_request->get_parms("mod", "bases" , "pag" - , "qry", "search_type", "recordtype" - , "qryAdv", 'opAdv', 'status', 'datemin', 'datemax' + , "qry", "search_type", "record_type" + , "qryAdv", 'opAdv', 'status', 'date_min', 'date_max' , 'dateminfield', 'datemaxfield' - , 'datefield' + , 'date_field' , 'sort' , 'stemme' , 'infield' @@ -58,7 +61,7 @@ if ($qry == '') $parm['qry'] = $qry; $qrySbas = array(); -if (is_null($parm['bas'])) { +if (is_null($parm['bases'])) { echo 'vous devez selectionner des collections dans lesquelles chercher'; return; @@ -80,94 +83,8 @@ $mod_xy = $mod_col * $mod_row; $tbases = array(); -$options = new SearchEngineOptions(); -$options->disallowBusinessFields(); - -$bas = $app['phraseanet.user']->ACL()->get_granted_base(); - -if (is_array($parm['bas'])) { - $bas = array_map(function($base_id) use ($app) { - return \collection::get_from_base_id($app, $base_id); - }, $parm['bas']); -} - -$databoxes = array(); - -foreach ($bas as $collection) { - if (!isset($databoxes[$collection->get_sbas_id()])) { - $databoxes[$collection->get_sbas_id()] = $collection->get_databox(); - } -} - -if ($app['phraseanet.user']->ACL()->has_right('modifyrecord')) { - $BF = array_filter($bas, function($collection) use ($app) { - return $app['phraseanet.user']->ACL()->has_right_on_base($collection->get_base_id(), 'canmodifrecord'); - }); - - $options->allowBusinessFieldsOn($BF); -} - -$status = is_array($parm['status']) ? $parm['status'] : array(); -$fields = is_array($parm['infield']) ? $parm['infield'] : array(); - -$databoxFields = array(); - -foreach ($databoxes as $databox) { - foreach ($fields as $field) { - try { - $databoxField = $databox->get_meta_structure()->get_element_by_name($field); - } catch (\Exception $e) { - continue; - } - if ($databoxField) { - $databoxFields[] = $databoxField; - } - } -} - - -$options->setFields($databoxFields); -$options->setStatus($status); -$options->onCollections($bas); - -$options->setSearchType($parm['search_type']); -$options->setRecordType($parm['recordtype']); - -$min_date = $max_date = null; -if ($parm['datemin']) { - $min_date = \DateTime::createFromFormat('Y/m/d H:i:s', $parm['datemin'] . ' 00:00:00'); -} -if ($parm['datemax']) { - $max_date = \DateTime::createFromFormat('Y/m/d H:i:s', $parm['datemax'] . ' 23:59:59'); -} - -$options->setMinDate($min_date); -$options->setMaxDate($max_date); - - -$databoxDateFields = array(); - -foreach ($databoxes as $databox) { - foreach (explode('|', $parm['datefield']) as $field) { - try { - $databoxField = $databox->get_meta_structure()->get_element_by_name($field); - } catch (\Exception $e) { - continue; - } - if ($databoxField) { - $databoxDateFields[] = $databoxField; - } - } -} - -if ($parm['ord'] === NULL) - $parm['ord'] = \searchEngine_options::SORT_MODE_DESC; -else - $parm['ord'] = (int) $parm['ord']; - -$options->setDateFields($databoxDateFields); -$options->setSort($parm['sort'], $parm['ord']); -$options->useStemming($parm['stemme']); +$searchRequest = SearchEngineRequest::fromRequest($app, $request); +$options = $searchRequest->getOptions(); $form = $options->serialize(); diff --git a/www/client/index.php b/www/client/index.php index 4d61154d7d..0d9d4ca019 100644 --- a/www/client/index.php +++ b/www/client/index.php @@ -224,7 +224,7 @@ if ($app['phraseanet.registry']->get('GV_client_coll_ckbox') === 'popup') { $allbcol[] = $coll->get_base_id(); $n_allbcol ++; - echo ''; + echo ''; $options .= ''; @@ -392,9 +392,9 @@ if ($app['phraseanet.registry']->get('GV_thesaurus')) { '' . '' . '' . - ' ' . + ' ' . '' . - ' ' . + ' ' . '' . ''; } elseif ($field['type'] != 'date') { @@ -422,7 +422,7 @@ if ($app['phraseanet.registry']->get('GV_thesaurus')) { ?>
ACL()->get_granted_base(array(), array($databox->get_sbas_id())) as $coll) { $s = "checked"; - echo '
'; + echo '
'; } ?>
get('GV_view_bas_and_coll')) diff --git a/www/prod/page0.js b/www/prod/page0.js index e16a480eb7..ed93cf0892 100644 --- a/www/prod/page0.js +++ b/www/prod/page0.js @@ -265,9 +265,9 @@ function checkFilters(save) $('.status_filter', adv_box) .addClass('danger'); }); - search.dates.minbound = $('.date_filter input[name=datemin]', adv_box).val(); - search.dates.maxbound = $('.date_filter input[name=datemax]', adv_box).val(); - search.dates.field = $('.date_filter select[name=datefield]', adv_box).val(); + search.dates.minbound = $('.date_filter input[name=date_min]', adv_box).val(); + search.dates.maxbound = $('.date_filter input[name=date_max]', adv_box).val(); + search.dates.field = $('.date_filter select[name=date_field]', adv_box).val(); if($.trim(search.dates.minbound) || $.trim(search.dates.maxbound)) {