<?php
namespace App\Service\Manager\Blocs;
use Twig\Environment;
use App\Entity\Blocs\Bloc;
use App\Entity\Pages\Page;
use App\Entity\Medias\Media;
use App\Form\Blocs\BlocType;
use App\Entity\Blocs\BlocLang;
use App\Entity\Medias\MediaLang;
use App\Service\LanguagesManager;
use App\Entity\Blocs\BlocSolution;
use App\Service\Manager\AdminManager;
use App\Repository\Blocs\BlocRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use App\Repository\Medias\MediaRepository;
use App\Entity\ItemsSolution\ItemsSolution;
use App\Service\Manager\Media\MediaManager;
use App\Repository\Blocs\BlocLangRepository;
use App\Repository\Labels\LabelBlocRepository;
use App\Repository\Medias\MediaLangRepository;
use Symfony\Component\Routing\RouterInterface;
use App\Repository\Benefice\BeneficeRepository;
use App\Repository\Blocs\BlocSolutionRepository;
use Symfony\Component\Form\FormFactoryInterface;
use App\Repository\Carrousel\carrouselRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Service\Manager\Media\MediaUploaderManager;
use App\Service\Manager\Pages\PaletteColorsManager;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class BlocManager {
private $request;
private $carrouselRepository;
private $blocRepository;
private $labelBlocRepository;
private $blocSolutionRepository;
private $beneficeRepository;
public function __construct(
private LanguagesManager $languagesManager,
private BlocRepository $repo,
private BlocLangRepository $repoLang,
private EntityManagerInterface $em,
private FormFactoryInterface $form,
private RequestStack $requestStack,
private AdminManager $adminManager,
private RouterInterface $router,
private MediaManager $mediaManager,
private PaletteColorsManager $paletteColorsManager,
private MediaUploaderManager $mediaUploaderManager,
private Environment $twig,
carrouselRepository $carrouselRepository,
BlocRepository $blocRepository,
LabelBlocRepository $labelBlocRepository,
BlocSolutionRepository $blocSolutionRepository,
BeneficeRepository $beneficeRepository,
private ParameterBagInterface $params,
private MediaRepository $mediaRepository,
private ManagerRegistry $doctrine
){
$this->request = $requestStack->getCurrentRequest();
$this->carrouselRepository = $carrouselRepository;
$this->blocRepository = $blocRepository;
$this->labelBlocRepository = $labelBlocRepository;
$this->blocSolutionRepository = $blocSolutionRepository;
$this->beneficeRepository = $beneficeRepository;
}
public function getForm($bloc, $origin, $idOrigin, $type){
$language = $this->languagesManager->getCurrentLanguage();
$actifLanguages = $this->languagesManager->getAllActifLanguages();
$idBloc = $bloc->getId();
$valueIdType = null;
if($idBloc){
if($type == Bloc::TYPE_CARROUSEL){
$valueIdType = $this->carrouselRepository->find($bloc->getIdType());
}
else if ($type == Bloc::TYPE_LABEL_BLOC){
$valueIdType = $this->labelBlocRepository->find($bloc->getIdType());
}
else if ($type == Bloc::TYPE_BENEFICE_BLOC || $type == Bloc::TYPE_IMAGE_CARD_BLOC){
$valueIdType = $this->beneficeRepository->find($bloc->getIdType());
}
}
$formType = BlocType::class;
$filesForm = $files = [];
if($type == Bloc::TYPE_SLIDER || $type == Bloc::TYPE_IMAGE_TEXTE || $type == Bloc::TYPE_IMAGE || $type == Bloc::TYPE_IMAGE_CARD_BLOC ) {
$filesForm = ['file' => ['type' => null]];
$files = [
'file' => [
'required' => false,
'label' => 'Fichier',
'accept_file_type' => null,
'constraints_file' => null,
]
];
}
else if($type == Bloc::TYPE_VIDEO ) {
$filesForm = [
'video' => ['type' => Media::TYPE_MEDIA_VIDEO],
'bgVideo' => ['type' => Media::TYPE_MEDIA_BG_VIDEO]
];
$files = [
'video' => [
'required' => false,
'label' => 'video',
'accept_file_type' => 'video/mp4',
'constraints_file' => 'video'
],
'bgVideo' => [
'required' => false,
'label' => 'Background vidéo',
'accept_file_type' => 'image/png, image/svg+xml, image/jpeg, image/jpg',
'constraints_file' => 'image'
]
];
}
$form = $this->form->create($formType, $bloc, [
'type' => $type,
'valueIdType' => $valueIdType,
'language' => $language,
'id_home_page' => intval($this->params->get('id_home_page')),
'actifLanguages' => $actifLanguages,
'files' => $files
]
);
//$form->get('blocLangs')->setData($blocLang);
$form->handleRequest($this->request);
if ($this->request->isMethod('POST') ) {
/*$bloc->setOrigin($origin);
$bloc->setIdOrigin($idOrigin);*/
$bloc->setType($type);
if($form->has('positionImage') ) $bloc->setPositionImage($form->get('positionImage')->getData());
if($form->has('positionVideo') ) $bloc->setPositionVideo($form->get('positionVideo')->getData());
if($form->has('colImage') ) $bloc->setColImage($form->get('colImage')->getData());
if($form->has('colTxt') ) $bloc->setColTxt($form->get('colTxt')->getData());
if($form->has('carrousel')) $bloc->setIdType($form->get('carrousel')->getData()->getId());
if($form->has('label_bloc')) $bloc->setIdType($form->get('label_bloc')->getData()->getId());
if($form->has('benefice')) $bloc->setIdType($form->get('benefice')->getData()->getId());
if($form->has('item_solution')) $this->saveBlocSolution($form, $bloc);
if(!$bloc->getPosition()) {
$position = $this->repo->generateMaxPosition($origin, $idOrigin);
$bloc->setPosition($position);
}
$this->adminManager->saveEntity($bloc);
// this if($form->has('file')) $this->saveMedia($bloc, $form->get("file"),$mediaLang );
//if($form->has('video') && $form->get('video')->getData()) $this->saveMedia($bloc,$form->get("video"),$mediaLang, Media::TYPE_MEDIA_VIDEO);
// if($form->has('bgVideo') && $form->get('bgVideo')->getData() ) $this->saveMedia($bloc,$form->get("bgVideo"),$mediaLang, Media::TYPE_MEDIA_BG_VIDEO);
if($form->has('bloc')) $this->saveBlocClient($form, $bloc);
$this->paletteColorsManager->saveData(get_class($bloc), $bloc->getId(),$this->request->request->get('color') );
$this->mediaManager->saveIt($actifLanguages, $filesForm , $form, $bloc, $origin);
$blocs = $this->repo->getAllQb($language, ['origin' => ($origin), 'idOrigin' => $idOrigin])->getResult();
$html = $this->twig->render('admin/blocs/list_bloc.html.twig', [
'blocs' => $blocs
]);
return new JsonResponse($html);
}
return [
'form' => $form->createView(),
//'blocLang' => $blocLang,
];
}
public function saveBlocClient($form, $bloc){
$client = $form->get('client_bloc')->getData();
$bloc->setClientBloc($client);
}
public function saveBlocSolution($form, $bloc){
$ItemsSolutionBlocs = $form->get('item_solution')->getData();
$postItemsSolutionBlocs = isset($_POST['bloc']['item_solution']) ? $_POST['bloc']['item_solution'] : [];
$position = 0;
foreach ($postItemsSolutionBlocs as $ItemsSolution) {
$position++;
/** @var BlocSolution ItemsSolutionBloc */
$ItemsSolutionBloc = $this->em->getRepository(BlocSolution::class)->findOneBy(['itemSolution' => $ItemsSolution, 'bloc' => $bloc]);
if ($ItemsSolutionBloc) {
$ItemsSolutionBloc->setPosition($position);
$this->em->flush();
continue;
}
$blocItemsSolution = new BlocSolution();
$blocItemsSolution->setItemSolution($this->em->getReference(ItemsSolution::class, $ItemsSolution));
$blocItemsSolution->setBloc($bloc);
$blocItemsSolution->setPosition($position);
$bloc->addBlocSolution($blocItemsSolution);
$this->em->persist($blocItemsSolution);
}
foreach ($bloc->getBlocSolutions() as $blocSolution) {
$existBT = array_filter($ItemsSolutionBlocs, function ($solutionId) use ($blocSolution) {
return $blocSolution->getItemSolution()->getId() === $solutionId;
} );
if(count($existBT) === 0) {
$bloc->removeBlocSolution($blocSolution);
}
}
}
public function saveMedia($bloc, $fileForm, $idLang, $type = null) {
$media = $this->mediaManager->getMedias($bloc, $type);
if(!$media) $media = $this->mediaUploaderManager->addMedia($fileForm, get_class($bloc) , $bloc->getId(), $type, 0,$idLang);
else {
$mediaVal = "";
if (array_key_exists(0,$media)) $mediaVal = $media[0];
else $mediaVal = $media[''][0];
//edit media 3 params
$media = $this->mediaUploaderManager->editMedia($mediaVal, $fileForm,$idLang);
}
$this->adminManager->saveEntity($media, false);
}
public function sortable($data){
foreach($data as $key => $order) {
$bloc = $this->repo->find($order);
if($bloc){
$bloc->setPosition($key + 1);
$this->em->persist($bloc);
}
}
$this->em->flush();
}
public function getBlocs($item){
$origin =$item::class;
$origin = str_replace('Proxies\__CG__\\', '', $origin);
$language = $this->languagesManager->getCurrentLanguage();
$blocs = $this->blocRepository->dataBlocs($language, [
'idOrigin' => $item->getId(),
'origin'=> $origin,
'language' => $language->getId(), // [0, $language->getId()],
'media_bloc' => true,
'clients_right_left' => true,
]);
$tab_carrousel = $tab_label_bloc = $tab_benefice_bloc = [];
foreach($blocs as $bloc){
$type = $bloc['type'] ;
$idType = $bloc['idType'] ;
if($type == Bloc::TYPE_LABEL_BLOC){
array_push($tab_label_bloc, $idType);
}
else if($type == BLOC::TYPE_CARROUSEL){
array_push($tab_carrousel, $idType);
}
else if($type == BLOC::TYPE_BENEFICE_BLOC || $type == Bloc::TYPE_IMAGE_CARD_BLOC){
array_push($tab_benefice_bloc, $idType);
}
$labels = $this->labelBlocRepository->getAllQb($language, [
'isEnable' => 1,
'details_label' => true,
'ids' => $tab_label_bloc,
'language' => $language->getId()
])->getResult();
}
$carrousels = $this->carrouselRepository->getAllQb($language, [
'enable' => 1,
'details_carrousel' => true,
'ids' => $tab_carrousel
])->getResult();
$benefice = $this->beneficeRepository->getAllQb($language, [
'isEnable' => 1,
'details_benefice' => true,
'ids' => $tab_benefice_bloc,
'language' => $language
])->getResult();
foreach($blocs as $key => $bloc){
$idType = $bloc['idType'];
if($bloc['type'] == Bloc::TYPE_LABEL_BLOC){
$blocs[$key][ Bloc::TYPE_LABEL_BLOC ] = [];
$blocs = $this->getElements($labels, $idType, $blocs, $key, Bloc::TYPE_LABEL_BLOC);
}
if($bloc['type'] == Bloc::TYPE_BENEFICE_BLOC){
$blocs[$key][Bloc::TYPE_BENEFICE_BLOC] = [];
$blocs = $this->getElements($benefice, $idType, $blocs, $key, Bloc::TYPE_BENEFICE_BLOC);
}
if($bloc['type'] == Bloc::TYPE_IMAGE_CARD_BLOC){
$blocs[$key][Bloc::TYPE_IMAGE_CARD_BLOC] = [];
$blocs = $this->getElements($benefice, $idType, $blocs, $key, Bloc::TYPE_IMAGE_CARD_BLOC);
}
// carrousels
if($bloc['type'] == Bloc::TYPE_CARROUSEL){
$blocs[$key][Bloc::TYPE_CARROUSEL] = [];
$blocs = $this->getElements($carrousels, $idType, $blocs, $key, Bloc::TYPE_CARROUSEL);
}
else if($bloc['type'] == Bloc::TYPE_SOLUTION_BLOC){
$solutionBloc = $this->blocSolutionRepository->getAllQb($language, [
'enable' => 1,
'ids' => $bloc['id']
])->getResult();
$blocs[$key][ Bloc::TYPE_SOLUTION_BLOC ] = $solutionBloc ;
}
}
return $blocs;
}
public function getElements($components, $idType, $blocs, $key, $type){
$keys = array_keys(array_column($components, 'id'), $idType);
foreach($keys as $keyId => $keyTab){
if( $type == Bloc::TYPE_LABEL_BLOC){
if($keyId == 0){
$blocs[$key]['info_generic'] = [
'description' => $components[$keyTab]['description'],
'classe' => $components[$keyTab]['classe'],
];
}
}
array_push($blocs[$key][$type], $components[$keyTab]);
}
return $blocs ;
}
public function getBlocsSliderHeader($item){
$origin = $item::class;
$origin = str_replace('Proxies\__CG__\\', '', $origin);
$language = $this->languagesManager->getCurrentLanguage();
$blocs = $this->blocRepository->dataBlocs($language, [
'idOrigin' => $item->getId(),
'origin'=> $origin,
'positionImage' => Media::POSITION_HEADER,
'type' => BLOC::TYPE_CARROUSEL,
'media_bloc' => true,
'clients_right_left' => true,
]);
$tab_carrousel = [];
foreach($blocs as $bloc){
$type = $bloc['type'] ;
$idType = $bloc['idType'] ;
array_push($tab_carrousel, $idType);
$carrousels = $this->carrouselRepository->getAllQb($language, [
'enable' => 1,
'details_carrousel' => true,
'ids' => $tab_carrousel
])->getResult();
foreach($blocs as $key => $bloc){
$idType = $bloc['idType'];
$blocs[$key][Bloc::TYPE_CARROUSEL] = [];
$blocs = $this->getElements($carrousels, $idType, $blocs, $key, Bloc::TYPE_CARROUSEL);
}
}
return $blocs;
}
}