src/Controller/WPSYCommerceAPIController.php line 69

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Checkout\CheckoutSessionManager;
  4. use App\Form\WPSYCommerce\CheckoutAddressType;
  5. use App\Images\ImageRenderer;
  6. use App\Service\WPSYCommerceService;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\Form\FormFactoryInterface;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\Validator\Validator\ValidatorInterface;
  15. use Twig\Environment;
  16. /**
  17.  * @Route("/wpsy/commerce")
  18.  */
  19. class WPSYCommerceAPIController extends AbstractController
  20. {
  21.     private ImageRenderer $imageRenderer;
  22.     private EntityManagerInterface $entityManager;
  23.     private WPSYCommerceService $wpsyCommerceService;
  24.     private CheckoutSessionManager $sessionManager;
  25.     public function __construct(EntityManagerInterface $entityManagerImageRenderer $imageRendererWPSYCommerceService $wpsyCommerceServiceCheckoutSessionManager $sessionManager)
  26.     {
  27.         $this->imageRenderer $imageRenderer;
  28.         $this->entityManager $entityManager;
  29.         $this->wpsyCommerceService $wpsyCommerceService;
  30.         $this->sessionManager $sessionManager;
  31.     }
  32.     #[Route('/add-to-cart'name'wpsy_commerce_add_to_cart'methods: ['POST'])]
  33.     public function addToCart(Request $request)
  34.     {
  35.         $data \json_decode($request->getContent(), true);
  36.         if (!isset($data['product_id'])) {
  37.             throw new BadRequestHttpException('Missing product_id');
  38.         }
  39.         $product wc_get_product($data['product_id']);
  40.         $productVariation wc_get_product($data['variation_id'] ?? null);
  41.         $variationAttributes = array();
  42.         $cart_item_data = array();
  43.         $price $product->get_price();
  44.         if ($productVariation && isset($data['variation_id'])) {
  45.             $variationAttributes $data['attributes'] ?? $productVariation->get_variation_attributes();
  46.             $price $productVariation->get_price();
  47.         }
  48.         WC()->cart->add_to_cart($data['product_id'], $data['quantity'] ?? 1$data['variation_id'] ?? null$variationAttributes$cart_item_data);
  49.         WC()->cart->calculate_totals();
  50.         WC()->cart->set_session();
  51.         WC()->cart->persistent_cart_update();
  52.         WC()->session->save_data();
  53.         return new JsonResponse([
  54.             'success' => true,
  55.             'cart_length' => WC()->cart->get_cart_contents_count(),
  56.             'price' => $price
  57.         ]);
  58.     }
  59.     #[Route('/get-cart-count'name'wpsy_commerce_get_cart_count')]
  60.     public function getCartCount()
  61.     {
  62.         return new JsonResponse([
  63.             'cart_contents_count' => WC()->cart->get_cart_contents_count(),
  64.         ]);
  65.     }
  66.     #[Route('/update-cart'name'wpsy_commerce_update_cart')]
  67.     public function updateCart(Request $request)
  68.     {
  69.         $data \json_decode($request->getContent(), true);
  70.         if (!isset($data['cart'])) {
  71.             throw new BadRequestHttpException('Missing cart');
  72.         }
  73.         foreach ($data['cart']['items'] as $cart_item_key => $cart_item) {
  74.             $quantity $cart_item['quantity'];
  75.             if ($quantity <= 0) {
  76.                 WC()->cart->remove_cart_item($cart_item_key);
  77.                 continue;
  78.             }
  79.             WC()->cart->set_quantity($cart_item_key$quantity);
  80.         }
  81.         WC()->cart->calculate_totals();
  82.         WC()->cart->set_session();
  83.         WC()->cart->persistent_cart_update();
  84.         WC()->session->save_data();
  85.         return new JsonResponse([
  86.             'success' => true,
  87.             'cart' => $this->wpsyCommerceService->getCart(),
  88.             'shipping' => $this->wpsyCommerceService->getShipping(),
  89.         ]);
  90.     }
  91.     #[Route('/apply-coupon'name'wpsy_commerce_apply_coupon'methods: ['POST'])]
  92.     public function applyCoupon(Request $request)
  93.     {
  94.         $data \json_decode($request->getContent(), true);
  95.         if (!isset($data['coupon'])) {
  96.             throw new BadRequestHttpException('Missing coupon');
  97.         }
  98.         WC()->cart->apply_coupon($data['coupon']);
  99.         $notices wc_get_notices();
  100.         wc_clear_notices();
  101.         if ($notices && isset($notices['error'])) {
  102.             $message implode(', 'array_column($notices['error'], 'notice'));
  103.             return new JsonResponse([
  104.                 'success' => false,
  105.                 'message' => $message,
  106.             ]);
  107.         }
  108.         WC()->cart->calculate_totals();
  109.         WC()->cart->set_session();
  110.         WC()->cart->persistent_cart_update();
  111.         WC()->session->save_data();
  112.         return new JsonResponse([
  113.             'success' => true,
  114.             'cart' => $this->wpsyCommerceService->getCart(),
  115.         ]);
  116.     }
  117.     #[Route('/remove-coupon'name'wpsy_commerce_remove_coupon'methods: ['POST'])]
  118.     public function removeCoupon(Request $request)
  119.     {
  120.         $data \json_decode($request->getContent(), true);
  121.         if (!isset($data['coupon'])) {
  122.             throw new BadRequestHttpException('Missing coupon');
  123.         }
  124.         WC()->cart->remove_coupon($data['coupon']);
  125.         WC()->cart->calculate_totals();
  126.         WC()->cart->set_session();
  127.         WC()->cart->persistent_cart_update();
  128.         WC()->session->save_data();
  129.         return new JsonResponse([
  130.             'success' => true,
  131.             'cart' => $this->wpsyCommerceService->getCart(),
  132.         ]);
  133.     }
  134.     #[Route('/update-shipping-province'name'wpsy_commerce_update_shipping_province'methods: ['POST'])]
  135.     public function updateShippingProvince(Request $request)
  136.     {
  137.         $data \json_decode($request->getContent(), true);
  138.         if (!isset($data['province'])) {
  139.             throw new BadRequestHttpException('Missing province');
  140.         }
  141.         WC()->customer->set_billing_state($data['province']);
  142.         WC()->customer->set_shipping_state($data['province']);
  143.         WC()->customer->save();
  144.         return new JsonResponse([
  145.             'success' => true,
  146.         ]);
  147.     }
  148.     #[Route('/update-shipping-method'name'wpsy_commerce_update_shipping_method'methods: ['POST'])]
  149.     public function updateShippingMethod(Request $request)
  150.     {
  151.         $data \json_decode($request->getContent(), true);
  152.         if (!isset($data['shipping_method'])) {
  153.             throw new BadRequestHttpException('Missing shipping_method');
  154.         }
  155.         $session $this->sessionManager->restoreOrCreateSession();
  156.         $session->shippingMethod $data['shipping_method'];
  157.         $this->sessionManager->saveSession($session);
  158.         WC()->session->set('chosen_shipping_methods', [$data['shipping_method']]);
  159.         WC()->cart->calculate_totals();
  160.         WC()->cart->set_session();
  161.         WC()->cart->persistent_cart_update();
  162.         WC()->session->save_data();
  163.         return new JsonResponse([
  164.             'success' => true,
  165.             'cart' => $this->wpsyCommerceService->getCart(),
  166.         ]);
  167.     }
  168.     #[Route('/validate-field'name'wpsy_commerce_validate_field'methods: ['POST'])]
  169.     public function validateField(Request $requestFormFactoryInterface $formFactoryValidatorInterface $validator): JsonResponse
  170.     {
  171.         $form $formFactory->create(CheckoutAddressType::class);
  172.         $fieldData $request->request->all();
  173.         $fieldName array_keys($fieldData)[0];
  174.         $fieldValue $fieldData[$fieldName];
  175.         // Obtener los constraints del campo desde el formulario
  176.         $formField $form->get($fieldName);
  177.         $constraints $formField->getConfig()->getOption('constraints');
  178.         // Validar solo el campo actual
  179.         $violations $validator->validate($fieldValue$constraints);
  180.         if (count($violations) > 0) {
  181.             $errors = [];
  182.             foreach ($violations as $violation) {
  183.                 $errors[$fieldName][] = $violation->getMessage();
  184.             }
  185.             return new JsonResponse(['success' => false'errors' => $errors]);
  186.         }
  187.         return new JsonResponse(['success' => true]);
  188.     }
  189. }