before(function (Request $request) use ($app) { $app['firewall']->requireAuthentication(); }); $controllers->post('/', 'controller.prod.query:query') ->bind('prod_query'); $controllers->post('/answer-train/', 'controller.prod.query:queryAnswerTrain') ->bind('preview_answer_train'); $controllers->post('/reg-train/', 'controller.prod.query:queryRegTrain') ->bind('preview_reg_train'); return $controllers; } /** * Query Phraseanet to fetch records * * @param Application $app * @param Request $request * @return JsonResponse */ public function query(Application $app, Request $request) { $query = (string) $request->request->get('qry'); $mod = $app['authentication']->getUser()->getPrefs('view'); $json = []; $options = SearchEngineOptions::fromRequest($app, $request); $form = $options->serialize(); $perPage = (int) $app['authentication']->getUser()->getPrefs('images_per_page'); $app['phraseanet.SE']->setOptions($options); $page = (int) $request->request->get('pag'); $firstPage = $page < 1; if ($page < 1) { $app['phraseanet.SE']->resetCache(); $page = 1; } $result = $app['phraseanet.SE']->query($query, (($page - 1) * $perPage), $perPage); $userQuery = new UserQuery(); $userQuery->setUsrId($app['authentication']->getUser()->get_id()); $userQuery->setQuery($result->getQuery()); $app['EM']->persist($userQuery); $app['EM']->flush(); if ($app['authentication']->getUser()->getPrefs('start_page') === 'LAST_QUERY') { $app['authentication']->getUser()->setPrefs('start_page_query', $result->getQuery()); } foreach ($options->getDataboxes() as $databox) { $colls = array_map(function (\collection $collection) { return $collection->get_coll_id(); }, array_filter($options->getCollections(), function (\collection $collection) use ($databox) { return $collection->get_databox()->get_sbas_id() == $databox->get_sbas_id(); })); $app['phraseanet.SE.logger']->log($databox, $result->getQuery(), $result->getTotal(), $colls); } $proposals = $firstPage ? $result->getProposals() : false; $npages = $result->getTotalPages($perPage); $page = $result->getCurrentPage($perPage); $string = ''; if ($npages > 1) { $d2top = ($npages - $page); $d2bottom = $page; if (min($d2top, $d2bottom) < 4) { if ($d2bottom < 4) { for ($i = 1; ($i <= 4 && (($i <= $npages) === true)); $i++) { if ($i == $page) $string .= ''; else $string .= "" . $i . ""; } if ($npages > 4) $string .= ">>"; } else { $start = $npages - 4; if (($start) > 0) $string .= "<<"; else $start = 1; for ($i = ($start); $i <= $npages; $i++) { if ($i == $page) $string .= ''; else $string .= "" . $i . ""; } } } else { $string .= "<<"; for ($i = ($page - 2); $i <= ($page + 2); $i++) { if ($i == $page) $string .= ''; else $string .= "" . $i . ""; } $string .= ">>"; } } $string .= '
'; $explain = "
"; $explain .= ""; if ($result->getTotal() != $result->getAvailable()) { $explain .= sprintf(_('reponses:: %d Resultats rappatries sur un total de %d trouves'), $result->getAvailable(), $result->getTotal()); } else { $explain .= sprintf(_('reponses:: %d Resultats'), $result->getTotal()); } $explain .= " "; $explain .= '
' . $result->getDuration() . ' s
dans index ' . $result->getIndexes(); $explain .= "
"; $infoResult = '' . sprintf(_('reponses:: %d reponses'), $result->getTotal()) . ' | ' . sprintf(_('reponses:: %s documents selectionnes'), ''); $json['infos'] = $infoResult; $json['navigation'] = $string; $prop = null; if ($firstPage) { $propals = $result->getSuggestions(); if (count($propals) > 0) { foreach ($propals as $prop_array) { if ($prop_array->getSuggestion() !== $query && $prop_array->getHits() > $result->getTotal()) { $prop = $prop_array->getSuggestion(); break; } } } } if ($result->getTotal() === 0) { $template = 'prod/results/help.html.twig'; } else { if ($mod == 'thumbs') { $template = 'prod/results/answergrid.html.twig'; } else { $template = 'prod/results/answerlist.html.twig'; } } $json['results'] = $app['twig']->render($template, [ 'results' => $result, 'highlight' => $result->getQuery(), 'searchEngine' => $app['phraseanet.SE'], 'suggestions' => $prop ] ); $json['query'] = $query; $json['phrasea_props'] = $proposals; $json['total_answers'] = (int) $result->getAvailable(); $json['next_page'] = ($page < $npages && $result->getAvailable() > 0) ? ($page + 1) : false; $json['prev_page'] = ($page > 1 && $result->getAvailable() > 0) ? ($page - 1) : false; $json['form'] = $form; return $app->json($json); } /** * Get a preview answer train * * @param Application $app * @param Request $request * @return JsonResponse */ public function queryAnswerTrain(Application $app, Request $request) { if (null === $optionsSerial = $request->request->get('options_serial')) { $app->abort(400, 'Search engine options are missing'); } try { $options = SearchEngineOptions::hydrate($app, $optionsSerial); $app['phraseanet.SE']->setOptions($options); } catch (\Exception $e) { $app->abort(400, 'Provided search engine options are not valid'); } $pos = (int) $request->request->get('pos', 0); $query = $request->request->get('query', ''); $record = new \record_preview($app, 'RESULT', $pos, '', $app['phraseanet.SE'], $query); return $app->json([ 'current' => $app['twig']->render('prod/preview/result_train.html.twig', [ 'records' => $record->get_train($pos, $query, $app['phraseanet.SE']), 'selected' => $pos ]) ]); } /** * Get a preview reg train * * @param Application $app * @param Request $request * @return Response */ public function queryRegTrain(Application $app, Request $request) { $record = new \record_preview($app, 'REG', $request->request->get('pos'), $request->request->get('cont')); return new Response($app['twig']->render('prod/preview/reg_train.html.twig', [ 'container_records' => $record->get_container()->get_children(), 'record' => $record ])); } }