src/Controller/ProcheController.php line 1085

  1. <?php
  2. // src/Controller/ProcheController.php
  3. namespace App\Controller;
  4. use \Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\StreamedResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Solarium\Client;
  11. //use Solarium\Core\Client\Adapter\Curl;
  12. //use App\Service\SiteUpdateManager;
  13. //use Symfony\Component\EventDispatcher\EventDispatcher;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\Translation\LocaleSwitcher;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Symfony\Component\HttpFoundation\Cookie;
  18. use Symfony\Contracts\HttpClient\HttpClientInterface;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. //use Symfony\Component\Messenger\MessageBusInterface;
  21. //use App\Message\ProcheCsv;
  22. class ProcheController extends AbstractController
  23. {
  24.     protected $default_lang="fr";
  25.     private $client;
  26.     private $page_size=10;
  27.     
  28.     private $localeSwitcher;
  29.     //private $bus;
  30.     private $facet_size=10;
  31.     //private $session;
  32.     //private $list_included_fields_csv=["id","object_number", "sort_number",    "title"    , "dimensions",    "date_of_acquisition","acquisition_method",    "creation_date","culture","objtitle_legacy","_version_",    "score"];
  33.     
  34.     private $http_client;
  35.     private $session;
  36.     private $salt;
  37.     private $name_cookie_disclaimer;
  38.     
  39.     
  40.     
  41.     /** @var \Solarium\Client */
  42.    public function __construct(\Solarium\Client $client,  LocaleSwitcher $localeSwitcherHttpClientInterface $http_client\Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface $containerBag ) {
  43.        
  44.        $this->client $client;
  45.        $this->localeSwitcher=$localeSwitcher;
  46.        //$this->bus=$bus;
  47.        $this->http_client=$http_client;
  48.        
  49.        $this->salt=sha1($containerBag->get('salt'));
  50.        $this->name_cookie_disclaimer='disclaimer_cookie_'.$this->salt;
  51.       
  52.     }
  53.     
  54.     
  55.     protected function remove_punctuation($val)
  56.     {
  57.         $val=str_replace("-"," ",$val);
  58.         $val=str_replace(":"," ",$val);
  59.         $val=str_replace(","," ",$val);
  60.         $val=str_replace(";"," ",$val);
  61.         $val=str_replace("!"," ",$val);
  62.         $val=str_replace("?"," ",$val);
  63.         //$val=str_replace("."," ",$val);
  64.         $val=str_replace(". "," ",$val);
  65.         $val=str_replace(" ."," ",$val);
  66.         $val=str_replace("("," ",$val);
  67.         $val=str_replace(")"," ",$val);
  68.         //$val=str_replace("'"," ",$val);
  69.         $val=str_replace('"'," ",$val);
  70.         $val preg_replace('/\s+/'' '$val);
  71.         return $val;
  72.     }
  73.     
  74.     protected function escapeSolr($helper$input$fuzzy=true)
  75.     {
  76.         
  77.         if($fuzzy)
  78.         {
  79.             $tmp=trim($helper->escapePhrase($input),'"');
  80.             $tmp=$this->remove_punctuation($tmp);
  81.             return '"*'.$tmp.'*"';
  82.         }
  83.         else
  84.         {
  85.             $input=trim($helper->escapePhrase($input),'"');
  86.             $input=$this->remove_punctuation($input);
  87.             return  $input;
  88.         }
  89.     }
  90.     
  91.     protected function escapeSolrArray($helper$vals$fuzzy=true)
  92.     {
  93.         $returned=[];
  94.         foreach($vals as $val)
  95.         {
  96.             if($fuzzy)
  97.             {
  98.                 $val=$this->remove_punctuation($val);
  99.             }
  100.             if($fuzzy)
  101.             {
  102.                 
  103.                 $returned[]='"*'.trim(trim($helper->escapePhrase$val),'"')).'*"';
  104.                 
  105.             }
  106.             else
  107.             {
  108.                 $returned[]=trim($helper->escapePhrase$val));
  109.             }
  110.         }
  111.         
  112.         return  $returned;
  113.     }
  114.     
  115.     protected function set_lang_cookie($lang)
  116.     {
  117.         $response = new Response();
  118.         $response->headers->setCookieCookie::create('proche_locale'$lang));
  119.         $response->sendHeaders();
  120.         
  121.         
  122.     }
  123.     
  124.     protected function get_lang_cookie($request)
  125.     {
  126.         $lang=$request->cookies->get('proche_locale',$this->default_lang);
  127.         return $lang;
  128.         
  129.     }
  130.     
  131.     #[Route('/'name:"home")]
  132.     public function home(Request $requestSessionInterface $session): Response
  133.     {
  134.         //print_r($this->getParameter('endpoints',"solr"));
  135.         $lang=$this->get_lang_cookie($request);
  136.         $this->localeSwitcher->setLocale($this->default_lang);
  137.         $this->set_lang_cookie($this->default_lang);
  138.         //$cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  139.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  140.         return $this->render('extra_pages/pageabout.html.twig',[ "cookie_accepted"=>$cookie_disclaimer]);
  141.     }
  142.     
  143.     #[Route('/{locale}'name:"homelang"requirements: ['locale' => '(en|fr|nl)'])]
  144.     public function homelang(Request $request$locale="fr"): Response
  145.     {
  146.         $session=$request->getSession();
  147.         $this->localeSwitcher->setLocale($locale);
  148.         $session->set('current_locale'$locale);
  149.         $this->set_lang_cookie($locale);
  150.         return $this->render('extra_pages/pageabout.html.twig',[]);
  151.     }
  152.     
  153.     
  154.     #[Route('/simplesearch'name'simplesearch')]    
  155.     public function simplesearch(Request $requestSessionInterface $session): Response
  156.     {        
  157.         $lang=$this->get_lang_cookie($request);
  158.         $this->localeSwitcher->setLocale($request->getSession()->get('current_locale',$lang));
  159.         $dyna_field_free=$this->getParameter('free_text_search_field',[]);        
  160.         $dyna_field_details=$this->getParameter('detailed_search_fields',[]);
  161.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  162.         return $this->render('home.html.twig',["dyna_field_free"=>$dyna_field_free"dyna_field_details"=>$dyna_field_details"cookie_accepted"=>$cookie_disclaimer]);
  163.     }
  164.     
  165.     #[Route('/simplesearch/{locale}'name'simplesearchlang'requirements: ['locale' => '(en|fr|nl)'])]    
  166.     public function simplesearchlang(Request $request$locale="fr"): Response
  167.     {
  168.         $cookie_locale=$request->cookies->get('proche_locale',"");
  169.         
  170.         $session=$request->getSession();
  171.         $this->localeSwitcher->setLocale($locale);
  172.         $session->set('current_locale'$locale);
  173.         $this->set_lang_cookie($locale);
  174.         $dyna_field_free=$this->getParameter('free_text_search_field',[]);
  175.         $dyna_field_details=$this->getParameter('detailed_search_fields',[]);
  176.         //$cookie_disclaimer=$this->get_disclaimer_cookie($request);
  177.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  178.         return $this->render('home.html.twig',["dyna_field_free"=>$dyna_field_free"dyna_field_details"=>$dyna_field_details"cookie_accepted"=>$cookie_disclaimer]);
  179.     }
  180.     
  181.     #[Route('/detailed_searches'name'detailed_search')]    
  182.     public function home_detail(Request $requestSessionInterface $session): Response
  183.     {
  184.         
  185.         $dyna_field_details=$this->getParameter('detailed_search_fields',[]);
  186.         $dyna_field_free=$this->getParameter('free_text_search_field',[]);
  187.         
  188.         $this->localeSwitcher->setLocale($request->getSession()->get('current_locale','fr'));
  189.         $response = new Response();
  190.         //$cookie_disclaimer=$this->get_disclaimer_cookie($request);
  191.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  192.         return $this->render('home_details.html.twig',["dyna_field_free"=>$dyna_field_free"dyna_field_details"=>$dyna_field_details"cookie_accepted"=>$cookie_disclaimer]);
  193.     }
  194.     
  195.     
  196.     #[Route('/detail'name'detail')]
  197.     public function detail(Request $requestSessionInterface $session): Response
  198.     {
  199.         
  200.         $this->localeSwitcher->setLocale($request->getSession()->get('current_locale','fr'));        
  201.         $this->set_lang_cookie$request->getSession()->get('current_locale','fr'));
  202.         $client=$this->client;
  203.         $id=$request->get("q","");
  204.         //if(is_numeric($id))
  205.         //{
  206.             $detail_main_title_field=$this->getParameter("detail_main_title_field""id");
  207.             $detail_sub_title_field=$this->getParameter("detail_sub_title_field""id");
  208.             $detail_fields=$this->getParameter("detail_fields",[]);
  209.             if(strlen(trim($id))>0)
  210.             {
  211.                 
  212.                 $query $client->createSelect();
  213.                 $query->setQuery($this->getParameter('link_field',"id").":".$id);
  214.                 $rs_tmp$client->select($query);
  215.                 foreach ($rs_tmp as $document
  216.                 {
  217.                     $doc=[];
  218.                     foreach ($document as $field => $value
  219.                     {
  220.                         $doc[$field]=$value;
  221.                     }
  222.                     $rs[]=$doc;
  223.                     
  224.                 }
  225.                 if(count($rs)>=1)
  226.                 {
  227.                     $detail=$rs[0];
  228.                     //$cookie_disclaimer=$this->get_disclaimer_cookie($request);
  229.                     $cookie_disclaimer=$this->get_disclaimer_cookie_session($session);
  230.                     return $this->render('detail.html.twig',[
  231.                         "doc"=>$detail
  232.                         "detail_main_title_field"=> $detail_main_title_field
  233.                         "detail_sub_title_field"=> $detail_sub_title_field
  234.                         "detail_fields"=>$detail_fields
  235.                         "cookie_accepted"=>$cookie_disclaimer]);
  236.                 }
  237.             }
  238.         //}
  239.         
  240.         return $this->render('noresults.html.twig');
  241.     }
  242.     
  243.     protected function strip_accent($str
  244.     {
  245.         $teststrtr(utf8_decode($str), utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'), 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
  246.         
  247.         return $test;
  248.     }
  249.     
  250.     protected function refine_autocomplete($results$term)
  251.     {
  252.         $control1=Array();
  253.         $control2=Array();
  254.         foreach($results as $tmp0)
  255.         {
  256.             $control1[]=$tmp0["text"];
  257.         }
  258.         $tmp_result=Array();
  259.         //$term=strtolower($term);
  260.         
  261.         foreach($control1 as $r)
  262.         {
  263.             
  264.             $tmp2=explode(" "$r);
  265.             
  266.             
  267.             foreach($tmp2 as $term2)
  268.             {
  269.                 
  270.                 if(mb_stripos$term2$term)!==false)
  271.                 {
  272.                     $term2trim($term2"\s\)\(\.;,");
  273.                     if(! in_array($term2,$control2 ) && ! in_array($term2,$control1 ))
  274.                     {
  275.                         
  276.                         $tmp_result[]=["cpt"=>1"text"=>$term2];
  277.                         $control2[]=$term2;
  278.                     }
  279.                 }
  280.             }
  281.         }
  282.         if(count($tmp_result)>0)
  283.         {
  284.             $results=array_merge($tmp_result$results);
  285.         }
  286.         return $results;
  287.     }
  288.     
  289.     protected function logic_autocomplete($field$value)
  290.     {
  291.         $returned=[];
  292.         $client=$this->client;
  293.         $str="";
  294.                            
  295.           
  296.            //$field=urldecode( $field);
  297.            $fs=explode("|"$field);
  298.            if(count$fs)==1)
  299.            {
  300.                if(strlen(trim($field))>0&&strlen(trim($value))>0)
  301.                {
  302.                                        
  303.                         // create a facet field instance and set options
  304.                         $resp=[];
  305.                          $list=preg_split("/\s+/"$value);
  306.                          
  307.                          foreach($list as $keyword)
  308.                          {
  309.                             if(strlen($keyword)>1)
  310.                             {
  311.                                 $query $client->createSelect();
  312.                                 $query->setStart(0)->setRows(0);
  313.                                 $facetSet $query->getFacetSet();
  314.                                 $facetSet->createFacetField('sfitems')->setField($field)->setContains($keyword)->setContainsIgnoreCase(true)->setSort('asc');
  315.                                 $query->setQuery('*:*');
  316.                                 $returned_tmp $client->select($query);
  317.                                 $facets =$returned_tmp->getFacetSet()->getFacet('sfitems');
  318.                                 
  319.                                 foreach($facets as $vf => $count
  320.                                 {
  321.                                     //needed as SOLR keeps Facet associated to updated/ deleted values !
  322.                                     //https://stackoverflow.com/questions/11897189/solr-to-remove-faceted-field-when-it-doesnt-have-any-data
  323.                                     if($count>0)
  324.                                     {
  325.                                         $tmp["original"]=$vf;
  326.                                         $tmp["non_accent"]=$this->strip_accent($vf);
  327.                                         $resp[$vf]=$tmp;
  328.                                     }
  329.                                 }
  330.                             
  331.                             }
  332.                             
  333.                           
  334.                         }
  335.                         $list=  array_map(array($this'strip_accent'), $list);
  336.                         
  337.                         
  338.                         
  339.                         $sort=Array();
  340.                         
  341.                         if($list>0)
  342.                         {
  343.                             $i_resp=0;
  344.                             foreach($resp as $key=>$tmp_cluster)
  345.                             {
  346.                                 
  347.                                 $tmp_v$tmp_cluster["non_accent"];
  348.                                 $tmp_v_original$tmp_cluster["original"];
  349.                                 $cpt=0;
  350.                                 foreach($list as $keyword)
  351.                                 {
  352.                                     //print("/(.*|^)".$keyword."(.*|$)/i");
  353.                                     //print("\n");
  354.                                     $test=preg_match("/(^|\s)".$keyword."(\s|$)/i"$tmp_v);
  355.                                     //$test=preg_match("/(.*|^)".$keyword."(.*|$)/i", $tmp_v);
  356.                                     if($test!==false)
  357.                                     {
  358.                                         if($test>0)
  359.                                         {
  360.                                             $cpt=$cpt+2;
  361.                                         }
  362.                                         else
  363.                                         {
  364.                                             $test=preg_match("/(.*|\s)".$keyword."(.*|$)/i"$tmp_v);
  365.                                             if($test!==false)
  366.                                             {
  367.                                                 if($test>0)
  368.                                                 {
  369.                                                     $cpt=$cpt+1;
  370.                                                 }
  371.                                             }
  372.                                         }
  373.                                     }
  374.                                     
  375.                                 }
  376.                                 //$sort[$tmp_v]=$cpt;
  377.                                 $sort[$tmp_v_original]["cpt"]=$cpt;
  378.                                 $sort[$tmp_v_original]["text"]=$tmp_v_original;
  379.                             }    
  380.                             $i_resp++;    
  381.                         }
  382.                         
  383.                         //arsort($sort);
  384.                         
  385.                         
  386.                          usort($sort,
  387.                                  function ($a$b//use($regex_term)
  388.                                  {
  389.                                      
  390.                                     $regex_term2strtolower(trim($a['text'], "\s\)\(\.;,"));
  391.                                     
  392.                                     
  393.                                     if($a['cpt']==$b['cpt'])
  394.                                     {
  395.                                             if (strlen($a['text']) == strlen($b['text'])) 
  396.                                             {
  397.                                                 return 1;
  398.                                             }
  399.                                             elseif(strlen($a['text']) < strlen($b['text']))
  400.                                                {
  401.                                                 return -10;
  402.                                             }
  403.                                             else
  404.                                             {
  405.                                                 return 10;
  406.                                             }
  407.                                     }
  408.                                     elseif($a['cpt']<$b['cpt'])
  409.                                     {
  410.                                             return 100;
  411.                                     }
  412.                                     elseif($a['cpt']>$b['cpt'])
  413.                                     {
  414.                                             return -100;
  415.                                     }
  416.                                     //return (strlen($a['text']) < strlen($b['text'])) ? -1 : 1;
  417.                                  }
  418.                              );
  419.                         $sort=$this->refine_autocomplete($sort$value);
  420.                         $resp2=Array();
  421.                         foreach($sort as $tmp_v=>$word)
  422.                         {
  423.                             $resp2[]=["id"=>$word["text"], "text"=>$word["text"]];
  424.                         }
  425.                         array_unshift($resp2, ["id"=>$value"text"=>$value]);
  426.                         $returned=$resp2;
  427.                         
  428.                     
  429.                }
  430.            }
  431.            elseif(count$fs)>1)
  432.            {
  433.               $query $client->createSelect();
  434.               $query->setStart(0)->setRows(0);
  435.               $facetSet $query->getFacetSet();
  436.               $i=1;
  437.               foreach($fs as $tmp_field)
  438.               {
  439.                  $newfield='sfitems'.$i;
  440.                 
  441.                  $facetSet->createFacetField($newfield)->setField($tmp_field)->setContains($value)->setContainsIgnoreCase(true)->setSort('asc');
  442.                  $query->setQuery('*:*');
  443.                  $i++; 
  444.               }
  445.                
  446.               $returned_tmp $client->select($query);
  447.               $resp=[];
  448.               for($j=1;$j<$i;$j++)
  449.               {
  450.                    $newfield='sfitems'.$j;
  451.                  
  452.                    $facets =$returned_tmp->getFacetSet()->getFacet($newfield);
  453.                    foreach($facets as $vf => $count
  454.                    {
  455.                         if($count>0)
  456.                         {
  457.                          $resp[]=$vf;
  458.                         }
  459.                    }
  460.               }
  461.               array_unique($resp);
  462.               sort($resp);
  463.               
  464.               $resp2=[];
  465.               foreach($resp as $tmp_v)
  466.               {
  467.                     $resp2[]=["id"=>$tmp_v"text"=>$tmp_v];
  468.               }
  469.              
  470.                 array_unshift($resp2, ["id"=>$value"text"=>$value]);
  471.                $returned=$resp2;
  472.              
  473.            }
  474.            return $returned;
  475.     }
  476.     
  477.     
  478.     #[Route('/terms'name'terms')]
  479.     public function terms(Request $request): JsonResponse
  480.     {
  481.         $field=$request->get("f","");
  482.         $value=$request->get("q","");
  483.         $append_term=$request->get("append_term","false");
  484.          $response=$this->logic_autocomplete($field$value);
  485.          $list=preg_split("/\s+/"$value);
  486.          
  487.          if(strtolower($append_term)==="true"||count($list)==1)
  488.          {
  489.              $mode_append_term=true;
  490.          }
  491.          else
  492.          {
  493.              $mode_append_term=false;
  494.          }
  495.         
  496.          //$list=[];
  497.           if(count($response)==0)
  498.          {
  499.              
  500.              $settings_autocomplete=$this->getParameter('autocomplete_settings',[]);
  501.             
  502.              $list_excluded_terms=$settings_autocomplete["excluded_terms"];
  503.              array_walk($list_excluded_terms, function(&$value)
  504.             {
  505.               $value strtolower($value);
  506.             });
  507.              
  508.             $tmp_array=[];
  509.             
  510.                      
  511.                 if(!in_array(strtolower($value),  $list_excluded_terms))
  512.                 {
  513.                     
  514.                  $tmp_response=$this->logic_autocomplete($field$value);
  515.                 
  516.                  if(count($tmp_response)>0)
  517.                  {
  518.                      if(!array_key_exists(count($tmp_response),$tmp_array))
  519.                      {
  520.                          $tmp_array[count($tmp_response)]=Array();
  521.                      }
  522.                      $tmp_array[count($tmp_response)][]=$tmp_response;
  523.                   }
  524.                          
  525.                 }
  526.                      
  527.             
  528.             if(count$tmp_array)>0)
  529.             {
  530.                 ksort$tmp_array);
  531.                 
  532.                 $response=Array();
  533.                 foreach ($tmp_array as $arrval
  534.                 {
  535.                  foreach($arrval as $arrval2)
  536.                  {
  537.                     foreach($arrval2 as $arrval3)
  538.                     {
  539.                         $response[] = $arrval3;
  540.                     }
  541.                  }
  542.                 }
  543.             }
  544.          }
  545.          $tmp_array=array_map(
  546.             function($x)
  547.             {
  548.                 return strtolower($x["text"]);
  549.             }
  550.             ,$response
  551.          );
  552.         //print_r(array_map('strtolower', array_keys($response)));
  553.          if($mode_append_term && !in_array(strtolower($value), $tmp_array))
  554.          {
  555.            array_unshift($response, ["id"=>$value"text"=>$value]);
  556.          }
  557.          
  558.          $resp_a=[];
  559.          
  560.          if(count($resp_a)>0)
  561.          {
  562.             $response array_merge($resp_a$response);
  563.          }
  564.          
  565.          $returned=[
  566.                                 "results"=>$response
  567.                             ];
  568.         
  569.          return $this->json($returned);     
  570.     }
  571.     
  572.     protected function createFacet($facet_set$name_facet$name_field$limit=100000)
  573.     {
  574.         $facet_set->createFacetField($name_facet)->setField($name_field)->setMinCount(1)->setSort('desc')->setLimit($limit);
  575.     }
  576.     
  577.     protected function returnSolrFacet($facet_set$name_facet$name_callback$list_facet_fields$nb_results$limit=10)
  578.     {
  579.         
  580.         $facets_title =$facet_set->getFacet($name_facet);
  581.         $results_tmp=[];
  582.         $results=[];
  583.         $i=0;
  584.     
  585.         $test_check=false;
  586.         $to_check=[];
  587.         if(array_key_exists($name_callback,$list_facet_fields))
  588.         {
  589.             $test_check=true;
  590.             
  591.             $to_check=$list_facet_fields[$name_callback];
  592.             $to_check=array_map(
  593.                 function($x)
  594.                 {
  595.                     return trim(trim($x,'"'),"'");
  596.                 }
  597.                 , $to_check);
  598.             
  599.             
  600.             
  601.         }
  602.     
  603.         foreach($facets_title as $vf => $count)
  604.         {
  605.             $results_tmp[$vf]=$count;
  606.         }    
  607.         $nb_entries=count($results_tmp);
  608.         
  609.         arsort($results_tmp);
  610.         
  611.         $results_tmp=array_slice($results_tmp0$limittrue);
  612.         
  613.         $inter_facets=array_intersect(array_keys($results_tmp) ,$to_check );
  614.         $force_check=[];
  615.         if(count($inter_facets)==0)
  616.         {
  617.             foreach($to_check as $val)
  618.             {
  619.                 $results_tmp[$val]=$nb_results;
  620.                 $force_check[]=$val;
  621.             }
  622.         }
  623.         $force_check=array_merge($force_check,$inter_facets );
  624.         foreach($results_tmp as $vf => $count
  625.         {
  626.             
  627.             if($count>0)
  628.             {
  629.                 $results[$vf]=[];
  630.                 $results[$vf]["value"]=$count;
  631.                 //$results[$vf]["nb_entries"]=$nb_entries;
  632.                 if(in_array($vf,$force_check))
  633.                 {
  634.                     $results[$vf]["checked"]=true;
  635.                 }
  636.                 else
  637.                 {
  638.                     $results[$vf]["checked"]=false;
  639.                 }
  640.             }
  641.             
  642.             $i++;    
  643.         }
  644.         
  645.         $returned=Array();
  646.         $returned["count"]=$nb_entries;
  647.         $returned["results"]=$results;
  648.         return $returned;
  649.     }
  650.     
  651.     public function test_and_or($field$request$http_prefix)
  652.     {
  653.         if(strtolower($request->get($http_prefix.$field,"false"))=="true")
  654.         {
  655.             return " AND ";
  656.         }
  657.         else
  658.         {
  659.             return " OR ";
  660.         }
  661.     }
  662.     
  663.     #[Route('/main_search'name'main_search')]
  664.     public function main_search(Request $request): Response
  665.     {
  666.         $this->localeSwitcher->setLocale($request->getSession()->get('current_locale','fr'));
  667.         $this->set_lang_cookie$request->getSession()->get('current_locale','fr'));
  668.         $client=$this->client;
  669.         
  670.         
  671.         $query $client->createSelect();
  672.         $helper $query->getHelper();
  673.         
  674.         $nb_result=0;
  675.         $size_csv=100;
  676.         $rs=[];
  677.         $current_page=$request->get("current_page",1);
  678.         $page_size=$request->get("page_size",$this->page_size);
  679.         $facet_filters=$request->get("facet_filters",[]);
  680.         
  681.         $display_facets=$request->get("display_facets",[]);
  682.         $expand_facets=$request->get("expand_facets",[]);
  683.         
  684.         $with_images=$request->get('with_images',"false");
  685.         
  686.         
  687.         $sort_field=$this->getParameter('sort_field',"id");
  688.         $dyna_field_free=$this->getParameter('free_text_search_field',[]);
  689.         $dyna_field_details=$this->getParameter('detailed_search_fields',[]);
  690.         $dyna_field_facets=$this->getParameter('facet_fields',[]);
  691.         
  692.         
  693.         $list_included_fields_csv=$this->getParameter('csv_fields',[]);
  694.         
  695.         
  696.         
  697.         $tech_fields_facets=$dyna_field_facets["fields"];
  698.         $label_facets=$dyna_field_facets["labels"];
  699.         $call_back_facets=$dyna_field_facets["filter_callback"];
  700.         $i=0;
  701.         $facet_labels=[];
  702.         $facet_callbacks=[];
  703.         foreach($tech_fields_facets as $tech_field)
  704.         {
  705.             $facet_labels[$tech_field]=$label_facets[$i];
  706.             $facet_callbacks[$tech_field]=$call_back_facets[$i];
  707.             $i++;
  708.         }
  709.         $title_field=$this->getParameter('title_field',"id");
  710.         $link_field=$this->getParameter('link_field',"id");
  711.         $result_fields=$this->getParameter('result_fields',[]);    
  712.             
  713.         
  714.         $csv=false;
  715.         if(strtolower($request->get("csv","false"))=="true")
  716.         {
  717.             $csv=true;
  718.         }
  719.         
  720.         $offset=(((int)$current_page)-1)* (int)$page_size;
  721.         $pagination=Array();
  722.         
  723.         
  724.         $free_search=[];
  725.         if(array_key_exists("field",$dyna_field_free)&&array_key_exists("label"$dyna_field_free))
  726.         {
  727.             $free_search=$this->escapeSolrArray($helper,$request->get("free_search",[]),false);
  728.             
  729.             
  730.         }
  731.         
  732.         
  733.         $list_detailed_fields=[];
  734.         $params_or=[];
  735.         $params_and=[];
  736.         if(array_key_exists("fields",$dyna_field_details ))
  737.         {
  738.             $dyna_fields=$dyna_field_details["fields"];
  739.             $dyna_fields_matching=$dyna_field_details["matching"];
  740.             $dyna_fields_types=$dyna_field_details["types"];
  741.             $i=0;
  742.             foreach($dyna_fields as $field)
  743.             {
  744.                 if($dyna_fields_types[$i]=="date")
  745.                 {
  746.                     $date_begin=$request->get("search_".$field."_from","");
  747.                     $date_end=$request->get("search_".$field."_to","");
  748.                     if(strlen(trim($date_begin))>0&&strlen(trim($date_end))>0)
  749.                     {
  750.                     
  751.                         if($date_begin<=$date_end)
  752.                         {
  753.                             $params_and[]=$field.":[".$date_begin." TO ".$date_end."]";
  754.                         }
  755.                         else
  756.                         {
  757.                             $params_and[]=$field.":[".$date_end." TO ".$date_begin."]";
  758.                         }
  759.                     }
  760.                     elseif(strlen(trim($date_begin))>0)
  761.                     {
  762.                             $date_end=date('Y-m-d');
  763.                             $params_and[]=$field.":[".$date_begin." TO ".$date_end."]";
  764.                     }
  765.                     elseif(strlen(trim($date_end))>0)
  766.                     {
  767.                             $date_begin=date('0001-01-01');
  768.                             $params_and[]=$field.":[".$date_begin." TO ".$date_end."]";
  769.                     }
  770.                 }
  771.                 elseif($dyna_fields_matching[$i]=="exact")
  772.                 {
  773.                     $list_detailed_fields[$field]=$this->escapeSolrArray($helper,$request->get("search_".$field,[]), false);
  774.                 }
  775.                 else
  776.                 {
  777.                     $list_detailed_fields[$field]=$this->escapeSolrArray($helper,$request->get("search_".$field,[]));
  778.                 }
  779.                 $i++;
  780.             }
  781.         }    
  782.         $list_facet_fields=[];
  783.         foreach($facet_filters as $field=>$vals)
  784.         {            
  785.             $n_values=$vals["values"];
  786.             $list_facet_fields[$field]=$this->escapeSolrArray($helper,$n_valuesfalse);
  787.             
  788.         }
  789.             
  790.         
  791.         
  792.         $query_build="*:*";
  793.         if($csv)
  794.         {
  795.             $query->setStart(0)->setRows(0);
  796.         }
  797.         else
  798.         {
  799.             $query->setStart($offset)->setRows($page_size);
  800.         }
  801.         $go=true;
  802.         
  803.         if(array_key_exists("field",$dyna_field_free )&&array_key_exists("label"$dyna_field_free))
  804.         {
  805.             
  806.             if(count($free_search)>0)
  807.             {        
  808.                 
  809.                 foreach($free_search as $val)
  810.                 {
  811.                 //$params_and[]="(". $this->getParameter('free_text_search_field')["field"].": (".implode(" OR ", $free_search)."))";
  812.                     $elems=preg_split("/\s+/",$val);
  813.                     $elems=array_map(
  814.                         function($x)
  815.                         {
  816.                             return $this->getParameter('free_text_search_field')["field"].':'.str_replace(array('"',"(",")",":"),'',$x);
  817.                         }
  818.                         ,$elems
  819.                     );
  820.                     $params_or[]="("implode(" AND "$elems).")";
  821.                 }
  822.             }
  823.         }
  824.         
  825.         //loop detailed criterias
  826.         foreach($list_detailed_fields as $field=>$filter)
  827.         {
  828.             
  829.             if(count($filter)>0)
  830.             {
  831.                 $params_and[]="(".$field.": (".implode($this->test_and_or($field$request"chkand_search_"),$filter)."))";
  832.             }
  833.         }
  834.         
  835.         foreach($list_facet_fields as $field=>$filter)
  836.         {
  837.             
  838.             if(count($filter)>0)
  839.             {
  840.                 $params_and[]="(".$field.": (".implode($this->test_and_or($field$request"chk_facet_and_search_"),$filter)."))";
  841.             }
  842.         }
  843.         
  844.         if(strtolower($with_images)=="true")
  845.         {
  846.             $params_and[]="(iiif_endpoint: [* TO *])";
  847.         }
  848.         
  849.         if(count($params_or)>0)
  850.         {
  851.             $params_and[]="(".implode(" OR ",$params_or ).")";
  852.         }
  853.         if(count($params_and)>0)
  854.         {
  855.             $query_build=implode(" AND "$params_and);
  856.             $query->setQuery($query_build);
  857.             
  858.         }
  859.         else
  860.         {
  861.                 //get all
  862.         }
  863.         if(count($params_and)>0||$go)
  864.         {
  865.             $query->addSort($sort_field$query::SORT_ASC);
  866.             
  867.             //facets
  868.             if(count($dyna_field_facets)>0)
  869.             {
  870.                 $facetSet $query->getFacetSet();
  871.                 $facet_fields=$dyna_field_facets["fields"];
  872.                 foreach($facet_fields as $facet)
  873.                 {
  874.                     $this->createFacet($facetSet"facet_".$facet$facet);                    
  875.                 }                
  876.             }
  877.             $query->setQueryDefaultOperator("AND");
  878.             $rs_tmp$client->select($query);    
  879.             $nb_result=$rs_tmp->getNumFound();
  880.             //debug
  881.             //$base_url=$client->getEndPoint()->getCoreBaseUri();
  882.             //$query_url=$base_url."select?q.op=AND&q=".$query_build."&rows=1000000&useParams=&wt=json";
  883.             //print($query_url);
  884.             if($csv)
  885.             {
  886.                 
  887.                 $base_url=$client->getEndPoint()->getCoreBaseUri();
  888.                 $list_fields=implode(",",$list_included_fields_csv);
  889.                 $query_url=$base_url."select?fl=".$list_fields."&q.op=AND&q=".$query_build."&rows=1000000&useParams=&wt=csv";
  890.                 $response $this->http_client->request(
  891.                     'GET',
  892.                         $query_url
  893.                     );
  894.                 $statusCode $response->getStatusCode();
  895.                 
  896.                 // $statusCode = 200
  897.                 $contentType $response->getHeaders()['content-type'][0];
  898.                 // $contentType = 'application/json'
  899.                 $content $response->getContent();
  900.                 $response = new StreamedResponse();
  901.                 $response->setCallback(
  902.                     function () use ($content
  903.                     {
  904.                         ob_start();
  905.                         $handle fopen('php://output''r+');
  906.                         fwrite($handle$content);                        
  907.                         fclose($handle);
  908.                         ob_flush();
  909.                     }
  910.                 );
  911.                 $response->headers->set('Content-Type''text/csv');       
  912.                 $response->headers->set('Content-Disposition''attachment; filename="dump.csv"');
  913.                 
  914.                 return $response;
  915.             
  916.             }
  917.             else
  918.             {
  919.                                 
  920.                 $facets_twig=[];
  921.                 //$nb_result=$rs_tmp->getNumFound();
  922.                 
  923.                 if(count($dyna_field_facets)>0)
  924.                 {
  925.                     $facet_fields=$dyna_field_facets["fields"];
  926.                     $i=0;
  927.                     foreach($facet_fields as $facet)
  928.                     {
  929.                         
  930.                         if(array_key_exists($facet_callbacks[$facet], $expand_facets))
  931.                         {
  932.                             $facet_size=$expand_facets[$facet_callbacks[$facet]];
  933.                         }
  934.                         else
  935.                         {
  936.                             $facet_size=$this->facet_size;
  937.                         }
  938.                         $facet_tmp=$this->returnSolrFacet($rs_tmp->getFacetSet(), "facet_".$facet$facet_callbacks[$facet], $list_facet_fields$nb_result,$facet_size);
  939.                         $facets_twig[$i]["facet"]=$facet_tmp["results"];
  940.                         $facets_twig[$i]["facet_count"]=$facet_tmp["count"];
  941.                         $facets_twig[$i]["label"]=$facet_labels[$facet];
  942.                         $facets_twig[$i]["callback"]=$facet_callbacks[$facet];
  943.                         $facets_twig[$i]["facet_size"]=$this->facet_size;
  944.                         
  945.                         
  946.                         $and_checked=$request->get("chk_facet_and_search_".$facet_callbacks[$facet],"FALSE");
  947.                         $facets_twig[$i]["boolean_and_checked"]=$and_checked;
  948.                         
  949.                         $i++;
  950.                     }
  951.                 }
  952.                 
  953.                 $i=0;
  954.                 
  955.                 foreach ($rs_tmp as $document
  956.                 {
  957.                     $doc=[];
  958.                     foreach ($document as $field => $value
  959.                     {
  960.                         $doc[$field]=$value;
  961.                     }
  962.                     $rs[]=$doc;
  963.                     $i++;
  964.                 }
  965.                 $current_page=min($current_pageceil($nb_result $page_size));
  966.                 $current_page=max($current_page,1);
  967.                 $pagination = array(
  968.                     'page' => $current_page,
  969.                     'route' => 'search_main',
  970.                     'pages_count' => ceil($nb_result $page_size)
  971.                 );
  972.                 
  973.                 if($nb_result>0)
  974.                 {
  975.                     $params$request->query->all();
  976.                     
  977.                     $query_str=http_build_query($params);
  978.                     return $this->render('results.html.twig',["results"=>$rs"nb_result"=>$nb_result"page_size"=>$page_size"pagination"=>$pagination,
  979.                     'page' => $current_page,
  980.                     'dyna_field_facets'=>$facets_twig,
  981.                     "display_facets"=>$display_facets,
  982.                     "title_field"=>$title_field,
  983.                     "link_field"=>$link_field,
  984.                     "result_fields"=>$result_fields ,
  985.                     "query_str"=> $query_str]);
  986.                 
  987.                 }
  988.                 else
  989.                 {
  990.                     return $this->render('noresults.html.twig');
  991.                 }
  992.             }
  993.         }
  994.     
  995.         
  996.         return $this->render('noresults.html.twig');
  997.     }
  998.     
  999.     #[Route('/extrapage/{id}'name'extrapage')]    
  1000.     public function extraPage($idRequest $requestSessionInterface $session): Response
  1001.     {
  1002.         $lang=$this->get_lang_cookie($request);
  1003.         $this->localeSwitcher->setLocale($this->default_lang);
  1004.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session); //$this->get_disclaimer_cookie($request);
  1005.         return $this->render('extra_pages/page'.$id.'.html.twig',["cookie_accepted"=>$cookie_disclaimer]);
  1006.     }
  1007.     
  1008.     #[Route('/set_disclaimer_cookie/{var}'name'set_disclaimer_cookie')]
  1009.     public function set_disclaimer_cookie(SessionInterface $session$var="not_set"): JsonResponse
  1010.     {
  1011.         $response = new JsonResponse();
  1012.         if($var=="set")
  1013.         {
  1014.             
  1015.             $tmp_cookieCookie::create($this->name_cookie_disclaimer"true"7776000);
  1016.             $response->headers->setCookie(    $tmp_cookie);
  1017.             $session->set($this->name_cookie_disclaimer'true');
  1018.              $response->setData(["disclaimer_read"=>"true""exp"=> $tmp_cookie->getExpiresTime()]);
  1019.         }
  1020.         else
  1021.         {
  1022.             $tmp_cookieCookie::create($this->name_cookie_disclaimer"false"7776000);
  1023.             $response->headers->setCookie($tmp_cookie);
  1024.             $session->set($this->name_cookie_disclaimer'false');
  1025.             $response->setData(["disclaimer_read"=>"false""exp"=> $tmp_cookie->getExpiresTime()]);
  1026.         }
  1027.         return $response;
  1028.     }
  1029.     
  1030.     
  1031.     
  1032.     
  1033.     #[Route('/get_disclaimer_cookie'name'get_disclaimer_cookie')]
  1034.     public function get_disclaimer_cookie_http(Request $request): JsonResponse
  1035.     {
  1036.         $response = new JsonResponse();
  1037.         $tmp_cookieCookie::create($this->name_cookie_disclaimer);
  1038.         $response->headers->setCookie($tmp_cookie);
  1039.         $response->setData(["disclaimer_read"=>$this->get_disclaimer_cookie($request)]);
  1040.         return $response;
  1041.     }
  1042.     
  1043.     
  1044.     protected function get_disclaimer_cookie($request)
  1045.     {
  1046.         
  1047.         $this->session $request->getSession();
  1048.         //disc=$request->cookies->get('disclaimer_cookie',"false");
  1049.         $disc=$this->session->get($this->name_cookie_disclaimer'false');
  1050.         return $disc;
  1051.         
  1052.     }
  1053.     
  1054.     protected function get_disclaimer_cookie_session($session)
  1055.     {
  1056.         
  1057.         
  1058.         //disc=$request->cookies->get('disclaimer_cookie',"false");
  1059.         $disc=$session->get($this->name_cookie_disclaimer'false');
  1060.         return $disc;
  1061.         
  1062.     }
  1063.     
  1064.     #[Route('/articles'name'articles')]    
  1065.     public function articles(Request $requestSessionInterface $session): Response
  1066.     {
  1067.         $intro_file_name='../data/intro.txt';
  1068.         $intro=file_get_contents($intro_file_name);
  1069.         $lang=$this->get_lang_cookie($request);
  1070.         $this->localeSwitcher->setLocale($this->default_lang);
  1071.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session); //$this->get_disclaimer_cookie($request);
  1072.     $xml_file_name='../data/articles.xml';
  1073.     if (file_exists($xml_file_name)) {
  1074.       $xml simplexml_load_file($xml_file_name);
  1075.       $articles = array();
  1076.       foreach($xml->record as $item) {
  1077.         $article= array();
  1078.         foreach($item as $key => $value)
  1079.           {
  1080.             $article[(string)$key] = (string)$value;
  1081.           }        
  1082.         $articles[] = $article;
  1083.         }
  1084.       } 
  1085.     else {
  1086.         $articles[] = NULL
  1087.       }
  1088.         return $this->render('extra_pages/articles.html.twig',["articles"=>$articles,"intro"=>$intro,"cookie_accepted"=>$cookie_disclaimer]);        
  1089.     }
  1090.     
  1091.     #[Route('/article/{id}'name'article')]    
  1092.     public function article($idRequest $requestSessionInterface $session): Response
  1093.     {
  1094.         $lang=$this->get_lang_cookie($request);
  1095.         $this->localeSwitcher->setLocale($this->default_lang);
  1096.         $cookie_disclaimer=$this->get_disclaimer_cookie_session($session); //$this->get_disclaimer_cookie($request);
  1097.         $xml_file_name='../data/articles.xml';
  1098.         if (file_exists($xml_file_name)) {
  1099.           $xml simplexml_load_file($xml_file_name);
  1100.           $article= array();
  1101.           foreach($xml->record as $item){     
  1102.             if ($item->id==$id) {
  1103.               foreach($item as $key => $value) {
  1104.                 $article[(string)$key] = html_entity_decode((string)$value);
  1105.                 }  
  1106.             }      
  1107.             }
  1108.           } 
  1109.         else {
  1110.           $articleNULL;
  1111.           } 
  1112.         return $this->render('extra_pages/article.html.twig',["article"=>$article,"cookie_accepted"=>$cookie_disclaimer]);        
  1113.     }
  1114.     
  1115. }