<?php
namespace App\Controller;
use App\Entity\Category;
use App\Entity\Journal;
use App\Entity\Search;
use App\Form\SearchType;
use App\Repository\JournalRepository;
use App\Util\ISSN;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* Class SearchController
*
* @package App\Controller
*/
class SearchController extends BaseController
{
private $journalFinder;
/** @var EntityManagerInterface */
private $entityManager;
/**
* @var PaginatorInterface
*/
private $paginator;
/**
* SearchController constructor.
*
* @param EntityManagerInterface $entityManager
* @param PaginatorInterface $paginator
*/
private $serializer;
public function __construct(EntityManagerInterface $entityManager, PaginatorInterface $paginator,SerializerInterface $serializer)
{
$this->entityManager = $entityManager;
$this->paginator = $paginator;
$this->serializer = $serializer;
}
/**
*
* @Route("/query", name="data_search_by_several_values")
*/
public function searchByValue(Request $request, JournalRepository $journalRepository, PaginatorInterface $paginator)
{
$searchTerm = $request->get("searchValue", null);
$searchOption = $request->get("searchOption", "journal");
// searchterm has separator for multiple values
$separators = array("-", "/", ";", ",", "|", "_");
$containsSeparator = false;
$separatorChar = "";
if(!is_numeric($searchTerm) && !ISSN::isISSN($searchTerm)) {
foreach ($separators as $separator) {
if (strpos($searchTerm, $separator) !== false) {
$containsSeparator = true;
$separatorChar = $separator;
break;
}
}
}
if($searchTerm) $searchTerm=trim($searchTerm);
if ($searchTerm && 'journal' === $searchOption) {
$journalExists = $journalRepository->findOneBy(['title' => $searchTerm]);
if ($containsSeparator && !$journalExists) {
$searchkeywords = explode($separatorChar, $searchTerm);
$searchkeywords = array_map('trim', $searchkeywords);
$searchTerm = $searchkeywords;
}
$page = $request->get("p", 1);
$perpage = 10;
$journals = $paginator->paginate($journalRepository->search($searchTerm, [], $page), $page, 10);
$total=$journalRepository->countSearch($searchTerm, [], $page);
$pages = intval(ceil($total/$perpage));
return $this->render('refonte/search/journal-results.html.twig',
[
'journals' => $journals,
'page' => $page,
"pages"=>$pages,
'searchTerm' => $searchTerm,
'searchOption' => $searchOption,
'total'=>$total
]);
}
elseif ($searchOption=="author") {
return $this->redirectToRoute('get_authors', ['authorValue' => $searchTerm]);
}
else{
return $this->redirect('/');
}
}
/**
*
* @Route("api/query", name="data_search_by_several_values_api")
*/
public function searchByValueAPI(Request $request, JournalRepository $journalRepository, PaginatorInterface $paginator)
{
$searchTerm = $request->get("searchValue", null);
$searchOption = $request->get("searchOption", "journal");
if($searchTerm) $searchTerm=trim($searchTerm);
if ($searchTerm && 'journal' === $searchOption) {
$page = $request->get("page", 1);
$total=$journalRepository->countSearch($searchTerm, [], $page);
$journals = $paginator->paginate($journalRepository->search($searchTerm, [], $page), $page, 50);
// return $this->render('search/journal-results.html.twig', ['journals' => $journals]);
return $this->json(['journals' => $journals]);
}
elseif ($searchOption == "author") {
return $this->redirectToRoute('get_authors', ['authorValue' => $searchTerm]);
}
else{
return $this->redirect('/');
}
}
/**
*
*
* @Route("/api/advanced-search", name="advanced_search_web")
*/
public function advanced_search_params_API()
{
$emS = $this->getDoctrine()->getManager();
$em = $this->entityManager->getRepository(Journal::class);
$emC = $this->entityManager->getRepository(Category::class);
$categories=$emC->selectALLCategories($emS);
$publishers=$em->selectALLPublishers($emS);
$show_advanced=1;
return $this->json([
'listcategories'=>$categories,
'listpublishers'=>$publishers,
'show_ad'=>$show_advanced
]);
}
/**
*
*
* @Route("/api/categorie/advanced-search", name="advanced_search_params_API_categorie")
*/
public function advanced_search_params_API_categorie()
{
$em = $this->entityManager->getRepository(Journal::class);
$categories=$em->getJournalWithCategories();
$publishers=$em->selectALLPublishers();
$show_advanced=1;
return $this->json([
'listcategories'=>$categories,
]);
}
/**
*
* @Route("/search_journal_query", name="search_journals")
*/
public function search_journal_for(Request $request)
{
return $this->redirectToRoute('journalSearch');
}
//
/**
* Search journals by scope hints.
*
* @Route("/search-scope", name="search_by_hints")
*/
public function searchByScopeHints(Request $request, JournalRepository $journalRepository,EntityManagerInterface $em,PaginatorInterface $paginator)
{
$hints = $request->query->get('hints', '');
$hintWords = preg_split('/\s+/', $hints, -1, PREG_SPLIT_NO_EMPTY);
$allJournals = $em->getRepository(Journal::class)->searchByScopeHints($hintWords);
$page = $request->get("p", 1);
$perpage = 10;
$journals = $paginator->paginate($allJournals, $page, $perpage);
$pages = ceil($journals->getTotalItemCount() / $perpage);
$total=$journals->getTotalItemCount();
return $this->render('search/Abstract-results.html.twig',
[
'journals' => $journals,
'hints' => $hints,
'page' => $page,
'pages' => $pages,
'total'=>$total
]);
}
/**
* Show the search page.
*
* @Route("/search-abstract", name="search_page")
*/
public function searchPage()
{
return $this->render('search/AbstractSearch.html.twig');
}
/**
* Lists all advancedSearchResults
*
* @Route("/advancedSearchResults", name="advancedSearchResults")
*/
public function advancedSearchResults(Request $request ,EntityManagerInterface $entityManager){
$name_of_publisher=$request->get('name_of_publisher');
$subjectarea=$request->get('subjectarea');
$quartile=$request->get('quartile');
$openAccess=$request->get('openAccess');
$country=$request->get('country');
$signhindex=$request->get('signhindex');
$hindex=$request->get('hindex');
$search="";
if($name_of_publisher && strtoupper($name_of_publisher) != "ALL") $search=$search." - Publisher : ".$name_of_publisher;
if($subjectarea && strtoupper($subjectarea) != "ALL") $search=$search." - Subject Area : ".$subjectarea;
if($quartile) $search=$search." - Quartile : ".$quartile;
if($openAccess) $search=$search." - OpenAccess : ". $openAccess ;
if($country && strtoupper($country) != "ALL") $search=$search." - Country : ". $country ;
if($signhindex && $hindex) $search=$search." - H-index : ". $signhindex." ". $hindex ;
$results=$entityManager->getRepository(Journal::class)->getAdvancedResults($name_of_publisher,$subjectarea,$openAccess,$quartile,$country,$signhindex,$hindex);
$total=$entityManager->getRepository(Journal::class)->countAdvancedSearch($name_of_publisher,$subjectarea,$openAccess,$quartile,$country,$signhindex,$hindex);
$page = $request->get("p", 1);
$perpage = 10;
$journals = $this->paginator->paginate($results, $page, $perpage);
$pages = intval(ceil($total/$perpage));
return $this->render('refonte/default/searchV.html.twig', [
'results'=>$journals,
'search'=>$search,
'page' => $page,
'total'=>$total,
"pages"=>$pages,
]);
}
////////////////////////////////////
/**
* Lists all advancedSearchResults
*
* @Route("/Api/advancedSearchResults", name="test")
*/
public function advancedSearchResultsApi(Request $request, EntityManagerInterface $entityManager, SerializerInterface $serializer)
{
$name_of_publisher=$request->get('name_of_publisher');
$subjectarea=$request->get('subjectarea');
$quartile=$request->get('quartile');
$openAccess=$request->get('openAccess');
$search="";
if($name_of_publisher && strtoupper($name_of_publisher) != "ALL") $search=$search." - Publisher : ".$name_of_publisher;
if($subjectarea && strtoupper($subjectarea) != "ALL") $search=$search." - Subject Area : ".$subjectarea;
if($quartile) $search=$search." - Quartile : ".$quartile;
if($openAccess) $search=$search." - OpenAccess : ". $openAccess ;
$results = $entityManager->getRepository(Journal::class)->getAdvancedResultsApi(
$name_of_publisher,
$subjectarea,
$openAccess,
$quartile
);
$jsonContent = $serializer->serialize($results, 'json', ['groups' => 'api']);
return new JsonResponse($jsonContent, 200, [], true);
}
/**
* Search journals by scope hints.
*
* @Route("/api/search/scope", name="search_by_scope_")
*/
public function searchByScopeHintsAPi(Request $request)
{
$hints = $request->query->get('hints', '');
$hintWords = preg_split('/\s+/', $hints, -1, PREG_SPLIT_NO_EMPTY);
$journalRepository = $this->entityManager->getRepository(Journal::class);
$journals = $journalRepository->searchByScopeHints($hintWords);
$serializedJournals = $this->serializer->serialize($journals, 'json', ['maxDepth' => 1]);
return new JsonResponse($serializedJournals, 200, [], true);
}
}