- <?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');
-         }
-     }
- }
-