src/Controller/FeatureController.php line 103

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Feature;
  4. use App\Entity\FeatureLang;
  5. use App\Entity\FeatureValue;
  6. use App\Entity\Product;
  7. use App\Entity\PSA;
  8. use App\Repository\FeatureLangRepository;
  9. use App\Repository\FeatureRepository;
  10. use App\Repository\FeatureValueLangRepository;
  11. use App\Repository\FeatureValueRepository;
  12. use App\Repository\LangRepository;
  13. use App\Repository\PSARepository;
  14. use App\Repository\SiteRepository;
  15. use App\Services\WebserviceUtils;
  16. use App\Services\XMLConverter;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Security\Core\Security;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. use PrestaShopWebservice;
  24. use PrestaShopWebserviceException;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  26. use SimpleXMLElement;
  27. use Symfony\Component\HttpFoundation\Request;
  28. #[Route('/feature'name'app_feature')]
  29. #[IsGranted('ROLE_CONTENT_MANAGER')]
  30. class FeatureController extends AbstractController
  31. {
  32.     public function __construct(Security $securityTranslatorInterface $translator)
  33.     {
  34.         $this->twigData = [];
  35.         $this->translator $translator;
  36.         $this->security $security;
  37.         $this->twigData = [
  38.             'user' => $security->getUser(),
  39.         ];
  40.     }
  41.     #[Route('/'name'_index')]
  42.     public function index(FeatureRepository $featureRepositoryLangRepository $langRepository): Response
  43.     {
  44.         $this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
  45.         $this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
  46.         $this->breadcrumb[0]['last'] = false;
  47.         $this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
  48.         $this->breadcrumb[1]['last'] = true;
  49.         $this->twigData['breadcrumb'] = $this->breadcrumb;
  50.         $langs $langRepository->findAll();
  51.         $this->twigData['langs'] = $langs;
  52.         $this->twigData['features'] = $featureRepository->findAll();
  53.         return $this->render('feature/index.html.twig'$this->twigData);
  54.     }
  55.     #[Route('/new'name'_new'methods: ['GET''POST'])]
  56.     public function new(LangRepository $langRepositoryFeatureRepository $featureRepositoryFeatureLangRepository $featureLangRepositoryRequest $requestEntityManagerInterface $entityManagerPSARepository $PSARepository): Response
  57.     {
  58.         $this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
  59.         $this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
  60.         $this->breadcrumb[0]['last'] = false;
  61.         $this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
  62.         $this->breadcrumb[1]['link'] = $this->generateUrl('app_feature_index');
  63.         $this->breadcrumb[1]['last'] = false;
  64.         $this->breadcrumb[2]['name'] = $this->translator->trans('page.feature.new');
  65.         $this->breadcrumb[2]['last'] = true;
  66.         $this->twigData['breadcrumb'] = $this->breadcrumb;
  67.         $langs $langRepository->findAll();
  68.         $this->twigData['langs'] = $langs;
  69.         $submit $request->get("submit");
  70.         if ($submit == 1) {
  71.             $position $featureRepository->getLastPosition();
  72.             $position += 1;
  73.             $feature = new Feature();
  74.             $feature->setPosition($position);
  75.             $featureRepository->add($feature);
  76.             $featureFormData $request->get("feature");
  77.             
  78.             $featureName $featureFormData['name'];
  79.             foreach ($featureName as $lang_id => $item) {
  80.                 $featureLang = new FeatureLang();
  81.                 $lang $langRepository->find($lang_id);
  82.                 $featureLang->setLang($lang);
  83.                 $featureLang->setFeature($feature);
  84.                 $featureLang->setName($item);
  85.                 $featureLangRepository->add($featureLang);
  86.             }
  87.             $entityManager->flush();
  88.             
  89.             
  90.             return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
  91.         }
  92.         return $this->render('feature/new.html.twig'$this->twigData);
  93.     }
  94.     #[Route('/{id}/edit'name'_edit'methods: ['GET''POST'])]
  95.     public function edit(Feature $featureLangRepository $langRepositoryFeatureRepository $featureRepositoryFeatureLangRepository $featureLangRepositoryRequest $requestEntityManagerInterface $entityManager): Response
  96.     {
  97.         $this->breadcrumb[0]['name'] = $this->translator->trans('page.catalog.Catalog');
  98.         $this->breadcrumb[0]['link'] = $this->generateUrl('app_catalog_index');
  99.         $this->breadcrumb[0]['last'] = false;
  100.         $this->breadcrumb[1]['name'] = $this->translator->trans('page.feature.Features');
  101.         $this->breadcrumb[1]['link'] = $this->generateUrl('app_feature_index');
  102.         $this->breadcrumb[1]['last'] = false;
  103.         $this->breadcrumb[2]['name'] = $this->translator->trans('page.feature.edit');
  104.         $this->breadcrumb[2]['last'] = true;
  105.         $this->twigData['breadcrumb'] = $this->breadcrumb;
  106.         $langs $langRepository->findAll();
  107.         $this->twigData['langs'] = $langs;
  108.         $featureLangs $featureLangRepository->findBy(['feature' => $feature->getId()]);
  109.         $this->twigData['featureLangs'] = $featureLangs;
  110.         $submit $request->get("submit");
  111.         if ($submit == 1) {
  112.             $featureFormData $request->request->all('feature');
  113.             $featureName $featureFormData['name'];
  114.             foreach ($featureName as $lang_id => $item) {
  115.                 $featureLang $featureLangRepository->findOneBy(['lang'=>$lang_id'feature'=>$feature->getId()]);
  116.                 if($featureLang == null){
  117.                     $featureLang = new FeatureLang();
  118.                     $lang $langRepository->find($lang_id);
  119.                     $featureLang->setLang($lang);
  120.                     $featureLang->setFeature($feature);
  121.                 }
  122.                 $featureLang->setName($item);
  123.                 $featureLangRepository->add($featureLang);
  124.             }
  125.             $entityManager->flush();
  126.             return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
  127.         }
  128.         return $this->render('feature/edit.html.twig'$this->twigData);
  129.     }
  130.     #[Route('/{id}'name'_delete'methods: ['POST'], requirements: ['id' => '\d+'])]
  131.     public function delete(Feature $featureLangRepository $langRepositoryFeatureRepository $featureRepositoryFeatureValueRepository $featureValueRepositoryFeatureValueLangRepository $featureValueLangRepositoryFeatureLangRepository $featureLangRepositoryRequest $requestEntityManagerInterface $entityManager): Response
  132.     {
  133.         if ($this->isCsrfTokenValid('delete'.$feature->getId(), $request->request->get('_token'))) {
  134.             $featureLang $featureLangRepository->findBy(['feature' => $feature]);
  135.             foreach ($featureLang as $key => $item) {
  136.                 $featureLangRepository->remove($item);
  137.             }
  138.             foreach($feature->getFeatureValues() as $keyFeatureValues => $featureValue) {
  139.                 foreach($featureValue->getProducts() as $keyFeatureProduct => $featureProduct) {
  140.                     $featureValue->removeProduct($featureProduct);
  141.                 }
  142.                 $featureValueLang $featureValueLangRepository->findBy(['featureValue' => $featureValue->getId()]);
  143.                 foreach ($featureValueLang as $key => $valueLang) {
  144.                     $featureValueLangRepository->remove($valueLang);
  145.                 }
  146.                 $featureValueRepository->remove($featureValuetrue);
  147.             }
  148.             $featureRepository->remove($featuretrue);
  149.         }
  150.         return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
  151.     }
  152.     #[Route('/{id}/sync'name'_sync'methods: ['GET'])]
  153.     public function sync(Feature $featureFeatureRepository $featureRepositoryFeatureLangRepository $featureLangRepositoryLangRepository $langRepositoryRequest $requestPSARepository $PSARepositorySiteRepository $siteRepository): Response
  154.     {
  155.         $debug false;
  156.         $sites $siteRepository->findAll();
  157.         foreach ($sites as $key => $site) {
  158.             $url $site->getUrl();
  159.             $key $site->getApiKey();
  160.             $webService = new PrestaShopWebservice($url$key$debug);
  161.             $webServiceUtils = new WebserviceUtils($webService$url);
  162.             $langs $webServiceUtils->getSiteLangs();
  163.             $psaFeature $PSARepository->findOneBy(['entityId'=> $feature->getId(), "entityName"=>'feature'"siteId"=>$site->getId()]);
  164.             if($psaFeature != null){
  165.                 try {
  166.                     $xmlResponse $webService->get(['resource' => 'product_features''id'=>$psaFeature->getInSiteId()]);
  167.                     $productFeatureXML $xmlResponse->product_feature[0];
  168.                     $productFeatureXML->position $feature->getPosition() - 1;
  169.                     foreach ($langs as $keyLang => $lang) {
  170.                         if ($lang['icu'] == "en") {
  171.                             $lang['icu'] = "gb";
  172.                         }
  173.                         $langPimdam $langRepository->findOneBy(['ICU'=>$lang['icu']]);
  174.                         $featureLangs $featureLangRepository->findOneBy(['lang'=> $langPimdam'feature'=>$feature->getId()]);
  175.                         $productFeatureXML->name->language[$keyLang] = $featureLangs->getName();
  176.                     }
  177.                     $opt = ['resource' => 'product_features'];
  178.                     $opt['putXml'] = $xmlResponse->asXML();
  179.                     $opt['id'] = (int) $productFeatureXML->id;
  180.                     $return $webService->edit($opt);
  181.                 } catch (\Throwable $th) { 
  182.                     $PSARepository->Remove($psaFeaturetrue);
  183.                     return $this->redirectToRoute('app_feature_sync', ['id'=>$feature->getId()], Response::HTTP_SEE_OTHER);
  184.                 }
  185.             }else{
  186.                 $xmlResponse $webService->get(['url' => $url '/api/product_features?schema=blank']);
  187.                 $productFeatureXML $xmlResponse->product_feature[0];
  188.                 
  189.                 $productFeatureXML->position $feature->getPosition() - 1;
  190.                 foreach ($langs as $keyLang => $lang) {
  191.                     if ($lang['icu'] == "en") {
  192.                         $lang['icu'] = "gb";
  193.                     }
  194.                     $langPimdam $langRepository->findOneBy(['ICU'=>$lang['icu']]);
  195.                     $featureLangs $featureLangRepository->findOneBy(['lang'=> $langPimdam'feature'=>$feature->getId()]);
  196.                     $productFeatureXML->name->language[$keyLang] = $featureLangs->getName();
  197.                 }
  198.                 $opt = ['resource' => 'product_features'];
  199.                 $opt['postXml'] = $xmlResponse->asXML();
  200.                 $return $webService->add($opt);
  201.                 $returnedId =  intval($return->product_feature[0]->id);
  202.                 $psaFeature = new PSA();
  203.                 $psaFeature->setEntityId($feature->getId());
  204.                 $psaFeature->setEntityName('feature');
  205.                 $psaFeature->setInSiteId($returnedId);
  206.                 $psaFeature->setSiteId($site->getId());
  207.                 $PSARepository->add($psaFeaturetrue);
  208.             }
  209.         }
  210.         return $this->redirectToRoute('app_feature_index', [], Response::HTTP_SEE_OTHER);
  211.     }
  212.     /* AJAX */
  213.     #[Route('/{id}/get-value'name'_value'methods: ['GET''POST'])]
  214.     public function value(Feature $featureLangRepository $langRepositoryFeatureRepository $featureRepositoryFeatureLangRepository $featureLangRepositoryRequest $requestEntityManagerInterface $entityManagerFeatureValueRepository $featureValueRepositoryFeatureValueLangRepository $featureValueLangRepository): Response
  215.     {
  216.         $user $this->security->getUser();
  217.         $userInterfaceLang $user->getInterfaceLang();
  218.         $featureValues $featureValueRepository->findBy(['feature' => $feature]);
  219.         $this->twigData['featureValues'] = $featureValues;
  220.         $this->twigData['userInterfaceLang'] = $userInterfaceLang;
  221.         $html $this->renderForm("product/feature/_featureValueOption.html.twig",$this->twigData);
  222.         return $this->json(['code'=>200"html" => $html->getContent()]);
  223.     }
  224. }