src/Controller/ContentBlockController.php line 84

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use App\Services\Search\SearchSelect;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. class ContentBlockController extends AbstractController
  12. {
  13.     private function fixBooleanValues(&$aParams)
  14.     {
  15.         array_walk_recursive($aParams, function(&$aParam){
  16.             if(is_string($aParam))
  17.             {
  18.                 switch($aParam)
  19.                 {
  20.                     case 'true':
  21.                         $aParam true;
  22.                         break;
  23.                     case 'false':
  24.                         $aParam false;
  25.                         break;
  26.                     case 'null':
  27.                         $aParam null;
  28.                         break;
  29.                 }
  30.             }
  31.         });
  32.     }
  33.     /**
  34.      * @Route("/op/results/paginate", name="results_pagination", options={"expose"=true})
  35.      */
  36.     public function renderResults(Request $requestRequestStack $request_stackEntityManagerInterface $emSearchSelect $search_select)
  37.     {
  38.         $master_request $request_stack->getMainRequest();
  39.         $aParams $request->get('aParams');
  40.         $aParams $aParams $aParams $request->request->get('aParams');
  41.         if($aParams && isset($aParams['static_set'])) // an array of items to be rendered
  42.         {
  43.             return $this->render($aParams['results_template'], [
  44.                 'results' => $aParams['static_set'],
  45.                 'pagination' => false,
  46.                 'aParams' => $aParams,
  47.                 'all_results' => count($aParams['static_set'])
  48.             ]);
  49.         }
  50.         $contentType strtolower($aParams['contentType']);
  51.         if($aParams)
  52.         {
  53.             $aParams is_array($aParams) ? $aParams json_decode($request->request->get('aParams'), true);
  54.             $this->fixBooleanValues($aParams);
  55.             // if not set, or true, will render results; otherwise it will return a json of the results (without pagination; useful for autocompleting)
  56.             $aParams['render'] = array_key_exists('render'$aParams) ? $aParams['render'] : true;
  57.             // IDs used on the same master request
  58.             $excluded_ids $master_request->request->get('excluded_ids') ? $master_request->request->get('excluded_ids') : [$contentType => []];
  59.             if(!array_key_exists($contentType$excluded_ids))
  60.             {
  61.                 $excluded_ids[$contentType] = [];
  62.             }
  63.             //$excluded_ids = array($contentType => array());
  64.             if(!array_key_exists('allow_duplicates_in_same_master_request'$aParams) || !$aParams['allow_duplicates_in_same_master_request'])
  65.             {
  66.                 //$excluded_ids = $master_request->request->get('excluded_ids');
  67.                 //$excluded_ids = $excluded_ids ? $excluded_ids : array($contentType => array());
  68.                 $aParams['aExcluded_ids'] = array_key_exists('aExcluded_ids'$aParams) && is_array($aParams['aExcluded_ids']) ? array_merge($aParams['aExcluded_ids'], $excluded_ids[$contentType]) : $excluded_ids[$contentType];
  69.                 $aParams['aExcluded_ids'] = array_unique($aParams['aExcluded_ids']);
  70.             }
  71.             $search $search_select->get($aParams);
  72.             $func $aParams['func'] ?? 'get';
  73.             $search_results $search->$func($aParams);
  74.             // Store new values to exclude them in the same master request
  75.             foreach($search_results['results'] as $result)
  76.             {
  77.                 $excluded_ids[$contentType][] = $result['id'];
  78.             }
  79.             $master_request->request->set('excluded_ids'$excluded_ids);
  80.             // if no results, and suggestions requested, do it here (did you mean ...)
  81.             $search_results_suggested false;
  82.             if(
  83.                 empty($search_results['results']) &&
  84.                 isset($aParams['show_suggestions']) &&
  85.                 $aParams['show_suggestions'] &&
  86.                 isset($aParams['search_terms']) &&
  87.                 $aParams['search_terms'] &&
  88.                 method_exists($search'getSuggested'))
  89.             {
  90.                 $aParams_suggested array_merge($aParams, [
  91.                     'search_terms' => false,
  92.                     'ids_collection' => $search->getSuggested($aParams),
  93.                     'sorting' => 'field',
  94.                     'max_results' => false
  95.                 ]);
  96.                 $search_results_suggested $search->get($aParams_suggested);
  97.             }
  98.             // Return only specific fields, useful for autocomplete plugins
  99.             $aFilteredResults $search_results['results'];
  100.             if(array_key_exists('specific_fields'$aParams) && is_array($aParams['specific_fields']))
  101.             {
  102.                 $aFilteredResults = [];
  103.                 foreach($search_results['results'] as $result)
  104.                 {
  105.                     $aFields = [];
  106.                     foreach($aParams['specific_fields'] as $field)
  107.                     {
  108.                         $aFields[$field] = $result[$field];
  109.                     }
  110.                     $aFilteredResults[] = $aFields;
  111.                 }
  112.             }
  113.             if(array_key_exists('reverse_results'$aParams) && $aParams['reverse_results'])
  114.             {
  115.                 $aFilteredResults array_reverse($aFilteredResults);
  116.             }
  117.             return $aParams['render'] ? $this->render($aParams['results_template'], [
  118.                 'results' => $aFilteredResults,
  119.                 'pagination' => $search_results['pagination'],
  120.                 'aParams' => $aParams,
  121.                 'all_results' => $search_results,
  122.                 'results_suggested' => $search_results_suggested['results'], // 'did you mean ...' results
  123.             ]) : new Response(json_encode($aFilteredResults));
  124.         }
  125.         throw new NotFoundHttpException('Wrong parameters sent');
  126.     }
  127. }