getBasketElements() public method

return BasketElements.
public getBasketElements ( ) : Sonata\Component\Basket\BasketElementInterface[]
return Sonata\Component\Basket\BasketElementInterface[]
Example #1
0
 /**
  * Returns basket elements delivery countries
  *
  * @return array
  */
 protected function getBasketDeliveryCountries()
 {
     $countries = array();
     foreach ($this->basket->getBasketElements() as $basketElement) {
         $product = $basketElement->getProduct();
         foreach ($product->getDeliveries() as $delivery) {
             $code = $delivery->getCountryCode();
             if (!isset($countries[$code])) {
                 $countries[$code] = Intl::getRegionBundle()->getCountryName($code);
             }
         }
     }
     return $countries;
 }
Example #2
0
 /**
  * Build a basket
  *
  * @param \Sonata\Component\Basket\BasketInterface $basket
  *
  * @throws \RuntimeException
  */
 public function build(BasketInterface $basket)
 {
     $basket->setProductPool($this->productPool);
     foreach ($basket->getBasketElements() as $basketElement) {
         if ($basketElement->getProduct() === null) {
             // restore information
             if ($basketElement->getProductCode() == null) {
                 throw new \RuntimeException('The product code is empty');
             }
             $productDefinition = $this->productPool->getProduct($basketElement->getProductCode());
             $basketElement->setProductDefinition($productDefinition);
         }
     }
     // load the delivery address
     $deliveryAddressId = $basket->getDeliveryAddressId();
     if ($deliveryAddressId) {
         $address = $this->addressManager->findOneBy(array('id' => $deliveryAddressId));
         $basket->setDeliveryAddress($address);
     }
     $deliveryMethodCode = $basket->getDeliveryMethodCode();
     if ($deliveryMethodCode) {
         $basket->setDeliveryMethod($this->deliveryPool->getMethod($deliveryMethodCode));
     }
     // load the payment address
     $billingAddressId = $basket->getBillingAddressId();
     if ($billingAddressId) {
         $address = $this->addressManager->findOneBy(array('id' => $billingAddressId));
         $basket->setBillingAddress($address);
     }
     // load the payment method
     $paymentMethodCode = $basket->getPaymentMethodCode();
     if ($paymentMethodCode) {
         $basket->setPaymentMethod($this->paymentPool->getMethod($paymentMethodCode));
     }
 }
Example #3
0
 /**
  * The validator asks each product repository to validate the related basket element.
  *
  * @param BasketInterface $basket
  * @param Constraint      $constraint
  */
 public function validate($basket, Constraint $constraint)
 {
     foreach ($basket->getBasketElements() as $pos => $basketElement) {
         // create a new ErrorElement object
         $errorElement = new ErrorElement($basket, $this->constraintValidatorFactory, $this->context, $this->context->getGroup());
         $errorElement->with('basketElements[' . $pos . ']');
         // validate the basket element through the related service provider
         $this->productPool->getProvider($basketElement->getProductCode())->validateFormBasketElement($errorElement, $basketElement, $basket);
     }
     if (count($this->context->getViolations()) > 0) {
         $this->context->addViolationAt('basketElements', $constraint->message);
     }
 }
Example #4
0
 /**
  * {@inheritdoc}
  */
 public function getAvailableMethods(BasketInterface $basket = null, AddressInterface $deliveryAddress = null)
 {
     $instances = array();
     if (!$basket) {
         return $instances;
     }
     // STEP 1 : We get product's delivery methods
     /** @var $basketElement \Sonata\Component\Basket\BasketElementInterface */
     foreach ($basket->getBasketElements() as $basketElement) {
         $product = $basketElement->getProduct();
         if (!$product) {
             $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d does not exist', $basketElement->getProductId()));
             return $instances;
         }
         /** @var $productDelivery \Sonata\Component\Product\DeliveryInterface */
         foreach ($product->getDeliveries() as $productDelivery) {
             // delivery method already selected
             if (isset($instances[$productDelivery->getCode()])) {
                 $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code : %s already selected', $basketElement->getProductId(), $productDelivery->getCode()));
                 continue;
             }
             $deliveryMethod = $this->getDeliveryPool()->getMethod($productDelivery->getCode());
             if (!$deliveryMethod) {
                 $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code: %s does not exist', $basketElement->getProductId(), $productDelivery->getCode()));
                 continue;
             }
             // product delivery not enable
             if (!$deliveryMethod->getEnabled()) {
                 $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code : %s is not enabled', $basketElement->getProductId(), $productDelivery->getCode()));
                 continue;
             }
             // Address is required but none have been provided
             if ($deliveryMethod->isAddressRequired() && !$deliveryAddress) {
                 $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code : %s requires an address but none have been provided', $basketElement->getProductId(), $productDelivery->getCode()));
                 continue;
             }
             // the product is not deliverable at the $shippingAddress
             if ($deliveryMethod->isAddressRequired() && $deliveryAddress->getCountryCode() != $productDelivery->getCountryCode()) {
                 $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code : %s the country code does not match (%s != %s)', $basketElement->getProductId(), $productDelivery->getCode(), $deliveryAddress->getCountryCode(), $productDelivery->getCountryCode()));
                 continue;
             }
             $this->log(sprintf('[sonata::getAvailableDeliveryMethods] product.id: %d - code : %s selected', $basketElement->getProductId(), $productDelivery->getCode()));
             $instances[$deliveryMethod->getCode()] = $deliveryMethod;
         }
     }
     // STEP 2 : We select the delivery methods with the highest priority
     $instances = array_values($instances);
     usort($instances, array('Sonata\\Component\\Delivery\\Selector', 'sort'));
     return $instances;
 }
