src/Controller/SearchController.php line 223

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Category;
  4. use App\Entity\Journal;
  5. use App\Entity\Search;
  6. use App\Form\SearchType;
  7. use App\Repository\JournalRepository;
  8. use App\Util\ISSN;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Knp\Component\Pager\PaginatorInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Serializer\SerializerInterface;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. /**
  16.  * Class SearchController
  17.  *
  18.  * @package App\Controller
  19.  */
  20. class SearchController extends BaseController
  21. {
  22.     private $journalFinder;
  23.     
  24.     /** @var EntityManagerInterface */
  25.     private $entityManager;
  26.     /**
  27.      * @var PaginatorInterface
  28.      */
  29.     private $paginator;
  30.     /**
  31.      * SearchController constructor.
  32.      *
  33.      * @param EntityManagerInterface $entityManager
  34.      * @param PaginatorInterface $paginator
  35.      */
  36.     private $serializer;
  37.     public function __construct(EntityManagerInterface $entityManagerPaginatorInterface $paginator,SerializerInterface $serializer)
  38.     {
  39.         $this->entityManager $entityManager;
  40.         $this->paginator $paginator;
  41.         $this->serializer $serializer;
  42.     }
  43.     /**
  44.      *
  45.      * @Route("/query", name="data_search_by_several_values")
  46.      */
  47.     public function searchByValue(Request $requestJournalRepository $journalRepositoryPaginatorInterface $paginator)
  48.     {
  49.         $searchTerm $request->get("searchValue"null);
  50.         $searchOption $request->get("searchOption""journal");
  51.         // searchterm has separator for multiple values
  52.         $separators = array("-""/"";"",""|""_");
  53.         $containsSeparator false;
  54.         $separatorChar "";
  55.         if(!is_numeric($searchTerm) && !ISSN::isISSN($searchTerm)) {
  56.             foreach ($separators as $separator) {
  57.                 if (strpos($searchTerm$separator) !== false) {
  58.                     $containsSeparator true;
  59.                     $separatorChar $separator;
  60.                     break;
  61.                 }
  62.             }
  63.         }
  64.          if($searchTerm$searchTerm=trim($searchTerm);
  65.         if ($searchTerm && 'journal' === $searchOption) {
  66.             $journalExists $journalRepository->findOneBy(['title' => $searchTerm]);
  67.             if ($containsSeparator && !$journalExists) {
  68.                 $searchkeywords explode($separatorChar$searchTerm);
  69.                 $searchkeywords array_map('trim'$searchkeywords);
  70.                 $searchTerm $searchkeywords;
  71.             }
  72.             $page $request->get("p"1);
  73.             $perpage 10;
  74.             $journals $paginator->paginate($journalRepository->search($searchTerm, [], $page), $page10);
  75.             $total=$journalRepository->countSearch($searchTerm, [], $page);
  76.             $pages intval(ceil($total/$perpage));
  77.             return $this->render('refonte/search/journal-results.html.twig',
  78.                 [
  79.                     'journals' => $journals,
  80.                     'page' => $page,
  81.                     "pages"=>$pages,
  82.                     'searchTerm' => $searchTerm,
  83.                     'searchOption' => $searchOption,
  84.                     'total'=>$total
  85.                 ]);
  86.         }
  87.        elseif ($searchOption=="author") {
  88.            return $this->redirectToRoute('get_authors', ['authorValue' => $searchTerm]);
  89.        }
  90.         else{
  91.             return $this->redirect('/');
  92.         }
  93.     }
  94.         /**
  95.      *
  96.      * @Route("api/query", name="data_search_by_several_values_api")
  97.      */
  98.     public function searchByValueAPI(Request $requestJournalRepository $journalRepositoryPaginatorInterface $paginator)
  99.     {
  100.         $searchTerm $request->get("searchValue"null);
  101.         $searchOption $request->get("searchOption""journal");
  102.         if($searchTerm$searchTerm=trim($searchTerm);
  103.         if ($searchTerm && 'journal' === $searchOption) {
  104.             $page $request->get("page"1);
  105.             $total=$journalRepository->countSearch($searchTerm, [], $page);
  106.             $journals $paginator->paginate($journalRepository->search($searchTerm, [], $page), $page50);
  107.             // return $this->render('search/journal-results.html.twig', ['journals' => $journals]);
  108.             return $this->json(['journals' => $journals]);
  109.         }
  110.         elseif ($searchOption == "author") {
  111.             return $this->redirectToRoute('get_authors', ['authorValue' => $searchTerm]);
  112.         }
  113.         else{
  114.             return $this->redirect('/');
  115.         }
  116.     }
  117.      /**
  118.      *
  119.      *
  120.      * @Route("/api/advanced-search", name="advanced_search_web")
  121.      */
  122.     public function advanced_search_params_API()
  123.     {
  124.         $emS $this->getDoctrine()->getManager();
  125.         $em $this->entityManager->getRepository(Journal::class);
  126.         $emC $this->entityManager->getRepository(Category::class);
  127.         $categories=$emC->selectALLCategories($emS);
  128.         $publishers=$em->selectALLPublishers($emS);
  129.         $show_advanced=1;
  130.         return $this->json([
  131.             'listcategories'=>$categories,
  132.             'listpublishers'=>$publishers,
  133.             'show_ad'=>$show_advanced
  134.         ]);
  135.     }
  136.      /**
  137.      *
  138.      *
  139.      * @Route("/api/categorie/advanced-search", name="advanced_search_params_API_categorie")
  140.      */
  141.     public function advanced_search_params_API_categorie()
  142.     {
  143.         $em $this->entityManager->getRepository(Journal::class);
  144.         $categories=$em->getJournalWithCategories();
  145.         $publishers=$em->selectALLPublishers();
  146.         $show_advanced=1;
  147.         return $this->json([
  148.             'listcategories'=>$categories,
  149.         ]);
  150.     }
  151.     /**
  152.      *
  153.      * @Route("/search_journal_query", name="search_journals")
  154.      */
  155.     public function search_journal_for(Request $request)
  156.     {
  157.         return $this->redirectToRoute('journalSearch');
  158.     }
  159. //
  160.     /**
  161.      * Search journals by scope hints.
  162.      *
  163.      * @Route("/search-scope", name="search_by_hints")
  164.      */
  165.     public function searchByScopeHints(Request $requestJournalRepository $journalRepository,EntityManagerInterface $em,PaginatorInterface $paginator)
  166.     {
  167.         $hints $request->query->get('hints''');
  168.         $hintWords preg_split('/\s+/'$hints, -1PREG_SPLIT_NO_EMPTY);
  169.         $allJournals $em->getRepository(Journal::class)->searchByScopeHints($hintWords);
  170.         $page $request->get("p"1);
  171.         $perpage 10;
  172.         $journals $paginator->paginate($allJournals$page$perpage);
  173.         $pages ceil($journals->getTotalItemCount() / $perpage);
  174.         $total=$journals->getTotalItemCount();
  175.         return $this->render('search/Abstract-results.html.twig',
  176.             [
  177.                 'journals' => $journals,
  178.                 'hints' => $hints,
  179.                 'page' => $page,
  180.                 'pages' => $pages,
  181.                 'total'=>$total
  182.             ]);
  183.     }
  184.     /**
  185.      * Show the search page.
  186.      *
  187.      * @Route("/search-abstract", name="search_page")
  188.      */
  189.     public function searchPage()
  190.     {
  191.         return $this->render('search/AbstractSearch.html.twig');
  192.     }
  193.     /**
  194.      * Lists all advancedSearchResults
  195.      *
  196.      * @Route("/advancedSearchResults", name="advancedSearchResults")
  197.      */
  198.     public function advancedSearchResults(Request $request ,EntityManagerInterface $entityManager){
  199.         $name_of_publisher=$request->get('name_of_publisher');
  200.         $subjectarea=$request->get('subjectarea');
  201.         $quartile=$request->get('quartile');
  202.         $openAccess=$request->get('openAccess');
  203.         $country=$request->get('country');
  204.         $signhindex=$request->get('signhindex');
  205.         $hindex=$request->get('hindex');
  206.         $search="";
  207.         if($name_of_publisher && strtoupper($name_of_publisher) != "ALL"$search=$search." - Publisher : ".$name_of_publisher;
  208.         if($subjectarea && strtoupper($subjectarea) != "ALL"$search=$search." - Subject Area : ".$subjectarea;
  209.         if($quartile$search=$search." - Quartile : ".$quartile;
  210.         if($openAccess$search=$search." - OpenAccess : "$openAccess ;
  211.         if($country && strtoupper($country) != "ALL"$search=$search." - Country : "$country ;
  212.         if($signhindex && $hindex$search=$search." - H-index : "$signhindex." "$hindex ;
  213.         $results=$entityManager->getRepository(Journal::class)->getAdvancedResults($name_of_publisher,$subjectarea,$openAccess,$quartile,$country,$signhindex,$hindex);
  214.         $total=$entityManager->getRepository(Journal::class)->countAdvancedSearch($name_of_publisher,$subjectarea,$openAccess,$quartile,$country,$signhindex,$hindex);
  215.         $page $request->get("p"1);
  216.         $perpage 10;
  217.         $journals $this->paginator->paginate($results$page$perpage);
  218.         $pages intval(ceil($total/$perpage));
  219.         return $this->render('refonte/default/searchV.html.twig', [
  220.             'results'=>$journals,
  221.             'search'=>$search,
  222.             'page' => $page,
  223.             'total'=>$total,
  224.             "pages"=>$pages,
  225.         ]);
  226.     }
  227.     ////////////////////////////////////
  228.      /**
  229.  * Lists all advancedSearchResults
  230.  *
  231.  * @Route("/Api/advancedSearchResults", name="test")
  232.  */
  233. public function advancedSearchResultsApi(Request $requestEntityManagerInterface $entityManagerSerializerInterface $serializer)
  234. {
  235.     $name_of_publisher=$request->get('name_of_publisher');
  236.         $subjectarea=$request->get('subjectarea');
  237.         $quartile=$request->get('quartile');
  238.         $openAccess=$request->get('openAccess');
  239.         $search="";
  240.         if($name_of_publisher && strtoupper($name_of_publisher) != "ALL"$search=$search." - Publisher : ".$name_of_publisher;
  241.         if($subjectarea && strtoupper($subjectarea) != "ALL"$search=$search." - Subject Area : ".$subjectarea;
  242.         if($quartile$search=$search." - Quartile : ".$quartile;
  243.         if($openAccess$search=$search." - OpenAccess : "$openAccess ;
  244.         $results $entityManager->getRepository(Journal::class)->getAdvancedResultsApi(
  245.         $name_of_publisher,
  246.         $subjectarea,
  247.         $openAccess,
  248.         $quartile
  249.     );
  250.     $jsonContent $serializer->serialize($results'json', ['groups' => 'api']);
  251.     return new JsonResponse($jsonContent200, [], true);
  252. }
  253.   /**
  254.      * Search journals by scope hints.
  255.      *
  256.      * @Route("/api/search/scope", name="search_by_scope_")
  257.      */
  258.     public function searchByScopeHintsAPi(Request $request)
  259.     {
  260.         $hints $request->query->get('hints''');
  261.         $hintWords preg_split('/\s+/'$hints, -1PREG_SPLIT_NO_EMPTY);
  262.     
  263.         $journalRepository $this->entityManager->getRepository(Journal::class);
  264.         $journals $journalRepository->searchByScopeHints($hintWords);
  265.     
  266.         $serializedJournals $this->serializer->serialize($journals'json', ['maxDepth' => 1]);    
  267.         return new JsonResponse($serializedJournals200, [], true);
  268.     }
  269.     
  270. }