/** * Creates options based on a Symfony Request object * * @param Application $app * @param Request $request * * @return SearchEngineOptions */ public static function fromRequest(Application $app, Request $request) { $options = new static(); $options->disallowBusinessFields(); $options->setLocale($app['locale']); if (is_array($request->get('bases'))) { $bas = array_map(function ($base_id) use($app) { try { return \collection::get_from_base_id($app, $base_id); } catch (\Exception_Databox_CollectionNotFound $e) { return null; } }, $request->get('bases')); } elseif (!$app['authentication']->isAuthenticated()) { $bas = $app->getOpenCollections(); } else { $bas = $app['acl']->get($app['authentication']->getUser())->get_granted_base(); } $bas = array_filter($bas, function ($collection) use($app) { if ($app['authentication']->isAuthenticated()) { return $app['acl']->get($app['authentication']->getUser())->has_access_to_base($collection->get_base_id()); } else { return in_array($collection, $app->getOpenCollections()); } }); $databoxes = []; foreach ($bas as $collection) { if (!isset($databoxes[$collection->get_sbas_id()])) { $databoxes[$collection->get_sbas_id()] = $collection->get_databox(); } } if ($app['authentication']->isAuthenticated() && $app['acl']->get($app['authentication']->getUser())->has_right('modifyrecord')) { $BF = array_filter($bas, function ($collection) use($app) { return $app['acl']->get($app['authentication']->getUser())->has_right_on_base($collection->get_base_id(), 'canmodifrecord'); }); $options->allowBusinessFieldsOn($BF); } $status = is_array($request->get('status')) ? $request->get('status') : []; $fields = is_array($request->get('fields')) ? $request->get('fields') : []; $databoxFields = []; 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->get('search_type')); $options->setRecordType($request->get('record_type')); $min_date = $max_date = null; if ($request->get('date_min')) { $min_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->get('date_min') . ' 00:00:00'); } if ($request->get('date_max')) { $max_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->get('date_max') . ' 23:59:59'); } $options->setMinDate($min_date); $options->setMaxDate($max_date); $databoxDateFields = []; foreach ($databoxes as $databox) { foreach (explode('|', $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->get('sort'), $request->get('ord', SearchEngineOptions::SORT_MODE_DESC)); $options->setStemming((bool) $request->get('stemme')); return $options; }
/** * Creates options based on a Symfony Request object * * @param Application $app * @param Request $request * * @return static */ public static function fromRequest(Application $app, Request $request) { $options = new static(); $options->disallowBusinessFields(); $options->setLocale($app['locale']); /** @var Authenticator $authenticator */ $authenticator = $app->getAuthenticator(); $isAuthenticated = $authenticator->isAuthenticated(); /** @var ACLProvider $aclProvider */ $aclProvider = $app['acl']; $acl = $isAuthenticated ? $aclProvider->get($authenticator->getUser()) : null; $selected_bases = $request->get('bases'); if (is_array($selected_bases)) { $bas = []; foreach ($selected_bases as $bas_id) { try { $bas[$bas_id] = \collection::get_from_base_id($app, $bas_id); } catch (\Exception_Databox_CollectionNotFound $e) { // Ignore } } } elseif (!$isAuthenticated) { $bas = $app->getOpenCollections(); } else { $bas = $acl->get_granted_base(); } // Filter out not found collections $bas = array_filter($bas); if ($acl) { $filter = function (\collection $collection) use($acl) { return $acl->has_access_to_base($collection->get_base_id()); }; } else { $openCollections = $app->getOpenCollections(); $filter = function (\collection $collection) use($openCollections) { return in_array($collection, $openCollections); }; } /** @var \collection[] $bas */ $bas = array_filter($bas, $filter); if (!empty($selected_bases) && empty($bas)) { throw new BadRequestHttpException('No collections match your criteria'); } $options->onCollections($bas); if ($isAuthenticated && $acl->has_right('modifyrecord')) { $bf = array_filter($bas, function (\collection $collection) use($acl) { return $acl->has_right_on_base($collection->get_base_id(), 'canmodifrecord'); }); $options->allowBusinessFieldsOn($bf); } $status = is_array($request->get('status')) ? $request->get('status') : []; $fields = is_array($request->get('fields')) ? $request->get('fields') : []; if (empty($fields)) { // Select all fields (business included) foreach ($options->getDataboxes() as $databox) { foreach ($databox->get_meta_structure() as $field) { $fields[] = $field->get_name(); } } $fields = array_unique($fields); } $databoxFields = []; $databoxes = $options->getDataboxes(); foreach ($databoxes as $databox) { $metaStructure = $databox->get_meta_structure(); foreach ($fields as $field) { try { $databoxField = $metaStructure->get_element_by_name($field); } catch (\Exception $e) { continue; } if ($databoxField) { $databoxFields[] = $databoxField; } } } $options->setFields($databoxFields); $options->setStatus($status); $options->setSearchType($request->get('search_type')); $options->setRecordType($request->get('record_type')); $min_date = $max_date = null; if ($request->get('date_min')) { $min_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->get('date_min') . ' 00:00:00'); } if ($request->get('date_max')) { $max_date = \DateTime::createFromFormat('Y/m/d H:i:s', $request->get('date_max') . ' 23:59:59'); } $options->setMinDate($min_date); $options->setMaxDate($max_date); $databoxDateFields = []; foreach ($databoxes as $databox) { $metaStructure = $databox->get_meta_structure(); foreach (explode('|', $request->get('date_field')) as $field) { try { $databoxField = $metaStructure->get_element_by_name($field); } catch (\Exception $e) { continue; } if ($databoxField) { $databoxDateFields[] = $databoxField; } } } $options->setDateFields($databoxDateFields); $options->setSort($request->get('sort'), $request->get('ord', SearchEngineOptions::SORT_MODE_DESC)); $options->setStemming((bool) $request->get('stemme')); return $options; }