Example #5
0
 /**
  * transform a basket into order.
  *
  * @throws \RuntimeException
  *
  * @param null|\Sonata\Component\Basket\BasketInterface $basket
  *
  * @return null|\Sonata\Component\Order\OrderInterface
  */
 public function transformIntoOrder(BasketInterface $basket)
 {
     $event = new BasketTransformEvent($basket);
     $this->eventDispatcher->dispatch(TransformerEvents::PRE_BASKET_TO_ORDER_TRANSFORM, $event);
     // Customer
     $customer = $basket->getCustomer();
     if (!$customer instanceof CustomerInterface) {
         if ($this->getLogger()) {
             $this->getLogger()->emergency('[Sonata\\Component\\Payment\\Transform\\Basket::transform] the customer is not valid');
         }
         throw new \RuntimeException('Invalid customer');
     }
     // Billing
     $billingAddress = $basket->getBillingAddress();
     if (!$billingAddress instanceof AddressInterface) {
         if ($this->getLogger()) {
             $this->getLogger()->emergency('[Sonata\\Component\\Payment\\Transform\\Basket::transform] the billing address is not valid');
         }
         throw new \RuntimeException('Invalid billing address');
     }
     $paymentMethod = $basket->getPaymentMethod();
     if (!$paymentMethod instanceof PaymentInterface) {
         if ($this->getLogger()) {
             $this->getLogger()->emergency('[Sonata\\Component\\Payment\\PaymentInterface::transform] the payment method is not valid');
         }
         throw new \RuntimeException('Invalid payment method');
     }
     // Shipping
     $deliveryMethod = $basket->getDeliveryMethod();
     if (!$deliveryMethod instanceof ServiceDeliveryInterface) {
         if ($this->getLogger()) {
             $this->getLogger()->emergency('[Sonata\\Component\\Delivery\\ServiceDeliveryInterface::transform] the delivery method is not valid');
         }
         throw new \RuntimeException('Invalid delivery method');
     }
     $deliveryAddress = $basket->getDeliveryAddress();
     if ($deliveryMethod->isAddressRequired() && !$deliveryAddress instanceof AddressInterface) {
         if ($this->getLogger()) {
             $this->getLogger()->emergency('[Sonata\\Component\\Delivery\\ServiceDeliveryInterface::transform] the shipping address is not valid');
         }
         throw new \RuntimeException('Invalid delivery address');
     }
     // add a custom class_instance for testing purpose.
     $order = $this->orderManager->create();
     $order->setCustomer($customer);
     $order->setUsername($customer->getFullname());
     $order->setLocale($customer->getLocale());
     if ($deliveryMethod->isAddressRequired()) {
         $order->setShippingAddress1($deliveryAddress->getAddress1());
         $order->setShippingAddress2($deliveryAddress->getAddress2());
         $order->setShippingAddress3($deliveryAddress->getAddress3());
         $order->setShippingPostcode($deliveryAddress->getPostcode());
         $order->setShippingCity($deliveryAddress->getCity());
         $order->setShippingCountryCode($deliveryAddress->getCountryCode());
         $order->setShippingName($deliveryAddress->getFirstname() . ' ' . $deliveryAddress->getLastname());
         $order->setShippingPhone($deliveryAddress->getPhone());
     }
     $order->setBillingAddress1($billingAddress->getAddress1());
     $order->setBillingAddress2($billingAddress->getAddress2());
     $order->setBillingAddress3($billingAddress->getAddress3());
     $order->setBillingPostcode($billingAddress->getPostcode());
     $order->setBillingCity($billingAddress->getCity());
     $order->setBillingCountryCode($billingAddress->getCountryCode());
     $order->setBillingName($billingAddress->getFirstname() . ' ' . $billingAddress->getLastname());
     $order->setBillingPhone($billingAddress->getPhone());
     $order->setTotalExcl($basket->getTotal());
     $order->setTotalInc($basket->getTotal(true));
     $order->setDeliveryVat($basket->getDeliveryVat());
     $order->setDeliveryCost($basket->getDeliveryPrice(true));
     $order->setDeliveryMethod($basket->getDeliveryMethod()->getCode());
     $order->setDeliveryStatus(ServiceDeliveryInterface::STATUS_OPEN);
     $order->setCreatedAt(new \DateTime());
     $order->setCurrency($basket->getCurrency());
     $order->setStatus(OrderInterface::STATUS_OPEN);
     $order->setPaymentStatus(TransactionInterface::STATUS_OPEN);
     $order->setPaymentMethod($basket->getPaymentMethod()->getCode());
     foreach ($basket->getBasketElements() as $basketElement) {
         $orderElement = $basketElement->getProductProvider()->createOrderElement($basketElement);
         if (!$orderElement instanceof OrderElementInterface) {
             continue;
         }
         $order->addOrderElement($orderElement);
     }
     $event = new OrderTransformEvent($order);
     $this->eventDispatcher->dispatch(TransformerEvents::POST_BASKET_TO_ORDER_TRANSFORM, $event);
     return $order;
 }
 /**
  * @param FormEvent $event
  */
 public function preBind(FormEvent $event)
 {
     $form = $event->getForm();
     $data = $event->getData();
     $this->buildBasketElements($form, $this->basket->getBasketElements());
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 public function isBasketValid(BasketInterface $basket)
 {
     if ($basket->countBasketElements() == 0) {
         return false;
     }
     foreach ($basket->getBasketElements() as $element) {
         $product = $element->getProduct();
         if ($product->isRecurrentPayment() === true) {
             return false;
         }
     }
     return true;
 }