<?php
namespace App\Controller;
use App\Entity\Ads;
use App\Entity\Article;
use App\Entity\ArticleCategory;
use App\Entity\CountryState;
use App\Entity\Notification;
use App\Entity\OpenDay;
use App\Entity\Page;
use App\Entity\Phone;
use App\Entity\School;
use App\Entity\SchoolCycle;
use App\Entity\SchoolFee;
use App\Entity\SchoolLanguage;
use App\Entity\SchoolReligion;
use App\Entity\SchoolType;
use App\Entity\Town;
use App\Entity\User;
use App\Service\MySerializer;
use App\Service\PDODbImporter;
use App\Service\SocialMedia;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class DefaultController extends BaseController
{
private $session;
private $bag;
private $schoolLimit;
/**
* DefaultController constructor.
* @param ContainerInterface $c
* @param EntityManagerInterface $em
* @param ParameterBagInterface $params
* @param SessionInterface $s
* @param ParameterBagInterface $bag
*/
public function __construct(ContainerInterface $c, EntityManagerInterface $em, ParameterBagInterface $params, SessionInterface $s, ParameterBagInterface $bag)
{
$this->session = $s;
$this->bag = $bag;
$this->schoolLimit = 102;
parent::__construct($c, $em, $params);
}
public function index(Request $request, PaginatorInterface $paginator):Response{
if(strtolower($request->getMethod())==="get"){
/*$pdo = new PDODbImporter($this->params->get('pdo_dsn'),$this->params->get('pdo_user'),$this->params->get('pdo_password'),'mydb2');
$r = $pdo->importSQL($this->params->get('projectDir').'/'.$this->params->get('school_base_sql'));*/
$data = $this->session->get("data");
if($request->query->get('s') !== NULL && $data !== NULL ){
$required = ['school_type','school_fee','school_language','school_religion','school_cycle','town'];
$opt = ['boarding_school_boy','boarding_school_girl','school_cafetaria','transport_service','street'];
if(!array_key_exists('school_fee',$data)){
$data['school_fee']=[];
}
if(!array_key_exists('school_cycle',$data)){
$data['school_cycle']=[];
}
foreach ($required as $req){
if(!array_key_exists($req,$data)){
$this->addFlash(
'notice',
' required field '.$req
);
return $this->redirectToRoute('index');
}
}
$list = $this->em->getRepository(School::class)->findAdvanced($data);
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
else{
$this->session->set("data", NULL);
$searchKeyword = '';
if($request->query->get('keywords') !== NULL && strlen($request->query->get('keywords'))>0){
$searchKeyword = $request->query->get('keywords');
$list = $this->em->getRepository(School::class)->searchByName($request->query->get('keywords'));
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
else{
$list = $this->em->getRepository(School::class)->findBy(['isActive'=>true,'isDisplayed'=>true],['ranking'=>'ASC','name'=>'ASC']);
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
$this->siteInfo['keywords'] = $searchKeyword;
}
}
else{
$data = $request->request->all();
$this->session->set("data",$data);
return $this->redirect($this->generateUrl('index').'?s=a');
}
$School_types = $this->em->getRepository(SchoolType::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($School_types as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$school_languages = $this->em->getRepository(SchoolLanguage::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($school_languages as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$school_religions = $this->em->getRepository(SchoolReligion::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($school_religions as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$school_cycles = $this->em->getRepository(SchoolCycle::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($school_cycles as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$towns = $this->em->getRepository(Town::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($towns as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$townsArray = [];
foreach ($towns as $t){
$townsArray[]=['id'=>$t->getId(),'state'=>$t->getCountryState()===null?0:$t->getCountryState()->getId(),'name'=>$t->getName()];
}
$states = $this->em->getRepository(CountryState::class)->findBy(['isActive'=>true],['name'=>'ASC']);
foreach ($states as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
$schoolFees = $this->em->getRepository(SchoolFee::class)->findBy(['isActive'=>true],['id'=>'ASC']);
foreach ($schoolFees as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
foreach ($list as $i){
$stype = $i->getSchoolType();
$sreli = $i->getSchoolReligion();
$slang = $i->getSchoolLanguage();
$scycles = $i->getSchoolCycles();
$stype->setTranslatableLocale($this->locale);
$sreli->setTranslatableLocale($this->locale);
$slang->setTranslatableLocale($this->locale);
$this->em->refresh($stype);
$this->em->refresh($sreli);
$this->em->refresh($slang);
foreach ($scycles as $c){
$c->setTranslatableLocale($this->locale);
$this->em->refresh($c);
$i->addSchoolCycle($c);
}
$i->setSchoolType($stype);
$i->setSchoolReligion($sreli);
$i->setSchoolLanguage($slang);
if($i->getIsEducati()){
if($i->getLink()!=null && $i->getLink()!= '' ){
$i->setOpenLink($i->getLink());
}else{
if(file_exists($this->params->get('projectDir').'/../'.$this->params->get('school_folder').'/'.$i->getSlug())){
$i->setOpenLink($this->params->get('school_root_path').$i->getSlug().'/public');
}
}
}
else{
if($i->getLink()!=null && $i->getLink()!= '' ){
$i->setOpenLink($i->getLink());
}
else{
$i->setOpenLink('#');
}
}
}
$data = $paginator->paginate(
$list,$request->query->getInt('page', 1), $this->schoolLimit
);
$this->siteInfo['schools'] = $data;
$this->siteInfo['last_school_nb'] = count($data);
$this->siteInfo['school_limit'] = $this->schoolLimit;
$this->siteInfo['school_types'] = $School_types;
$this->siteInfo['school_languages'] = $school_languages;
$this->siteInfo['school_religions'] = $school_religions;
$this->siteInfo['school_cycles'] = $school_cycles;
$this->siteInfo['towns'] = $towns;
$this->siteInfo['towns_array'] = $townsArray;
$this->siteInfo['states'] = $states;
$this->siteInfo['school_fees'] = $schoolFees;
/*$this->addFlash(
'notice',
$this->mycontainer->get('translator')->trans('page_not_found')
);*/
return $this->render('index.html.twig', $this->siteInfo);
}
public function showMoreSchool(Request $request,$offset): JsonResponse{
$data = $this->session->get("data");
if($request->query->get('s') !== NULL && $data !== NULL ){
$required = ['school_type','school_fee','school_language','school_religion','school_cycle','town'];
$opt = ['boarding_school_boy','boarding_school_girl','school_cafetaria','transport_service','street'];
if(!array_key_exists('school_fee',$data)){
$data['school_fee']=[];
}
if(!array_key_exists('school_cycle',$data)){
$data['school_cycle']=[];
}
foreach ($required as $req){
if(!array_key_exists($req,$data)){
return new JsonResponse(['data'=>' required field '.$req,'message'=>''],401);
}
}
$list = $this->em->getRepository(School::class)->findAdvancedOffset($data,$offset,$this->schoolLimit);
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
else{
$this->session->set("data", NULL);
$searchKeyword = '';
if($request->query->get('keywords') !== NULL && strlen($request->query->get('keywords'))>0){
$searchKeyword = $request->query->get('keywords');
$list = $this->em->getRepository(School::class)->searchByNameOffset($request->query->get('keywords'),$offset,$this->schoolLimit);
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
else{
$list = $this->em->getRepository(School::class)->findBy(['isActive'=>true],['ranking'=>'ASC','name'=>'ASC'],$this->schoolLimit,$offset);
foreach ($list as $item){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
}
$this->siteInfo['keywords'] = $searchKeyword;
}
$schools = [];
foreach ($list as $i){
$stype = $i->getSchoolType();
$sreli = $i->getSchoolReligion();
$slang = $i->getSchoolLanguage();
$scycles = $i->getSchoolCycles();
$stype->setTranslatableLocale($this->locale);
$sreli->setTranslatableLocale($this->locale);
$slang->setTranslatableLocale($this->locale);
$this->em->refresh($stype);
$this->em->refresh($sreli);
$this->em->refresh($slang);
foreach ($scycles as $c){
$c->setTranslatableLocale($this->locale);
$this->em->refresh($c);
$i->addSchoolCycle($c);
}
$i->setSchoolType($stype);
$i->setSchoolReligion($sreli);
$i->setSchoolLanguage($slang);
if($i->getIsEducati()){
if(file_exists($this->params->get('projectDir').'/../'.$this->params->get('school_folder').'/'.$i->getSlug())){
$i->setOpenLink($this->params->get('school_root_path').$i->getSlug().'/public');
}
}
else{
if($i->getLink()!=null && $i->getLink()!= '' ){
$i->setOpenLink($i->getLink());
}
else{
$i->setOpenLink('#');
}
}
$schools[] = $this->mycontainer->get(MySerializer::class)->singleObjectToArray($i,'school_all');
}
return new JsonResponse(['data'=>$schools,'message'=>''],201);
}
public function cgu():Response
{
return $this->render('cgu.html.twig', $this->siteInfo);
}
public function getOneEntity(Request $request,$entity, $id): JsonResponse{
switch ($entity){
case 'article':
$class = Article::class;
$trans = true;
$group = 'article_all';
break;
case 'category':
$class = ArticleCategory::class;
$trans = true;
$group = 'category_all';
break;
case 'ads':
$class = Ads::class;
$trans = true;
$group = 'ads_all';
break;
case 'phone':
$class = Phone::class;
$trans = false;
$group = 'phone_all';
break;
case 'open_hour':
$class = OpenDay::class;
$trans = false;
$group = 'day_all';
break;
default:
return new JsonResponse(["data"=>null,"message"=>"bad object"],401);
}
$item = $this->em->getRepository($class)->findOneBy(['id'=>$id]);
if($trans){
$item->setTranslatableLocale($this->locale);
$this->em->refresh($item);
}
if($item !== null){
$data = $this->mycontainer->get(MySerializer::class)->singleObjectToArray($item,$group);
return new JsonResponse(['data'=>$data,'message'=>''],201);
}
return new JsonResponse(["data"=>null,"message"=>$this->mycontainer->get('translator')->trans('object_not_found')],401);
}
public function getLatestArticle(Request $request,$limit=10,$offset=0): JsonResponse{
$tot = $this->em->getRepository(Article::class)->countAll();
$total = $tot[0]['nb'];
$item = $this->em->getRepository(Article::class)->findBy(['isActive'=>true],['id'=>'DESC'],$limit,$offset);
$lang = $request->query->get('lang');
if(!in_array($lang,$this->languages)){
$lang = 'second';
}
foreach ($item as $i){
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
}
if(count($item)>0){
$data = $this->mycontainer->get(MySerializer::class)->multipleObjectToArray($item,'article_all');
return new JsonResponse(['data'=>$data,'message'=>'',"total"=>$total],201);
}
return new JsonResponse(["data"=>[],"message"=>$this->mycontainer->get('translator')->trans('object_not_found'),"total"=>$total],201);
}
public function getLatestNotification(Request $request): JsonResponse{
$item = $this->em->getRepository(Notification::class)->findBy(['isActive'=>true],['id'=>'DESC']);
$data = [];
$now = new \DateTime();
$lang = $request->query->get('lang');
if(!in_array($lang,$this->languages)){
$lang = 'second';
}
foreach ($item as $i){
if($i->getExpiredAt() === null){
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$data[]=$i;
}
else{
if($i->getExpiredAt()>= $now){
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$data[]=$i;
}
}
}
if(count($data)>0){
$send = $this->mycontainer->get(MySerializer::class)->multipleObjectToArray($item,'notif_all');
return new JsonResponse(['data'=>$send,'message'=>''],201);
}
return new JsonResponse(["data"=>[],"message"=>$this->mycontainer->get('translator')->trans('object_not_found')],201);
}
public function showArticle(Request $request, $slug){
$referer = $request->headers->get('referer');
$article = $this->em->getRepository(Article::class)->findOneBy(['slug'=>$slug]);
if($article === null){
$this->addFlash(
'notice',
$this->mycontainer->get('translator')->trans('page_not_found')
);
return $this->redirect($referer ?? '/');
}
$article->setTranslatableLocale($this->locale);
$this->em->refresh($article);
$recents = $this->em->getRepository(Article::class)->findRecentExcept($article->getId());
foreach ($recents as $n){
$cat = $n->getCategory();
$cat->setTranslatableLocale($this->locale);
$this->em->refresh($cat);
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
$n->setCategory($cat);
}
$this->siteInfo['article'] = $article;
$this->siteInfo['recents'] = $recents;
$social = new SocialMedia();
$links = $social->GetSocialMediaSiteLinks_WithShareLinks([
'url'=>$this->bag->get('base_url').$this->generateUrl('blog_show_article',['slug'=>$article->getSlug()]),
'title'=>$article->getTitle()
]);
$this->siteInfo['links'] = $links;
return $this->render('blog/show_article_model_1.html.twig', $this->siteInfo);
}
public function showArticleByUser(Request $request,$id, PaginatorInterface $paginator){
$referer = $request->headers->get('referer');
$tab = explode('-',$id);
$user = $this->em->getRepository(User::class)->findOneBy(['id'=>$tab[array_key_last($tab)]]);
if($user === null){
$this->addFlash(
'notice',
$this->mycontainer->get('translator')->trans('user_not_found')
);
return $this->redirect($referer ?? '/');
}
$entities2 = $this->em->getRepository(Article::class)->findBy(['isActive'=>true,'stage'=>1,'user'=>$user]);
foreach ($entities2 as $n){
$cat = $n->getCategory();
$cat->setTranslatableLocale($this->locale);
$this->em->refresh($cat);
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
$n->setCategory($cat);
}
$articles = $paginator->paginate(
$entities2,$request->query->getInt('page', 1), 10
);
$entities = $this->em->getRepository(ArticleCategory::class)->findBy(['isActive'=>true,'stage'=>1]);
foreach ($entities as $n){
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
}
$this->siteInfo['articles'] = $articles;
$this->siteInfo['categories'] = $entities;
$this->siteInfo['user'] = $user;
return $this->render('blog/articles_user_model_1.html.twig', $this->siteInfo);
}
public function blog(Request $request, PaginatorInterface $paginator){
$entities = $this->em->getRepository(ArticleCategory::class)->findBy(['isActive'=>true]);
$entities2 = $this->em->getRepository(Article::class)->findBy(['isActive'=>true],['id'=>'DESC']);
$notifs = $this->em->getRepository(Notification::class)->findBy(['isActive'=>true],['date'=>'DESC']);
foreach ($notifs as $n){
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
}
foreach ($entities as $n){
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
}
foreach ($entities2 as $n){
$cat = $n->getCategory();
$cat->setTranslatableLocale($this->locale);
$this->em->refresh($cat);
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
$n->setCategory($cat);
}
$this->siteInfo['date_now'] =new \DateTime();
$articles = $paginator->paginate(
$entities2,$request->query->getInt('page', 1), 10
);
$this->siteInfo['categories'] = $entities;
$this->siteInfo['articles'] = $articles;
$this->siteInfo['school_notifs'] =$notifs;
return $this->render('blog/articles.html.twig', $this->siteInfo);
}
public function showArticleByCategory(Request $request,$slug, PaginatorInterface $paginator){
$referer = $request->headers->get('referer');
$cat = $this->em->getRepository(ArticleCategory::class)->findOneBy(['slug'=>$slug]);
if($cat === null){
$this->addFlash(
'notice',
$this->mycontainer->get('translator')->trans('category_not_found')
);
return $this->redirect($referer ?? '/');
}
$cat->setTranslatableLocale($this->locale);
$this->em->refresh($cat);
$entities2 = $this->em->getRepository(Article::class)->findBy(['isActive'=>true,'category'=>$cat]);
foreach ($entities2 as $n){
$cat = $n->getCategory();
$cat->setTranslatableLocale($this->locale);
$this->em->refresh($cat);
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
$n->setCategory($cat);
}
$articles = $paginator->paginate(
$entities2,$request->query->getInt('page', 1), 10
);
$entities = $this->em->getRepository(ArticleCategory::class)->findBy(['isActive'=>true]);
foreach ($entities as $n){
$n->setTranslatableLocale($this->locale);
$this->em->refresh($n);
}
$this->siteInfo['articles'] = $articles;
$this->siteInfo['categories'] = $entities;
$this->siteInfo['current_category'] = $cat;
return $this->render('blog/articles_category.html.twig', $this->siteInfo);
}
public function about():Response
{
return $this->render('about.html.twig', $this->siteInfo);
}
public function contact():Response
{
$entities = $this->em->getRepository(Phone::class)->findBy(['isActive'=>true]);
$entities2 = $this->em->getRepository(OpenDay::class)->findBy(['isActive'=>true]);
$this->siteInfo['phones'] = $entities;
$this->siteInfo['days'] = $entities2;
return $this->render('contact.html.twig', $this->siteInfo);
}
// listes des annonces
// afficher une annonce
public function getAds(Request $request,$limit=8,$offset=0): JsonResponse{
$item = $this->em->getRepository(Ads::class)->findBy(['isActive'=>true],['position'=>'ASC','id'=>'DESC']);
$ok = [];
$res = [];
$now = new \DateTime();
$lang = $request->query->get('lang');
if(!in_array($lang,$this->languages)){
$lang = 'second';
}
foreach ($item as $i){
if($i->getStartAt() !== null){
if($i->getStartAt() <= $now){
if($i->getExpiredAt() !== null){
if($i->getExpiredAt()>= $now){
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$ok[]=$i;
}
}
else{
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$ok[]=$i;
}
}
}
else{
if($i->getExpiredAt() !== null){
if($i->getExpiredAt()>= $now){
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$ok[]=$i;
}
}
else{
$i->setTranslatableLocale($lang);
$this->em->refresh($i);
$ok[]=$i;
}
}
}
if(count($ok)>0){
foreach ($ok as $k => $i){
if($k >=$offset && $k< $limit){
$res[] = $this->mycontainer->get(MySerializer::class)->singleObjectToArray($i,'ads_all');
}
}
}
return new JsonResponse(['data'=>$res,'message'=>''],201);
}
public function displayAds(Request $request, $slug):Response
{
$referer = $request->headers->get('referer');
$ads = $this->em->getRepository(Ads::class)->findOneBy(['slug'=>$slug]);
if($ads === null){
$this->addFlash(
'notice',
$this->mycontainer->get('translator')->trans('object_not_found')
);
return $this->redirect($referer ?? '/');
}
$ads->incNbView();
$this->em->persist($ads);
$this->em->flush();
if(strlen($ads->getLink())>=4){
return $this->redirect($ads->getLink());
}else{
return $this->redirectToRoute('index');
}
}
}