/**
  * @Route("/project/{project}/search", name="front_search")
  * @Method("get")
  * @Template()
  */
 public function searchAction($project, Request $request)
 {
     ControllerHelp::check_enable_project($project, $this->get_prefix(), $this);
     $translations = ControllerHelp::make_translations($project, $this->container->get('request')->get('_route'), array('project' => $project), $this, $this->container->getParameter('mdb_base'));
     //
     $dm = $this->get('doctrine.odm.mongodb.document_manager');
     $dm->getConfiguration()->setDefaultDB($this->get_prefix() . $project);
     $punits = array();
     $query = '';
     $paginator = null;
     if ($request->isMethod('GET') && $request->query->get('q')) {
         $query = $request->query->get('q');
         $string = new \MongoRegex('/.*' . StringHelp::accentToRegex($query) . '.*/i');
         $collections = $dm->getRepository('PlantnetDataBundle:Collection')->findAll();
         //
         $punit_filters = array('identifier' => 1, 'title1' => 1, 'title2' => 1, 'title3' => 1);
         $img_filters = array();
         $loc_filters = array();
         $other_filters = array();
         //
         /*
         foreach($collections as $collection){
             $modules=$collection->getModules();
             foreach($modules as $module){
                 $fields=$module->getProperties();
                 foreach($fields as $field){
                     if($field->getSearch()==true){
                         $punit_filters['attributes.'.$field->getId()]=1;
                     }
                 }
                 $submodules=$module->getChildren();
                 foreach($submodules as $submodule){
                     switch($submodule->getType()){
                         case 'image':
                             break;
                         case 'locality':
                             break;
                         case 'other':
                             $subfields=$submodule->getProperties();
                             foreach($subfields as $subfield){
                                 if($subfield->getSearch()==true){
                                     $other_filters['property.'.$subfield->getId()]=1;
                                 }
                             }
                             break;
                     }
                 }
             }
         }
         */
         //
         $tmp_ids = array();
         if (count($img_filters)) {
             $ids = $dm->createQueryBuilder('PlantnetDataBundle:Image')->hydrate(false)->select('plantunit');
             foreach ($img_filters as $filter => $active) {
                 $ids->addOr($ids->expr()->field($filter)->in(array($string)));
             }
             $ids = $ids->getQuery()->execute();
             foreach ($ids as $id) {
                 $tmp_ids[] = $id['plantunit']['$id'] . '';
             }
         }
         if (count($loc_filters)) {
             $ids = $dm->createQueryBuilder('PlantnetDataBundle:Location')->hydrate(false)->select('plantunit');
             foreach ($loc_filters as $filter => $active) {
                 $ids->addOr($ids->expr()->field($filter)->in(array($string)));
             }
             $ids = $ids->getQuery()->execute();
             foreach ($ids as $id) {
                 $tmp_ids[] = $id['plantunit']['$id'] . '';
             }
         }
         if (count($other_filters)) {
             $ids = $dm->createQueryBuilder('PlantnetDataBundle:Other')->hydrate(false)->select('plantunit');
             foreach ($other_filters as $filter => $active) {
                 $ids->addOr($ids->expr()->field($filter)->in(array($string)));
             }
             $ids = $ids->getQuery()->execute();
             foreach ($ids as $id) {
                 $tmp_ids[] = $id['plantunit']['$id'] . '';
             }
         }
         $tmp_ids = array_unique($tmp_ids);
         //
         $punits = $dm->createQueryBuilder('PlantnetDataBundle:Plantunit');
         foreach ($punit_filters as $filter => $active) {
             $punits->addOr($punits->expr()->field($filter)->in(array($string)));
         }
         if (count($tmp_ids)) {
             $punits->addOr($punits->expr()->field('_id')->in($tmp_ids));
         }
         $punits = $punits->sort('title1', 'asc')->sort('title2', 'asc')->sort('title3', 'asc');
         $paginator = new Pagerfanta(new DoctrineODMMongoDBAdapter($punits));
         try {
             $paginator->setMaxPerPage(50);
             $paginator->setCurrentPage($this->get('request')->query->get('page', 1));
         } catch (\Pagerfanta\Exception\NotValidCurrentPageException $e) {
             throw $this->createNotFoundException('Page not found.');
         }
         if ($paginator->getNbResults() == 1) {
             foreach ($paginator as $punit) {
                 if ($punit->getModule()->getWsonly() != true) {
                     return $this->redirect($this->generateUrl('front_details', array('project' => $project, 'collection' => $punit->getModule()->getCollection()->getUrl(), 'module' => $punit->getModule()->getUrl(), 'id' => $punit->getIdentifier())));
                 }
             }
         }
     }
     $config = ControllerHelp::get_config($project, $dm, $this);
     $tpl = $config->getTemplate();
     return $this->render('PlantnetDataBundle:' . ($tpl ? $tpl : 'Frontend') . ':search.html.twig', array('config' => $config, 'project' => $project, 'query' => $query, 'paginator' => $paginator, 'translations' => $translations, 'current' => 'contacts'));
 }
 /**
  * @Route(
  *      "/project/{project}/collection/{collection}/{module}/taxo_query",
  *      defaults={"query"="null"},
  *      name="front_module_taxo_query_path"
  *  )
  * @Route(
  *      "/project/{project}/collection/{collection}/{module}/taxo_query/{query}",
  *      name="front_module_taxo_query"
  *  )
  * @Template()
  */
 public function module_taxo_queryAction($project, $collection, $module, $query)
 {
     ControllerHelp::check_enable_project($project, $this->get_prefix(), $this);
     if ($query == 'null') {
         $response = new Response(json_encode(array()));
         $response->headers->set('Content-Type', 'application/json');
         return $response;
         exit;
     }
     $dm = $this->get('doctrine.odm.mongodb.document_manager');
     $dm->getConfiguration()->setDefaultDB($this->get_prefix() . $project);
     $collection = $dm->getRepository('PlantnetDataBundle:Collection')->findOneBy(array('url' => $collection));
     if (!$collection) {
         throw $this->createNotFoundException('Unable to find Collection entity.');
     }
     $module = $dm->getRepository('PlantnetDataBundle:Module')->findOneBy(array('url' => $module, 'collection.id' => $collection->getId()));
     if (!$module || $module->getType() != 'text' || $module->getWsonly() == true) {
         throw $this->createNotFoundException('Unable to find Module entity.');
     }
     $taxons = $dm->createQueryBuilder('PlantnetDataBundle:Taxon')->hydrate(false)->select('name', 'identifier', 'label', 'issynonym')->field('module')->references($module)->field('name')->in(array(new \MongoRegex('/.*' . StringHelp::accentToRegex($query) . '.*/i')))->sort('name', 'asc')->limit(10)->getQuery()->execute();
     $results = array();
     foreach ($taxons as $tax) {
         $results[] = array('identifier' => $tax['identifier'], 'name' => $tax['name'], 'label' => $tax['label'], 'issynonym' => $tax['issynonym']);
     }
     $response = new Response(json_encode($results));
     $response->headers->set('Content-Type', 'application/json');
     return $response;
     exit;
 }
 /**
  * @Route(
  *      "/project/{project}/collection/{collection}/{module}/search/{attribute}/{query}",
  *      defaults={"attribute"="null", "query"="null"},
  *      name="front_module_search_query_path"
  *  )
  * @Route(
  *      "/project/{project}/collection/{collection}/{module}/search/{attribute}/{query}",
  *      name="front_module_search_query"
  *  )
  * @Template()
  */
 public function module_search_queryAction($project, $collection, $module, $attribute, $query)
 {
     ControllerHelp::check_enable_project($project, $this->get_prefix(), $this);
     $dm = $this->get('doctrine.odm.mongodb.document_manager');
     $dm->getConfiguration()->setDefaultDB($this->get_prefix() . $project);
     $collection = $dm->getRepository('PlantnetDataBundle:Collection')->findOneBy(array('url' => $collection));
     if (!$collection) {
         throw $this->createNotFoundException('Unable to find Collection entity.');
     }
     $module = $dm->getRepository('PlantnetDataBundle:Module')->findOneBy(array('url' => $module, 'collection.id' => $collection->getId()));
     if (!$module || $module->getWsonly() == true) {
         throw $this->createNotFoundException('Unable to find Module entity.');
     }
     $results = array();
     $query_tab = array(new \MongoRegex('/.*' . StringHelp::accentToRegex($query) . '.*/i'));
     //check for int or float value
     if (is_numeric($query)) {
         $tmp_query = intval($query);
         if ($query == $tmp_query) {
             $query_tab[] = $tmp_query;
         } else {
             $tmp_query = floatval($query);
             if ($query == $tmp_query) {
                 $query_tab[] = $tmp_query;
             }
         }
     }
     //
     if (substr_count($attribute, '#') == 1) {
         $sub_module_id = substr($attribute, 0, strpos($attribute, '#'));
         $sub_attribute_id = substr($attribute, strpos($attribute, '#') + 1);
         $sub_module = $dm->getRepository('PlantnetDataBundle:Module')->findOneBy(array('id' => $sub_module_id, 'parent.id' => $module->getId()));
         if (!$sub_module) {
             throw $this->createNotFoundException('Unable to find Module entity.');
         }
         $others = $dm->createQueryBuilder('PlantnetDataBundle:Other')->hydrate(false)->distinct('property.' . $sub_attribute_id)->select('property.' . $sub_attribute_id)->field('module')->references($sub_module)->field('property.' . $sub_attribute_id)->in($query_tab)->sort('property.' . $sub_attribute_id, 'asc')->limit(10)->getQuery()->execute();
         foreach ($others as $other) {
             $results[] = $other;
         }
     } else {
         $plantunits = $dm->createQueryBuilder('PlantnetDataBundle:Plantunit')->hydrate(false)->distinct('attributes.' . $attribute)->select('attributes.' . $attribute)->field('module')->references($module)->field('attributes.' . $attribute)->in($query_tab)->sort('attributes.' . $attribute, 'asc')->limit(10)->getQuery()->execute();
         foreach ($plantunits as $punit) {
             $results[] = $punit;
         }
     }
     $response = new Response(json_encode($results));
     $response->headers->set('Content-Type', 'application/json');
     return $response;
     exit;
 }