<?php
namespace App\Controller;
use App\Entity\Feature;
use App\Entity\FeatureLang;
use App\Entity\FeatureValue;
use App\Entity\Product;
use App\Entity\PSA;
use App\Repository\FeatureLangRepository;
use App\Repository\FeatureRepository;
use App\Repository\FeatureValueLangRepository;
use App\Repository\FeatureValueRepository;
use App\Repository\LangRepository;
use App\Repository\PSARepository;
use App\Repository\SiteRepository;
use App\Services\WebserviceUtils;
use App\Services\XMLConverter;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use PrestaShopWebservice;
use PrestaShopWebserviceException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use SimpleXMLElement;
use Symfony\Component\HttpFoundation\Request;
#[Route('/feature', name: 'app_feature')]
#[IsGranted('ROLE_CONTENT_MANAGER')]
class FeatureController extends AbstractController
{
public function __construct(Security $security, TranslatorInterface $translator)
{
$this->twigData = [];
$this->translator = $translator;
$this->security = $security;
$this->twigData = [
'user' => $security->getUser(),
];
}
#[Route('/', name: '_index')]
public function index(FeatureRepository $featureRepository, LangRepository $langRepository): Response
{
$this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
$this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
$this->breadcrumb[0]['last'] = false;
$this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
$this->breadcrumb[1]['last'] = true;
$this->twigData['breadcrumb'] = $this->breadcrumb;
$langs = $langRepository->findAll();
$this->twigData['langs'] = $langs;
$this->twigData['features'] = $featureRepository->findAll();
return $this->render('feature/index.html.twig', $this->twigData);
}
#[Route('/new', name: '_new', methods: ['GET', 'POST'])]
public function new(LangRepository $langRepository, FeatureRepository $featureRepository, FeatureLangRepository $featureLangRepository, Request $request, EntityManagerInterface $entityManager, PSARepository $PSARepository): Response
{
$this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
$this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
$this->breadcrumb[0]['last'] = false;
$this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
$this->breadcrumb[1]['link'] = $this->generateUrl('app_feature_index');
$this->breadcrumb[1]['last'] = false;
$this->breadcrumb[2]['name'] = $this->translator->trans('page.feature.new');
$this->breadcrumb[2]['last'] = true;
$this->twigData['breadcrumb'] = $this->breadcrumb;
$langs = $langRepository->findAll();
$this->twigData['langs'] = $langs;
$submit = $request->get("submit");
if ($submit == 1) {
$position = $featureRepository->getLastPosition();
$position += 1;
$feature = new Feature();
$feature->setPosition($position);
$featureRepository->add($feature);
$featureFormData = $request->get("feature");
$featureName = $featureFormData['name'];
foreach ($featureName as $lang_id => $item) {
$featureLang = new FeatureLang();
$lang = $langRepository->find($lang_id);
$featureLang->setLang($lang);
$featureLang->setFeature($feature);
$featureLang->setName($item);
$featureLangRepository->add($featureLang);
}
$entityManager->flush();
return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('feature/new.html.twig', $this->twigData);
}
#[Route('/{id}/edit', name: '_edit', methods: ['GET', 'POST'])]
public function edit(Feature $feature, LangRepository $langRepository, FeatureRepository $featureRepository, FeatureLangRepository $featureLangRepository, Request $request, EntityManagerInterface $entityManager): Response
{
$this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
$this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
$this->breadcrumb[0]['last'] = false;
$this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
$this->breadcrumb[1]['link'] = $this->generateUrl('app_feature_index');
$this->breadcrumb[1]['last'] = false;
$this->breadcrumb[2]['name'] = $this->translator->trans('page.feature.edit');
$this->breadcrumb[2]['last'] = true;
$this->twigData['breadcrumb'] = $this->breadcrumb;
$langs = $langRepository->findAll();
$this->twigData['langs'] = $langs;
$featureLangs = $featureLangRepository->findBy(['feature' => $feature->getId()]);
$this->twigData['featureLangs'] = $featureLangs;
$submit = $request->get("submit");
if ($submit == 1) {
$featureFormData = $request->request->all('feature');
$featureName = $featureFormData['name'];
foreach ($featureName as $lang_id => $item) {
$featureLang = $featureLangRepository->findOneBy(['lang'=>$lang_id, 'feature'=>$feature->getId()]);
if($featureLang == null){
$featureLang = new FeatureLang();
$lang = $langRepository->find($lang_id);
$featureLang->setLang($lang);
$featureLang->setFeature($feature);
}
$featureLang->setName($item);
$featureLangRepository->add($featureLang);
}
$entityManager->flush();
return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('feature/edit.html.twig', $this->twigData);
}
#[Route('/{id}', name: '_delete', methods: ['POST'], requirements: ['id' => '\d+'])]
public function delete(Feature $feature, LangRepository $langRepository, FeatureRepository $featureRepository, FeatureValueRepository $featureValueRepository, FeatureValueLangRepository $featureValueLangRepository, FeatureLangRepository $featureLangRepository, Request $request, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$feature->getId(), $request->request->get('_token'))) {
$featureLang = $featureLangRepository->findBy(['feature' => $feature]);
foreach ($featureLang as $key => $item) {
$featureLangRepository->remove($item);
}
foreach($feature->getFeatureValues() as $keyFeatureValues => $featureValue) {
foreach($featureValue->getProducts() as $keyFeatureProduct => $featureProduct) {
$featureValue->removeProduct($featureProduct);
}
$featureValueLang = $featureValueLangRepository->findBy(['featureValue' => $featureValue->getId()]);
foreach ($featureValueLang as $key => $valueLang) {
$featureValueLangRepository->remove($valueLang);
}
$featureValueRepository->remove($featureValue, true);
}
$featureRepository->remove($feature, true);
}
return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/{id}/sync', name: '_sync', methods: ['GET'])]
public function sync(Feature $feature, FeatureRepository $featureRepository, FeatureLangRepository $featureLangRepository, LangRepository $langRepository, Request $request, PSARepository $PSARepository, SiteRepository $siteRepository): Response
{
$debug = false;
$sites = $siteRepository->findAll();
foreach ($sites as $key => $site) {
$url = $site->getUrl();
$key = $site->getApiKey();
$webService = new PrestaShopWebservice($url, $key, $debug);
$webServiceUtils = new WebserviceUtils($webService, $url);
$langs = $webServiceUtils->getSiteLangs();
$psaFeature = $PSARepository->findOneBy(['entityId'=> $feature->getId(), "entityName"=>'feature', "siteId"=>$site->getId()]);
if($psaFeature != null){
try {
$xmlResponse = $webService->get(['resource' => 'product_features', 'id'=>$psaFeature->getInSiteId()]);
$productFeatureXML = $xmlResponse->product_feature[0];
$productFeatureXML->position = $feature->getPosition() - 1;
foreach ($langs as $keyLang => $lang) {
if ($lang['icu'] == "en") {
$lang['icu'] = "gb";
}
$langPimdam = $langRepository->findOneBy(['ICU'=>$lang['icu']]);
$featureLangs = $featureLangRepository->findOneBy(['lang'=> $langPimdam, 'feature'=>$feature->getId()]);
$productFeatureXML->name->language[$keyLang] = $featureLangs->getName();
}
$opt = ['resource' => 'product_features'];
$opt['putXml'] = $xmlResponse->asXML();
$opt['id'] = (int) $productFeatureXML->id;
$return = $webService->edit($opt);
} catch (\Throwable $th) {
$PSARepository->Remove($psaFeature, true);
return $this->redirectToRoute('app_feature_sync', ['id'=>$feature->getId()], Response::HTTP_SEE_OTHER);
}
}else{
$xmlResponse = $webService->get(['url' => $url . '/api/product_features?schema=blank']);
$productFeatureXML = $xmlResponse->product_feature[0];
$productFeatureXML->position = $feature->getPosition() - 1;
foreach ($langs as $keyLang => $lang) {
if ($lang['icu'] == "en") {
$lang['icu'] = "gb";
}
$langPimdam = $langRepository->findOneBy(['ICU'=>$lang['icu']]);
$featureLangs = $featureLangRepository->findOneBy(['lang'=> $langPimdam, 'feature'=>$feature->getId()]);
$productFeatureXML->name->language[$keyLang] = $featureLangs->getName();
}
$opt = ['resource' => 'product_features'];
$opt['postXml'] = $xmlResponse->asXML();
$return = $webService->add($opt);
$returnedId = intval($return->product_feature[0]->id);
$psaFeature = new PSA();
$psaFeature->setEntityId($feature->getId());
$psaFeature->setEntityName('feature');
$psaFeature->setInSiteId($returnedId);
$psaFeature->setSiteId($site->getId());
$PSARepository->add($psaFeature, true);
}
}
return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
}
/* AJAX */
#[Route('/{id}/get-value', name: '_value', methods: ['GET', 'POST'])]
public function value(Feature $feature, LangRepository $langRepository, FeatureRepository $featureRepository, FeatureLangRepository $featureLangRepository, Request $request, EntityManagerInterface $entityManager, FeatureValueRepository $featureValueRepository, FeatureValueLangRepository $featureValueLangRepository): Response
{
$user = $this->security->getUser();
$userInterfaceLang = $user->getInterfaceLang();
$featureValues = $featureValueRepository->findBy(['feature' => $feature]);
$this->twigData['featureValues'] = $featureValues;
$this->twigData['userInterfaceLang'] = $userInterfaceLang;
$html = $this->renderForm("product/feature/_featureValueOption.html.twig",$this->twigData);
return $this->json(['code'=>200, "html" => $html->getContent()]);
}
}