/**
  * 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;
 }