<?php
namespace App\Controller;
use App\Entity\{BlogCategorie, BlogCategorieTranslation};
use App\Entity\{BlogArticle, BlogArticleTranslation};
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\{Response, Request};
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\Contact;
use App\Form\ContactType;
use App\Manager\ContactManager;
class BlogController extends AbstractController
{
#[Route('/blog', name: 'blog')]
#[Route('/{_locale}/blog', name: 'blog.es', requirements: ['_locale' => 'es'])]
#[Route('/{_locale}/blog', name: 'blog.de', requirements: ['_locale' => 'de'])]
#[Route('/{_locale}/blog/page/{page}', name: 'blog.page.es', requirements: ['_locale' => 'es'])]
#[Route('/{_locale}/blog/page/{page}', name: 'blog.page.de', requirements: ['_locale' => 'de'])]
#[Route('/blog/page/{page}', name: 'blog.page')]
public function index(Request $request, ContactManager $contactManager, EntityManagerInterface $em, $page = 1): Response
{
$totalArticles = 8;
$start = ($page * $totalArticles) -$totalArticles;
$articles_total = $em->createQueryBuilder()
->select('count(a)')
->from(BlogArticle::class, 'a')
->join('a.translations', 't', 'WITH', 't.locale LIKE :locale')
->where('a.isActive = true')
->andWhere('t.slug is not null')
->orderBy('a.datePublication', 'DESC')
->setParameter(':locale', $request->getLocale() )
->getQuery()
->getSingleScalarResult()
;
$pages = ceil($articles_total / $totalArticles);
$articles = $em->createQueryBuilder()
->select('a')
->from(BlogArticle::class, 'a')
->join('a.translations', 't', 'WITH', 't.locale LIKE :locale')
->where('a.isActive = true')
->andWhere('t.slug is not null')
->orderBy('a.datePublication', 'DESC')
->setParameter(':locale', $request->getLocale() )
->setMaxResults($totalArticles)
->setFirstResult($start)
->getQuery()
->getResult()
;
return $this->render('blog/index.html.twig', [
'articles' => $articles,
'articles_total' => $articles_total,
'pages' => $pages,
'current_page' => $page
]);
}
#[Route('/blog/category/{slug}', name: 'blog.category')]
#[Route('/blog/category/{slug}/page/{page}', name: 'blog.category.page')]
#[Route('/{_locale}/blog/category/{slug}', name: 'blog.category.es', requirements: ['_locale' => 'es'])]
#[Route('/{_locale}/blog/category/{slug}/page/{page}', name: 'blog.category.page.es', requirements: ['_locale' => 'es'])]
#[Route('/{_locale}/blog/category/{slug}', name: 'blog.category.de',requirements: ['_locale' => 'de'])]
#[Route('/{_locale}/blog/category/{slug}/page/{page}', name: 'blog.category.page.de', requirements: ['_locale' => 'de'])]
public function category(BlogCategorieTranslation $blogCategorieTranslation, Request $request,EntityManagerInterface $em, $page=1): Response
{
$blogCategorie = $blogCategorieTranslation->getTranslatable();
$totalArticles = 8;
$start = ($page * $totalArticles) -$totalArticles;
$articles_total = $em->createQueryBuilder()
->select('count(a)')
->from(BlogArticle::class, 'a')
->join('a.categories', 'b')
->join('a.translations', 't', 'WITH', 't.locale LIKE :locale')
->where('b.id = :categorie_id')
->andWhere('b.isActive = true')
->andWhere('t.slug is not null')
->setParameter(':categorie_id', $blogCategorie->getId())
->setParameter(':locale', $request->getLocale() )
->getQuery()
->getSingleScalarResult()
;
$pages = ceil($articles_total / $totalArticles);
$articles = $em->createQueryBuilder()
->select('a')
->from(BlogArticle::class, 'a')
->join('a.categories', 'b')
->join('a.translations', 't', 'WITH', 't.locale LIKE :locale')
->where('b.id = :categorie_id')
->andWhere('b.isActive = true')
->andWhere('t.slug is not null')
->setParameter(':categorie_id', $blogCategorie->getId())
->setParameter(':locale', $request->getLocale() )
->orderBy('a.datePublication', 'DESC')
->setMaxResults($totalArticles)
->setFirstResult($start)
->getQuery()
->getResult()
;
return $this->render('blog/categorie.html.twig', [
'blogCategorie' => $blogCategorie,
'articles' => $articles,
'articles_total' => $articles_total,
'pages' => $pages,
'current_page' => $page
]);
}
#[Route('/blog/{slug}', name: 'blog.show')]
#[Route('/{_locale}/blog/{slug}', name: 'blog.show.es', requirements: ['_locale' => 'es'])]
#[Route('/{_locale}/blog/{slug}', name: 'blog.show.de', requirements: ['_locale' => 'de'])]
public function show(BlogArticleTranslation $articleTranslate, Request $request,EntityManagerInterface $em): Response
{
$article = $articleTranslate->getTranslatable();
if(!$article->isIsActive()){
return $this->redirectToRoute('blog.list');
}
$articles_query = $em->createQueryBuilder()
->select('a')
->from(BlogArticle::class, 'a')
->join('a.translations', 't', 'WITH', 't.locale LIKE :locale')
->leftJoin('a.categories', 'c')
->where('a.isActive = true')
->andWhere('t.slug is not null')
->andWhere('a.id != :current')
->orderBy('a.datePublication', 'DESC')
->setParameter(':locale', $request->getLocale() )
->setParameter(':current', $article->getId())
;
// $orStatements = $articles_query->expr()->orX();
$orX = $articles_query->expr()->orX();
foreach($article->getCategories() as $c){
$conditions[] = $articles_query->expr()->literal($c->getId());
}
$articles = [];
if(!empty($conditions)){
$articles = $articles_query->andWhere($articles_query->expr()->in('c.id', $conditions))->setMaxResults(3)->getQuery()->getResult();
}
if(empty($articles)){
$articles = $articles_query->setMaxResults(3)->getQuery()->getResult();
}
return $this->render('blog/show.html.twig', [
'article' => $article,
'articles' => $articles
]);
}
public function lastArticles(Request $request, EntityManagerInterface $em): Response
{
$lastArticles = $em->createQueryBuilder()
->select('b')
->from(BlogArticle::class, 'b')
->join('b.translations', 't', 'WITH', 't.locale = :locale AND t.slug IS NOT NULL')
->setParameter(':locale', $request->getLocale() )
->orderBy('b.datePublication', 'DESC')
->setMaxResults(5)
->getQuery()
->getResult()
;
return $this->render('blog/includes/last_articles.html.twig', [
'articles' => $lastArticles,
]);
}
public function categories(Request $request, EntityManagerInterface $em): Response
{
$categories = $em->createQueryBuilder()
->select('b')
->from(BlogCategorieTranslation::class, 'b')
->leftJoin('b.translatable', 'bc')
->where('b.locale LIKE :locale')
->andWhere('bc.categoryParent is null')
->setParameter(':locale', $request->getLocale())
->orderBy('b.nom', 'ASC')
->getQuery()
->getResult()
;
return $this->render('blog/includes/categories.html.twig', [
'categories' => $categories,
]);
}
public function last3Articles(Request $request, EntityManagerInterface $em): Response
{
$lastArticles = $em->createQueryBuilder()
->select('b')
->from(BlogArticle::class, 'b')
->join('b.translations', 't', 'WITH', 't.locale = :locale AND t.slug IS NOT NULL')
->setParameter(':locale', $request->getLocale() )
->orderBy('b.datePublication', 'DESC')
->setMaxResults(3)
->getQuery()
->getResult()
;
return $this->render('includes/blog.html.twig', [
'articles' => $lastArticles,
]);
}
#[Route('/blog-update-image', name: 'blog-update-image')]
public function updateImageAction(Request $request){
//$projet_id = $request->getSession()->get('projet');
$time = time();
$date = new \Datetime();
$year = $date->format('Y');
$months = $date->format('m');
$path = $this->getParameter('app.public')."wp-content/uploads/".$time."_".$_FILES['upload']['name'];
$folder = $this->getParameter('app.public')."wp-content/uploads/";
$url = "/wp-content/uploads/".$time."_".$_FILES['upload']['name'];
if (!file_exists($folder)) {
mkdir($folder, 0777, true);
}
$psd_type = array(
0 => 'image/psd',
1 => 'image/x-photoshop',
2 => 'application/photoshop',
3 => 'zz-application/zz-winassoc-psd',
4 => 'application/psd',
5 => 'image/vnd.adobe.photoshop'
);
$move = false;
if (($_FILES['upload'] == "none") OR (empty($_FILES['upload']['name'])) )
{
$message = "No file uploaded.";
}
else if ($_FILES['upload']["size"] == 0)
{
$message = "The file is of zero length.";
}
else if (($_FILES['upload']["type"] != "image/pjpeg") AND ($_FILES['upload']["type"] != "image/jpeg") AND ($_FILES['upload']["type"] != "image/png") /*AND !(in_array($_FILES['upload']["type"], $psd_type))*/)
{
$message = "The image must be in either JPG or PNG format. Please upload a JPG or PNG instead.";
}
else if (!is_uploaded_file($_FILES['upload']["tmp_name"]))
{
$message = "You may be attempting to hack our server. We're on to you; expect a knock on the door sometime soon.";
}
else {
$message = "";
$move = @ move_uploaded_file($_FILES['upload']['tmp_name'], $path);
if(!$move)
{
$message = "Error moving uploaded file. Check the script is granted Read/Write/Modify permissions.";
}
$url = $url;
}
if($move){
return new JsonResponse((array("uploaded" =>1, "fileName" => $_FILES['upload']['tmp_name'], 'url' => $url, 'width' => '100%', 'height' => '100%')));
}else{
return new JsonResponse(array("uploaded" =>0, "error" => array('message' => $message)));
}
}
}