<?php
namespace App\Controller;
use App\Entity\AboutPage;
use App\Entity\BigWorkPage;
use App\Entity\BigWorks;
use App\Entity\Configuration;
use App\Entity\Contact;
use App\Entity\ContactQueryType;
use App\Entity\GeneralCategory;
use App\Entity\HomePage;
use App\Entity\HomeSlider;
use App\Entity\ManualsAndCatalogs;
use App\Entity\ManualsAndCatalogsPage;
use App\Entity\News;
use App\Entity\NewsPage;
use App\Entity\ProductCategory;
use App\Entity\ProductsPage;
use App\Entity\Regiones;
use App\Entity\UsPage;
use App\Repository\AboutPageRepository;
use App\Repository\BigWorkPageRepository;
use App\Repository\BigWorksRepository;
use App\Repository\ComunasRepository;
use App\Repository\ConfigurationRepository;
use App\Repository\ContactQueryTypeRepository;
use App\Repository\GeneralCategoryRepository;
use App\Repository\HomePageRepository;
use App\Repository\ManualsAndCatalogsPageRepository;
use App\Repository\ManualsAndCatalogsRepository;
use App\Repository\NewsPageRepository;
use App\Repository\NewsRepository;
use App\Repository\ProductCategoryRepository;
use App\Repository\ProductsPageRepository;
use App\Repository\RegionRepository;
use App\Repository\SearchPageRepository;
use App\Repository\UsPageRepository;
use App\Twig\Extension\MediaExtension;
use App\Utils\SeoUtils;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Mime\Email;
class DefaultController extends AbstractController
{
public function __construct(private readonly SeoUtils $seoUtils)
{
}
/**
* @Route("/{reactRouting}", name="homepage", requirements={"reactRouting"=".+"}, defaults={"reactRouting": null}, priority=-10)
*/
public function indexAction(): Response
{
return $this->render('default/index.html.twig');
}
/**
* @Route("/data/homeData.json", name="data_home")
*/
public function dataHomeAction(HomePageRepository $homePage, MediaExtension $media): Response
{
/** @var HomePage $page */
$page = $homePage->findOneBy([]);
$data[] = [
"id" => $page->getId(),
"aboutTxt" => $page->getAboutUsDescription(),
"aboutImg" => $media->media($page->getAboutUsImage()),
"linkWsp" => $page->getWspUrl(),
"bannerWspDesk" => $media->media($page->getWspImage()),
"bannerWspMobile" => $media->media($page->getWspImageMobile()),
'linkCommunity' => $page->getCommunityLink(),
'bannerCommunity' => $media->media($page->getCommunityBanner()),
'bannerCommunityMobile' => $media->media($page->getCommunityBannerMobile()),
"bigWorksDesk" => $media->media($page->getBigWorkImage()),
"bigWorksMobile" => $media->media($page->getBigWorkImageMobile()),
"ceapDesk" => $media->media($page->getCeapImage()),
"ceapMobile" => $media->media($page->getCeapImageMobile()),
"seoTitle" => $page->getSeo()->getTitle(),
"seoDescription" => $page->getSeo()->getDescription(),
"seoKeyword" => $page->getSeo()->getKeywords(),
"videoUrl" => $page->getVideo() ? $media->getMediaUrl($page->getVideo()) : '',
"videoPoster" => $media->media($page->getVideoImage()),
];
return $this->json($data);
}
/**
* @Route("/data/About.json", name="data_about")
*/
public function dataAboutAction(AboutPageRepository $pageRepository, MediaExtension $media): Response
{
/** @var AboutPage $page */
$page = $pageRepository->findOneBy([]);
$data[] = [
'seo' => [
'title' => $page->getSeo()->getTitle(),
'description' => $page->getSeo()->getDescription(),
'keywords' => $page->getSeo()->getKeywords(),
],
'banner' => [
'imgDesktop' => $media->media($page->getBannerDesk()),
'imgMobile' => $media->media($page->getBannerMobile()),
],
'hero' => [
'image' => $media->media($page->getHeroImage()),
'text' => $page->getHeroText(),
],
'bloque1' => [
'image' => $media->media($page->getBlock1Image()),
'text' => $page->getBlock1(),
],
'bloque2' => [
'image' => $media->media($page->getBlock2Image()),
'text' => $page->getBlock2(),
],
'bloque3' => [
'image' => $media->media($page->getBlock3Image()),
'text' => $page->getBlock3(),
],
];
return $this->json($data);
}
/**
* @Route("/data/homeSlide.json", name="data_home_slider")
*/
public function dataHomeSliderAction(HomePageRepository $homePage, MediaExtension $media): Response
{
/** @var HomePage $page */
$page = $homePage->findOneBy([]);
$data = [];
/** @var HomeSlider[] $slider */
foreach ($page->getSliders() as $slider) {
if ($slider->isIsPublic()) {
$data[] = [
"id" => $slider->getId(),
"bannerDesckt" => $media->media($slider->getImage()),
"bannerMobile" => $media->media($slider->getImageMobile()),
"name" => $slider->getName(),
"url" => $slider->getUrl(),
];
}
}
return $this->json($data);
}
/**
* @Route("/data/news.json", name="data_news")
*/
public function dataNewsAction(NewsRepository $newsRepository, MediaExtension $media): Response
{
$news = $newsRepository->findBy(['public' => true]);
$data = [];
/** @var News[] $news */
foreach ($news as $item) {
$data[] = [
"id" => $item->getid(),
"path" => $item->getSlug(),
"time" => $item->getPublicDate()->format('F Y'),
"title" => $item->getName(),
"description" => $item->getDescription(),
"news" => $item->getBody(),
"img" => $media->media($item->getImage()),
"img_cover" => $media->media($item->getImageCover()),
"seoTitle" => $item->getSeo()->getTitle(),
"seoDescription" => $item->getSeo()->getDescription(),
"seoKeyword" => $item->getSeo()->getKeywords()
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/category.json", name="data_category")
*/
public function dataCategoryAction(ProductCategoryRepository $categoryRepository, MediaExtension $media): Response
{
$categories = $categoryRepository->findBy([], ['position' => 'ASC']);
$data = [];
/** @var ProductCategory[] $categories */
foreach ($categories as $item) {
$data[] = [
"id" => $item->getId(),
'public' => $item->isPublic(),
"lineId" => $item->getGeneralCategory()->getId(),
"name" => $item->getName(),
"path" => $item->getSlug(),
"seoTitle" => $item->getSeo()->getTitle(),
"seoDescription" => $item->getSeo()->getDescription(),
"seoKeyword" => $item->getSeo()->getKeywords()
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/product.json", name="data_product")
*/
public function dataProductAction(ProductCategoryRepository $categoryRepository, MediaExtension $media): Response
{
$categories = $categoryRepository->findBy([]);
$data_tmp = [];
$data = [];
/** @var ProductCategory[] $categories */
foreach ($categories as $item) {
foreach ($item->getProducts() as $product) {
if ($product->isPublic()) {
$data_tmp[$product->getId()] = [
"id" => $product->getId(),
"catId" => $item->getId(),
"name" => $product->getName(),
"path" => $product->getSlug(),
"space" => "INTERIOR, EXTERIOR",
"productType" => "BARNIZ, TEXTURAS",
"ambienceType" => "",
"surface" => "",
"description" => $product->getDescription(),
"use" => $product->getUses(),
"conditions" => $product->getConditions(),
"tools" => $product->getTools(),
"dilution" => $product->getDilution(),
"layers" => $product->getLayers(),
"dryingTime" => $product->getDryingTime(),
"touchDrying" => $product->getTouchDrying(),
"repaintDrying" => $product->getRepaintDrying(),
"finalDrying" => $product->getFinalDrying(),
"video" => $product->getVideo() ? $media->getMediaUrl($product->getVideo()) : null,
"videoImg" => $media->media($product->getVideoImage()),
"img" => $media->media($product->getImage()),
"imgCover" => $media->media($product->getImageCover()),
"dataSheet" => $product->getDataSheet(),
"safetySheet" => $product->getSafetySheet(),
"safetySheetCB" => $product->getSafetySheetCb(),
"transportSheet" => $product->getTransportSheet(),
"packedColors" => $product->getPackedColors(),
"linkMP" => $product->getLinkMp()
];
}
}
}
foreach ($data_tmp as $item) {
$data[] = $item;
}
unset($data_tmp);
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/newfilter.json", name="data_new_filter")
*/
public function dataNewFilterAction(Request $request, ProductCategoryRepository $categoryRepository, MediaExtension $media): Response
{
$cat = $request->query->get('cat');
$filters = [];
$filters1 = [];
$filters2 = [];
$filters3 = [];
$tmp_prods = [];
if ($cat == 'h') {
$categories = $categoryRepository->findBy(['general_category' => 2]);
} elseif ($cat == 'c') {
$categories = $categoryRepository->findBy(['general_category' => 1]);
} else {
$categories = $categoryRepository->findBy(['id' => $cat]);
}
/** @var ProductCategory[] $categories */
foreach ($categories as $category) {
foreach ($category->getProducts() as $product) {
foreach ($product->getFilters() as $filter) {
$filters1[$filter->getFilter1()->getId()] = [
'id' => $filter->getFilter1()->getId(),
'name' => $filter->getFilter1()->getName(),
];
$filters2[$filter->getFilter1()->getId()][$filter->getFilter2()->getId()] = [
'id' => $filter->getFilter2()->getId(),
'name' => $filter->getFilter2()->getName(),
];
if ($filter->getFilter3()){
$tmp_prods[$filter->getFilter1()->getId()][$filter->getFilter2()->getId()][$filter->getFilter3()->getId()][$filter->getProduct()->getId()] = $filter->getProduct()->getId();
$filters3[$filter->getFilter1()->getId()][$filter->getFilter2()->getId()][$filter->getFilter3()->getId()] = [
'id' => $filter->getFilter3()->getId(),
'name' => $filter->getFilter3()->getName(),
];
}else{
$tmp_prods[$filter->getFilter1()->getId()][$filter->getFilter2()->getId()][$filter->getProduct()->getId()] = $filter->getProduct()->getId();
$filters3 = [];
}
}
}
}
foreach ($filters1 as $key => $item) {
foreach ($filters2[$key] as $key2 => $item2) {
if ($filter->getFilter3()){
foreach ($filters3[$key][$key2] as $key3 => $item3) {
$fil3[$key][$key2][] = array_merge($filters3[$key][$key2][$key3], ['products' => array_values($tmp_prods[$key][$key2][$key3])]);
}
$fil2[$key][] = array_merge($filters2[$key][$key2], ['AmbienceType' => $fil3[$key][$key2]]);
}else{
$fil2[$key][] = $filters2[$key][$key2];
}
}
$filters[] = array_merge($filters1[$key], ['productType' => $fil2[$key]]);
}
return $this->json($filters, 200, [], ['json_encode_options' => JSON_PRETTY_PRINT]);
}
/**
* @Route("/data/cataloge.json", name="data_cataloge")
*/
public function ManualsAndCatalogsAction(Request $request, ManualsAndCatalogsRepository $manualsAndCatalogsRepository, MediaExtension $media): Response
{
/** @var ManualsAndCatalogs[] $entities */
$entities = $manualsAndCatalogsRepository->findBy(['public' => true]);
$data = [];
foreach ($entities as $entity) {
$data[] = [
"id" => $entity->getId(),
"name" => $entity->getName(),
"path" => $entity->getSlug(),
"img" => $media->media($entity->getImage()),
"description" => $entity->getDescription(),
"file" => $media->media($entity->getFile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords()
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_PRETTY_PRINT]);
}
/**
* @Route("/data/bigWorks.json", name="data_big_works")
*/
public function bigWorksAction(BigWorksRepository $repository, MediaExtension $media): Response
{
$big_works = $repository->findBy(['public' => true]);
$data = [];
/** @var BigWorks[] $big_works */
foreach ($big_works as $item) {
$data[] = [
"id" => $item->getid(),
"path" => $item->getSlug(),
"time" => $item->getPublicDate()->format('F Y'),
"title" => $item->getName(),
"description" => $item->getDescription(),
"news" => $item->getBody(),
"img" => $media->media($item->getImage()),
"img_cover" => $media->media($item->getImageCover()),
"seoTitle" => $item->getSeo()->getTitle(),
"seoDescription" => $item->getSeo()->getDescription(),
"seoKeyword" => $item->getSeo()->getKeywords()
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/bannerBigWorks.json", name="data_banner_big_works")
*/
public function bannerBigWorksAction(BigWorkPageRepository $repository, MediaExtension $media): Response
{
/** @var BigWorkPage $big_works */
$big_works = $repository->findOneBy([]);
$data[] = [
"id" => $big_works->getId(),
"bannerDeskt" => $media->media($big_works->getImage()),
"bannerMobile" => $media->media($big_works->getImageMobile()),
"seoTitle" => $big_works->getSeo()->getTitle(),
"seoDescription" => $big_works->getSeo()->getDescription(),
"seoKeyword" => $big_works->getSeo()->getKeywords()
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/bannerCataloge.json", name="data_banner_cataloge")
*/
public function bannerCatalogeAction(ManualsAndCatalogsPageRepository $repository, MediaExtension $media): Response
{
/** @var ManualsAndCatalogsPage $entity */
$entity = $repository->findOneBy([]);
$data[] = [
"id" => $entity->getId(),
"bannerDeskt" => $media->media($entity->getImage()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords()
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/bannerNews.json", name="data_banner_news")
*/
public function bannerNewsAction(NewsPageRepository $repository, MediaExtension $media): Response
{
/** @var NewsPage $entity */
$entity = $repository->findOneBy([]);
$data[] = [
"id" => $entity->getId(),
"bannerDeskt" => $media->media($entity->getImage()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords()
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/bannerProduct.json", name="data_banner_product")
*/
public function bannerProductAction(ProductsPageRepository $repository, MediaExtension $media): Response
{
/** @var ProductsPage $entity */
$entity = $repository->findOneBy([]);
$data[] = [
"id" => $entity->getId(),
"bannerDeskt" => $media->media($entity->getImage()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords()
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/lines.json", name="data_lines")
*/
public function linesAction(GeneralCategoryRepository $repository, MediaExtension $media): Response
{
/** @var GeneralCategory $entity */
$entities = $repository->findBy([]);
$data = [];
foreach ($entities as $entity) {
$data[] = [
"id" => $entity->getId(),
"name" => $entity->getName(),
"path" => $entity->getSlug(),
"image" => $media->media($entity->getImage()),
"bannerDesk" => $media->media($entity->getImageDesk()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords(),
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/search.json", name="data_search")
*/
public function searchAction(SearchPageRepository $repository, MediaExtension $media): Response
{
/** @var ProductsPage $entity */
$entity = $repository->findOneBy([]);
$data[] = [
"id" => $entity->getId(),
"name" => $entity->getName(),
"path" => $entity->getSlug(),
"bannerDeskt" => $media->media($entity->getImage()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords(),
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/us.json", name="data_us")
*/
public function usAction(UsPageRepository $repository, MediaExtension $media): Response
{
/** @var UsPage $entity */
$entity = $repository->findOneBy([]);
$data[] = [
"id" => $entity->getId(),
"bannerDeskt" => $media->media($entity->getImage()),
"bannerMobile" => $media->media($entity->getImageMobile()),
"seoTitle" => $entity->getSeo()->getTitle(),
"seoDescription" => $entity->getSeo()->getDescription(),
"seoKeyword" => $entity->getSeo()->getKeywords(),
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/region.json", name="data_region")
*/
public function regionAction(RegionRepository $repository): Response
{
/** @var Regiones[] $entity */
$entities = $repository->findBy([]);
$data = [];
foreach ($entities as $item) {
$comm = [];
foreach ($item->getComunas() as $comuna) {
$comm[] = [
'id' => $comuna->getId(),
'name' => $comuna->getEtiqueta(),
];
}
$data[] = [
"id" => $item->getId(),
"name" => $item->getEtiqueta(),
"comuna" => $comm,
];
}
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/typeForm.json", name="data_type_form")
*/
public function typeFormAction(ContactQueryTypeRepository $contactQueryTypeRepository): Response
{
/** @var ContactQueryType[] $entity */
$entities = $contactQueryTypeRepository->findBy([]);
$data = array_values(array_map(
fn($item) => [
'id' => $item->getId(),
'name' => $item->getName(),
],
array_filter($entities, fn($item) => $item->isPublic())
));
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/contact", name="contact")
*/
public function contactAction(ValidatorInterface $validator, Request $request, MailerInterface $mailer, ComunasRepository $comunasRepository, RegionRepository $regionRepository, ContactQueryTypeRepository $contactQueryTypeRepository, ConfigurationRepository $configurationRepository, EntityManagerInterface $entityManager)
{
$entity = new Contact();
$post = $request;
$config = $configurationRepository->findOneBy([]);
$entity->setName($post->get('name'));
$query_type = $contactQueryTypeRepository->findOneBy(['id' => $post->get('type')]);
$entity->setQueryType($query_type);
$entity->setEmail($post->get('email'));
$entity->setPhone($post->get('phone'));
$region = $regionRepository->findOneBy(['id' => $post->get('region')]);
$entity->setRegion($region);
$commune = $comunasRepository->findOneBy(['id' => $post->get('commune')]);
$entity->setCommune($commune);
$entity->setActivity($post->get('activity'));
$entity->setMessage($post->get('inquiry'));
$entity->setTerms($post->get('condition'));
$validate = $validator->validate($entity);
$errors = [];
if (count($validate) > 0) {
foreach ($validate as $error) {
$errors[$error->getPropertyPath()] = $error->getMessage();
}
$result[] = [
'result' => 'error',
'errors' => $errors
];
} else {
$result[] = [
'result' => 'success',
'errors' => []
];
$entityManager->persist($entity);
$entityManager->flush();
$email = (new Email());
$email->from('site@chilcorrofin.cl');
$i = 0;
foreach (explode(',', $config->getReceibers()) as $item) {
if ($i === 0) {
$email->to($item);
} else {
$email->addCc($item);
}
}
$email->addBcc('mfigueroa@digitalmarketing.cl');
$email->subject('Mensaje de Contácto')
->html($this->renderView('emails/contact.html.twig', [
'entity' => $entity
]));
$mailer->send($email);
// $this->sendMailInfoAPi($entity->getName(), $entity->getEmail(), $entity->getPhone(), $entity->getQueryType()->getName(), $entity->getActivity(), $entity->getRegion()->getEtiqueta(), $entity->getCommune()->getEtiqueta(), $entity->getMessage(), 'Chilcorrofin');
}
return $this->json($result, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
/**
* @Route("/data/footer.json", name="data_footer")
*/
public function footerAction(ConfigurationRepository $configurationRepository): Response
{
/** @var Configuration $entity */
$entities = $configurationRepository->findOneBy([]);
$data[] = [
"id" => $entities->getId(),
"address" => $entities->getAddress(),
"linkAdrres" => $entities->getAddresslink(),
"phome" => $entities->getPhone(),
"techContact" => $entities->getTechContact(),
"mobile" => $entities->getMobile(),
"whatsapp" => $entities->getWhatsapp(),
];
return $this->json($data, 200, [], ['json_encode_options' => JSON_UNESCAPED_SLASHES]);
}
public function sendMailInfoAPi($name, $email, $phone, $type, $activity, $region, $commune, $message, $site)
{
$data_ex = [
'name' => $name,
'email' => $email,
'phone' => $phone,
'type' => $type,
'activity' => $activity,
'region' => $region,
'commune' => $commune,
'message' => $message,
'site' => $site
];
$data_ex = json_encode($data_ex);
$data_ex = base64_encode($data_ex);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.codelpa.cl/api/");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
"token=3654bc5e9ddw32f83cee5c37403e7477&data=$data_ex");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);
}
}