custom/static-plugins/PixupWishlistSW6/src/Controller/PixupWishlistController.php line 346

Open in your IDE?
  1. <?php
  2. namespace Pixup\Wishlist\Controller;
  3. use Pixup\Wishlist\Core\Boot;
  4. use Pixup\Wishlist\Entitys\Model\WishlistModel;
  5. use Pixup\Wishlist\Model\WishlistSessionHandler;
  6. use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingLoader;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  9. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  10. use Shopware\Storefront\Controller\StorefrontController;
  11. use Shopware\Storefront\Page\GenericPageLoaderInterface;
  12. use Shopware\Storefront\Page\Product\Configurator\ProductPageConfiguratorLoader;
  13. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoader;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * @RouteScope(scopes={"storefront"})
  18.  */
  19. class PixupWishlistController extends StorefrontController
  20. {
  21.     /**
  22.      * @var Boot
  23.      */
  24.     private $boot;
  25.     /**
  26.      * @var array
  27.      */
  28.     private $config;
  29.     /**
  30.      * @var ProductListingLoader $productLoader
  31.      */
  32.     private $productLoader;
  33.     /**
  34.      * @var ProductPageConfiguratorLoader
  35.      */
  36.     private $productConfiguratorServiceLoader;
  37.     /**
  38.      * @var \Pixup\Wishlist\Model\WishlistEntityHandler
  39.      */
  40.     private $wishListEntityHandler;
  41.     /**
  42.      * @var WishlistSessionHandler
  43.      */
  44.     private $wishlistSessionHandler;
  45.     /**
  46.      * @var string|null
  47.      */
  48.     private $customerId;
  49.     /**
  50.      * @var string
  51.      */
  52.     private $salesChannelId;
  53.     /**
  54.      * @var PixupWishlistAjaxController
  55.      */
  56.     private $ajaxController;
  57.     /**
  58.      * @var HeaderPageletLoader
  59.      */
  60.     private $headerPageletLoader;
  61.     /** @var GenericPageLoaderInterface */
  62.     private GenericPageLoaderInterface $genericPageLoader;
  63.     public function __construct(
  64.         Boot $boot,
  65.         ProductListingLoader $productLoader,
  66.         ProductPageConfiguratorLoader $productConfiguratorServiceLoader,
  67.         PixupWishlistAjaxController $ajaxController,
  68.         HeaderPageletLoader $headerPageletLoader,
  69.         GenericPageLoaderInterface $genericPageLoader,
  70.         WishlistSessionHandler $wishlistSessionHandler
  71.     )
  72.     {
  73.         $this->boot $boot;
  74.         $this->config $this->boot->getConfig();
  75.         $this->productLoader $productLoader;
  76.         $this->productConfiguratorServiceLoader $productConfiguratorServiceLoader;
  77.         $this->headerPageletLoader $headerPageletLoader;
  78.         $this->genericPageLoader $genericPageLoader;
  79.         $this->wishlistSessionHandler $wishlistSessionHandler;
  80.         $this->wishListEntityHandler $this->boot->getFacade()->getWishlistEntityHandler();
  81.         $this->ajaxController $ajaxController;
  82.     }
  83.     private function prePatch(SalesChannelContext $context){
  84.         $this->customerId $this->wishListEntityHandler->getWishlistCustomerId(
  85.             $context,
  86.             ($context->getCustomer()==null)?null:$context->getCustomer()->getId(),
  87.             $this->wishlistSessionHandler->getSessionId()
  88.         );
  89.         $this->salesChannelId $context->getSalesChannel()->getId();
  90.     }
  91.     /**
  92.      * @Route(
  93.      *     "/pixup/wishlist/ajax/add-product/{productId}/{productQuantity?null}/{wishlistId?null}",
  94.      *     name="frontend.pixup.wishlist.ajax.add_product",
  95.      *     options={"seo"="false"},
  96.      *     methods={"POST", "GET"},
  97.      *     defaults={"_format"="json", "csrf_protected"=true   }
  98.      * )
  99.      *\\description: if wishlistId = -1 a new wishlist will be added
  100.      */
  101.     public function ajax_addProduct(string $productIdstring $productQuantitystring $wishlistIdSalesChannelContext $contextRequest $request)
  102.     {
  103.         return $this->ajaxController->addProduct($productId,$productQuantity,$wishlistId,$context,$request);
  104.     }
  105.     /**
  106.      * @Route(
  107.      *     "/pixup/wishlist/ajax/remove-product/{productId}/{wishlistId?null}",
  108.      *     name="frontend.pixup.wishlist.ajax.remove_product",
  109.      *     options={"seo"="false"},
  110.      *     methods={"POST", "GET"},
  111.      *     defaults={"_format"="json", "csrf_protected"=true }
  112.      * )
  113.      ** description: if wishlistId = -1 a new wishlist will be added
  114.      */
  115.     public function ajax_removeProduct(string $productId,string $wishlistIdSalesChannelContext $contextRequest $request){
  116.         return $this->ajaxController->removeProduct($productId,$wishlistId,$context,$request);
  117.     }
  118.     /**
  119.      * @Route(
  120.      *     "/pixup/wishlist/ajax/get-product-state/{$productId}",
  121.      *     name="frontend.pixup.wishlist.ajax.get_product_state",
  122.      *     options={"seo"="false"},
  123.      *     methods={"GET"},
  124.      *     defaults={"_format"="json", "csrf_protected"=true }
  125.      * )
  126.      */
  127.     public function ajax_getProductState(string $productId,SalesChannelContext $contextRequest $request){
  128.         return $this->ajaxController->getProductState($productId,$context,$request);
  129.     }
  130.     /**
  131.      * @Route(
  132.      *     "/pixup/wishlist/ajax/get-product-variant/{parentId}/{options}/{wishedGroupId}",
  133.      *     name="frontend.pixup.wishlist.ajax.get_product_variant",
  134.      *     methods={"GET"},
  135.      *     defaults={"XmlHttpRequest": true}
  136.      * )
  137.      ** description: takes the parentId and the options array to return the productId of an Variant
  138.      ** options = [groupID1=>optionID1,groupID2=>optionID2]
  139.      */
  140.     public function ajax_WishlistSwitchVariant(
  141.         string $parentId,
  142.         string $options,
  143.         string $wishedGroupId,
  144.         Request $request,
  145.         SalesChannelContext $salesChannelContext
  146.     ){
  147.         return $this->ajaxController->switchVariant($parentId,$options,$wishedGroupId,$request,$salesChannelContext);
  148.     }
  149.     /**
  150.      * @Route(
  151.      *     "pixup/wishlist/ajax/replace-from-wishlist/{oldId}/{newId}/{wishListId}",
  152.      *     name="frontend.pixup.wishlist.ajax.replace_from_wishlist",
  153.      *     options={"seo"="false"},
  154.      *     methods={"POST", "GET"},
  155.      *     defaults={"_format"="html", "csrf_protected"=true }
  156.      * )
  157.      ** replaces the oldProductId with the newProductId ( based on the $wishlistId )
  158.      */
  159.     public function ajax_WishlistReplaceProduct(
  160.         string $oldId,
  161.         string $newId,
  162.         string $wishListId,
  163.         Request $request,
  164.         SalesChannelContext $context
  165.     ){
  166.         return $this->ajaxController->replaceProduct($oldId,$newId,$wishListId,$request,$context);
  167.     }
  168.     /**
  169.      * @Route(
  170.      *     "/pixup/wishlist/ajax/get-wishlist/{productId?null}/{wishlistId?null}/{returnView?null}/{returnProducts?false}",
  171.      *     name="frontend.pixup.wishlist.ajax.get_wishlists",
  172.      *     options={"seo"="false"},
  173.      *     methods={"GET"},
  174.      *     defaults={"_format"="json", "csrf_protected"=true }
  175.      * )
  176.      ** description returns all wishlists which includes the givin productId/wishlistId ( if productId/wishlist is not set it will return any )
  177.      ** param string $productId // null or a product ID
  178.      ** param string $wishlistId // null or wishlist ID
  179.      *  param returnView // null or bool -- will return a view from the product-collection ( all products from a wishlist )
  180.      ** param SalesChannelContext $context
  181.      ** param Request $request
  182.      */
  183.     public function ajax_getWishlist(string $productId,string $wishlistId,string $returnView,string $returnProductsSalesChannelContext $contextRequest $request){
  184.         $productId = ($productId==='null')?"":$productId;
  185.         $wishlistId = ($wishlistId==='null')?"":$wishlistId;
  186.         $returnView = ($returnView=='null' || $returnView=='false')?false:true;
  187.         $returnProducts = ($returnProducts == "true")?true:false;
  188.         if($returnView){
  189.             $wishlists $this->getWishlists($context,$productId,$wishlistId);
  190.             $wishlistsPayload $this->ajaxController->addAdvancedProductInformationToWishlist($wishlists,$context,true);
  191.             return $this->ajaxController->createAjaxResponse([
  192.                 'wishlists'=>$wishlists,
  193.                 'view'=>$this->renderStorefront('@Storefront/wishlist/box/product-collection-view.html.twig',[
  194.                     'wishlists'=>$wishlistsPayload
  195.                 ])->getContent(),
  196.             ]);
  197.         }
  198.         return $this->ajaxController->createAjaxResponse([
  199.             'wishlists'=>$this->getWishlists($context,$productId,$wishlistId,$returnProducts)
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route(
  204.      *     "/pixup/wishlist/ajax/fuer-spaeter-gemerkt",
  205.      *     name="frontend.pixup.wishlist.ajax.fuer-spaeter-gemerkt",
  206.      *     options={"seo"="false"},
  207.      *     methods={"POST"},
  208.      *     defaults={"_format"="json"}
  209.      * )
  210.      *
  211.      * @param SalesChannelContext $context
  212.      * @param Request $request
  213.      */
  214.     public function ajax_createFuerSpaeterGemerkt(SalesChannelContext $contextRequest $request)
  215.     {
  216.         return $this->ajaxController->createFuerSpaeterGemerktWishlist($context$request);
  217.     }
  218.     /**
  219.      * @Route(
  220.      *     "/pixup/wishlist/ajax/get-last-wishlist/{wishlistCustomerId?null}",
  221.      *     name="frontend.pixup.wishlist.ajax.get-last-wishlist",
  222.      *     options={"seo"="false"},
  223.      *     methods={"GET"},
  224.      *     defaults={"_format"="json"}
  225.      * )
  226.      *
  227.      * @param SalesChannelContext $context
  228.      * @param Request $request
  229.      * @return mixed
  230.      */
  231.     public function ajax_getLastWishlistUsed(string $wishlistCustomerIdSalesChannelContext $contextRequest $request)
  232.     {
  233.         return $this->ajaxController->getLastWishlistUsed($wishlistCustomerId$context$request);
  234.     }
  235.     /**
  236.      * @Route(
  237.      *     "/pixup/wishlist/ajax/create-wishlist/{name}/{products?null}/{productQuantities?null}/{private?string}/{editable?string}/{birthday?string}/{password?null}/{wishListId?null}",
  238.      *     name="frontend.pixup.wishlist.ajax.create_wishlist",
  239.      *     options={"seo"="false"},
  240.      *     methods={"POST", "GET"},
  241.      *     defaults={"_format"="json", "csrf_protected"=true }
  242.      * )
  243.      */
  244.     public function ajax_createWishlist(string $name,string $products,string $productQuantities,string $private,
  245.                                         string $editable,string $birthday,string $password,string $wishListId,
  246.                                         SalesChannelContext $context,Request $request
  247.     ){
  248.         return $this->ajaxController->createWishlist($name,$products,$productQuantities$private,$editable,$birthday,$password,$wishListId,$context,$request);
  249.     }
  250.     /**
  251.      * @Route(
  252.      *     "/pixup/wishlist/ajax/edit-wishlist/{name}/{wishListId}/{private?string}/{editable?string}/{birthday?string}/{password?null}",
  253.      *     name="frontend.pixup.wishlist.ajax.edit_wishlist",
  254.      *     options={"seo"="false"},
  255.      *     methods={"POST", "GET"},
  256.      *     defaults={"_format"="json", "csrf_protected"=true }
  257.      * )
  258.      */
  259.     public function ajax_editWishlist(string $name,string $wishListId,string $private,
  260.                                       string $editable,string $birthday,string $password,
  261.                                       SalesChannelContext $context,Request $request){
  262.         return $this->ajaxController->editWIshlist($name,$wishListId,$context$private,$editable,$birthday,$password,$request);
  263.     }
  264.     /**
  265.      * @Route(
  266.      *     "/pixup/wishlist/ajax/delete-wishlist/{wishlistId}",
  267.      *     name="frontend.pixup.wishlist.ajax.delete_wishlist",
  268.      *     options={"seo"="false"},
  269.      *     methods={"POST", "GET"},
  270.      *     defaults={"_format"="json", "csrf_protected"=true }
  271.      * )
  272.      */
  273.     public function ajax_removeWishlist(string $wishlistIdSalesChannelContext $context,Request $request){
  274.         return $this->ajaxController->removeWishlist($wishlistId,$context,$request);
  275.     }
  276.     /**
  277.      **param string $productId
  278.      **param SalesChannelContext $context
  279.      **description returns all wishlists which includes the givin productId ( if productId is not set it will return any )
  280.      * Based on the SalesChannelId and customerID (SalesChannelContext)
  281.      **return array
  282.      */
  283.     private function getWishlists(SalesChannelContext $context,string $productId "",string $wishlistId="",bool $returnProducts false) :array{
  284.         $this->prePatch($context);
  285.         if($this->customerId == null)
  286.             return [];
  287.         $this->ajaxController->customerId $this->customerId;
  288.         $formatedWishlistResponse =  $this->ajaxController->formatWishlistResponseArray(
  289.             $this->wishListEntityHandler->getWishlists(
  290.                 $this->salesChannelId,
  291.                 $this->customerId,
  292.                 $context,
  293.                 (!empty($productId))?$productId:'',
  294.                 '',
  295.                 $wishlistId,
  296.                 true), $context
  297.         );
  298.         if($returnProducts) {
  299.             $formatedWishlistResponse $this->ajaxController->addInfoToProduct($formatedWishlistResponse$context,true);
  300.         }
  301.         return $formatedWishlistResponse;
  302.     }
  303.     /**
  304.      * @Route(
  305.      *     "/pixup/wishlist/{wishlistId?null}/{password?null}",
  306.      *     name="frontend.pixup.wishlist.overview",
  307.      *     options={"seo"="false"},
  308.      *     methods={"GET"},
  309.      *     defaults={"_format"="html", "csrf_protected"=true }
  310.      * )
  311.      */
  312.     public function WishlistOverview(string $wishlistId,string $password,SalesChannelContext $context,Request $request){
  313.         $wishlistId = ($wishlistId=='null')?null:$wishlistId;
  314.         $this->prePatch($context);
  315.         $message "";
  316.         $password = ($password=='null')?null:$password;
  317.         $subscribedToWishlist false;
  318.         //check if passed wishlistId is own wishlistId
  319.         $wishlistId = ($wishlistId=='null')?null:$wishlistId;
  320.         if($wishlistId !== null) {
  321.             if($this->customerId == null){
  322.                 $res $this->subscribeToWishlist($wishlistId,$context,$password);
  323.             }else {
  324.                 $ownWishList $this->wishListEntityHandler->checkForOwnWishlist($context$wishlistId$this->customerId,true);
  325.                 if(!$ownWishList)
  326.                     $res $this->subscribeToWishlist($wishlistId,$context,$password);
  327.             }
  328.             if(isset($res))
  329.                 $message $res['message'];
  330.             else
  331.                 $res = [];
  332.             if(isset($res['success']) && $res['success'] == true) {
  333.                 $subscribedToWishlist true;
  334.             }
  335.         }
  336.         $wishlists $this->getWishlists($context,'');
  337.         $isLoggedIn = ($context->getCustomer()==null)?false:true;
  338.         $wishlists $this->ajaxController->addAdvancedProductInformationToWishlist($wishlists,$context,true);
  339.         if($wishlistId !== null) {
  340.             $publicWishlists $this->wishListEntityHandler->getPublicWishlistById($context$wishlistId$context->getSalesChannel()->getId(), $this->customerId);
  341.             if ($publicWishlists->first() !== null) {
  342.                 //check for password
  343.                 /**
  344.                  * @var WishlistModel $pWishlist
  345.                  */
  346.                 $pWishlist $publicWishlists->first();
  347.                 if ($pWishlist->getPassword() !== null)
  348.                     if ($pWishlist->getPassword() !== $password)
  349.                         return $this->renderStorefront('@Storefront/storefront/page/wishlist/enterPassword.html.twig',[
  350.                             'wishlistId'=>$wishlistId,
  351.                             "page" => ["header"=>$this->headerPageletLoader->load($request,$context)]
  352.                         ]);
  353.                 $publicWishlists $this->ajaxController->formatWishlistResponseArray($publicWishlists$contexttrue);
  354.                 $publicWishlists $this->ajaxController->addAdvancedProductInformationToWishlist($publicWishlists$context,true);
  355.             }
  356.         }
  357.         if(empty($publicWishlists))
  358.             $publicWishlists = [];
  359.         $page $this->genericPageLoader->load($request$context);
  360.         $page->getMetaInformation()->setMetaTitle("Wishlist");
  361.         $page->getMetaInformation()->setMetaDescription("Wishlist");
  362.         $page->getMetaInformation()->setRobots("noindex,nofollow");
  363.         return $this->renderStorefront('@Storefront/storefront/page/wishlist/index.html.twig',[
  364.             "wishlists"=>$wishlists,
  365.             'isLoggedIn' => $isLoggedIn,
  366.             'wishlistCanBePublic' => $this->config['wishlistCanBePublic'],
  367.             'wishlistBirthday'=> $this->config['wishlistCanBeBirthday'],
  368.             'wishlistCanBePrinted'=> $this->config['printWishlist'],
  369.             'wishlistId' => $wishlistId,
  370.             'message' => $message,
  371.             'subscribedToWishlist' => $subscribedToWishlist,
  372.             'publicWishlist' => $publicWishlists,
  373.             'page' => $page
  374.         ]);
  375.     }
  376.     private function subscribeToWishlist(string $wishlistId,SalesChannelContext $context,$password null):array{
  377.         $isLoggedIn = ($context->getCustomer()==null)?false:true;
  378.         $responseArr = ['success'=>true,'message'=>''];
  379.         if(!$isLoggedIn){
  380.             if(!$this->config['cookieUserCanSubscribe']) {
  381.                 $responseArr['success'] = false;
  382.                 $responseArr['message'] = 8;
  383.                 return $responseArr;
  384.             }
  385.         }
  386.         $this->prePatch($context);
  387.         if($this->customerId === null) {
  388.             $this->customerId $this->wishListEntityHandler->createWishlistCustomer($context$this->wishlistSessionHandler->getSessionId());
  389.             $this->wishlistSessionHandler->createWishlistSessionAttribute($context->getSalesChannelId(),$wishlistId,'',$this->customerId);
  390.         }
  391.         $res =  $this->wishListEntityHandler->subscribeToWishlist($wishlistId,$context->getSalesChannel()->getId(),$this->customerId,$context,$password);
  392.         //create cookie if there was no cookie before
  393.         if($res['success'] === true){
  394.             if(!$isLoggedIn)
  395.                 $this->wishlistSessionHandler->createWishlistSessionAttribute($context->getSalesChannelId(),$wishlistId,'',$this->customerId);
  396.         }
  397.         return $res;
  398.     }
  399.     /**
  400.      * @Route(
  401.      *     "/wishlist/productBox/{productId}/{index}/{wishlistId}",
  402.      *     name="frontend.pixup.wishlist.product_box",
  403.      *     options={"seo"="false"},
  404.      *     methods={"GET"},
  405.      *     defaults={"_format"="html", "csrf_protected"=true }
  406.      * )
  407.      ** this returns a productBox to load it dynamic inside of the wishlist
  408.      */
  409.     public function WishlistLoadProductBox(
  410.         string $productId,
  411.         string $index,
  412.         string $wishlistId,
  413.         Request $request,
  414.         SalesChannelContext $context
  415.     ){
  416.         $product $this->productLoader->load(new Criteria([$productId]),$context)->first();
  417.         $configuratorSettings $this->productConfiguratorServiceLoader->load($product,$context);
  418.         /**
  419.          * @var WishlistModel $wishlist
  420.          */
  421.         $wishlist $this->wishListEntityHandler->getWishlistById($wishlistId$context);
  422.         $wishlist $this->ajaxController->formatWishlistResponseArray($wishlist$context)[0];
  423.         if($wishlist['isOwnWishlist'] && !$wishlist['isOwnWishlist'] && !$wishlist['editable']){
  424.             $delete false;
  425.             $move false;
  426.         }else{
  427.             $delete true;
  428.             $move true;
  429.         }
  430.         return $this->renderStorefront('@Storefront/wishlist/box/product-prev.html.twig',[
  431.             'product'=>$product,
  432.             'configuratorSettings' => $configuratorSettings,
  433.             'index' => $index,
  434.             'wishlistId' => $wishlistId,
  435.             'external' => false,
  436.             'delete'=>$delete,
  437.             'move'=>$move,
  438.         ]);
  439.     }
  440. }