[SearchEngine] Add SearchRequest object

This commit is contained in:
Romain Neutron
2012-10-30 18:10:32 +01:00
parent 5be95d55fc
commit 858d0fda35
10 changed files with 160 additions and 203 deletions

View File

@@ -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;
@@ -100,88 +101,8 @@ class Query implements ControllerProviderInterface
$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();

View File

@@ -0,0 +1,119 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2012 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Controller;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\SearchEngine\SearchEngineOptions;
use Symfony\Component\HttpFoundation\Request;
class SearchEngineRequest
{
private $options;
public function __construct(SearchEngineOptions $options)
{
$this->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);
}
}

View File

@@ -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) {

View File

@@ -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(),

View File

@@ -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();

View File

@@ -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 %} />
</label>
</li>
{% endfor %}
@@ -308,7 +308,7 @@
{% else %}
<input type="hidden" value="0" name="search_type" />
{% endif %}
<select name="recordtype" id="recordtype_sel" class="input-small">
<select name="record_type" id="recordtype_sel" class="input-small">
<option value="">{% trans 'Tout type' %}</option>
<option value="image">{% trans 'Image' %}</option>
<option value="video">{% trans 'Video' %}</option>
@@ -412,7 +412,7 @@
<table>
<tr>
<td colspan="2">
<select name="datefield" class="input-medium">
<select name="date_field" class="input-medium">
{% for field in app['phraseanet.SE'].getAvailableDateFields() %}
<option onchange="checkFilters(true);"
class="" value="{{ field }}">{{ field }}</option>
@@ -426,11 +426,11 @@
<tr>
<td style="padding-right: 5px;">
<span>{% trans 'phraseanet::time:: de' %}</span><br />
<input onchange="checkFilters(true);" class="datepicker input-medium" type="text" name="datemin" style="height: 18px;" />
<input onchange="checkFilters(true);" class="datepicker input-medium" type="text" name="date_min" style="height: 18px;" />
</td>
<td>
<span>{% trans 'phraseanet::time:: a' %}</span><br />
<input onchange="checkFilters(true);" class="datepicker input-medium" type="text" name="datemax" style="height: 18px;" />
<input onchange="checkFilters(true);" class="datepicker input-medium" type="text" name="date_max" style="height: 18px;" />
</td>
</tr>
</table>

View File

@@ -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();

View File

@@ -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();

View File

@@ -224,7 +224,7 @@ if ($app['phraseanet.registry']->get('GV_client_coll_ckbox') === 'popup') {
$allbcol[] = $coll->get_base_id();
$n_allbcol ++;
echo '<input style="display:none;" checked="checked" type="checkbox" class="basItem checkbox basItem' . $databox->get_sbas_id() . '" name="bas[]" value="' . $coll->get_base_id() . '" id="basChk' . $coll->get_base_id() . '" />';
echo '<input style="display:none;" checked="checked" type="checkbox" class="basItem checkbox basItem' . $databox->get_sbas_id() . '" name="bases[]" value="' . $coll->get_base_id() . '" id="basChk' . $coll->get_base_id() . '" />';
$options .= '<option value="' . $coll->get_base_id() . '" checked="checked" >' . $coll->get_name() . '</option>';
@@ -392,9 +392,9 @@ if ($app['phraseanet.registry']->get('GV_thesaurus')) {
'</td></tr>' .
'<tr><td style="width:50%;">' .
'<input type="hidden" name="dateminfield[]" value="' . $databox->get_sbas_id() . '_' . $f . '">' .
' <input db="' . $databox->get_sbas_id() . '" onchange="checkFilters();" class="datepicker" type="text" name="datemin[]"></td><td style="width:50%;">' .
' <input db="' . $databox->get_sbas_id() . '" onchange="checkFilters();" class="datepicker" type="text" name="date_min[]"></td><td style="width:50%;">' .
'<input type="hidden" name="datemaxfield[]" value="' . $databox->get_sbas_id() . '_' . $f . '">' .
' <input db="' . $databox->get_sbas_id() . '" onchange="checkFilters();" class="datepicker" type="text" name="datemax[]"></td></tr>' .
' <input db="' . $databox->get_sbas_id() . '" onchange="checkFilters();" class="datepicker" type="text" name="date_max[]"></td></tr>' .
'</table>' .
'</div>';
} elseif ($field['type'] != 'date') {
@@ -422,7 +422,7 @@ if ($app['phraseanet.registry']->get('GV_thesaurus')) {
?><div class="basGrp"><?php
foreach ($user->ACL()->get_granted_base(array(), array($databox->get_sbas_id())) as $coll) {
$s = "checked";
echo '<div><input type="checkbox" class="checkbox basItem basItem' . $databox->get_sbas_id() . '" ' . $s . ' name="bas[]" id="basChk' . $coll->get_base_id() . '" value="' . $coll->get_base_id() . '"><label for="basChk' . $coll->get_base_id() . '">' . $coll->get_name() . '</label></div>';
echo '<div><input type="checkbox" class="checkbox basItem basItem' . $databox->get_sbas_id() . '" ' . $s . ' name="bases[]" id="basChk' . $coll->get_base_id() . '" value="' . $coll->get_base_id() . '"><label for="basChk' . $coll->get_base_id() . '">' . $coll->get_name() . '</label></div>';
}
?></div><?php
if ($app['phraseanet.registry']->get('GV_view_bas_and_coll'))

View File

@@ -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))
{