Sonata\Component\Transformer\OrderTransformer::transformIntoBasket PHP Method

transformIntoBasket() public method

public transformIntoBasket ( Sonata\Component\Order\OrderInterface $order, Sonata\Component\Basket\BasketInterface $basket ) : Sonata\Component\Basket\BasketInterface
$order Sonata\Component\Order\OrderInterface
$basket Sonata\Component\Basket\BasketInterface
return Sonata\Component\Basket\BasketInterface
    public function transformIntoBasket(OrderInterface $order, BasketInterface $basket)
    {
        $event = new OrderTransformEvent($order);
        $this->eventDispatcher->dispatch(TransformerEvents::PRE_ORDER_TO_BASKET_TRANSFORM, $event);
        // we reset the current basket
        $basket->reset(true);
        $basket->setCurrency($order->getCurrency());
        $basket->setLocale($order->getLocale());
        // We are free to convert !
        foreach ($order->getOrderElements() as $orderElement) {
            /*
             * @var $orderElement OrderElementInterface
             */
            $provider = $this->productPool->getProvider($orderElement->getProductType());
            $manager = $this->productPool->getManager($orderElement->getProductType());
            $product = $manager->findOneBy(array('id' => $orderElement->getProductId()));
            if (!$product) {
                continue;
            }
            $basketElement = $provider->createBasketElement($product, $orderElement->getOptions());
            $basketElement->setQuantity($orderElement->getQuantity());
            $provider->basketAddProduct($basket, $product, $basketElement);
        }
        $basket->setCustomer($order->getCustomer());
        $basket->buildPrices();
        $event = new BasketTransformEvent($basket);
        $this->eventDispatcher->dispatch(TransformerEvents::POST_ORDER_TO_BASKET_TRANSFORM, $event);
        return $basket;
    }

Usage Example

 public function testBasket()
 {
     $provider = $this->getMock('Sonata\\Component\\Product\\ProductProviderInterface');
     $provider->expects($this->once())->method('basketAddProduct')->will($this->returnValue(true));
     $provider->expects($this->once())->method('createBasketElement')->will($this->returnValue($basketElement = new BasketElement()));
     $product = $this->getMock('Sonata\\Component\\Product\\ProductInterface');
     $customer = $this->getMock('Sonata\\Component\\Customer\\CustomerInterface');
     $manager = $this->getMock('Sonata\\Component\\Product\\ProductManagerInterface');
     $manager->expects($this->once())->method('findOneBy')->will($this->returnValue($product));
     $pool = $this->getMock('Sonata\\Component\\Product\\Pool');
     $pool->expects($this->once())->method('getProvider')->will($this->returnValue($provider));
     $pool->expects($this->once())->method('getManager')->will($this->returnValue($manager));
     $basket = $this->getMock('Sonata\\Component\\Basket\\BasketInterface');
     $basket->expects($this->once())->method('reset');
     $basket->expects($this->once())->method('buildPrices');
     $orderElement = $this->getMock('Sonata\\Component\\Order\\OrderElementInterface');
     $orderElement->expects($this->exactly(2))->method('getProductType');
     $orderElement->expects($this->exactly(1))->method('getProductId')->will($this->returnValue(2));
     $orderElement->expects($this->exactly(1))->method('getOptions')->will($this->returnValue(array()));
     $orderElement->expects($this->exactly(1))->method('getQuantity')->will($this->returnValue(2));
     $order = $this->getMock('Sonata\\Component\\Order\\OrderInterface');
     $order->expects($this->once())->method('getOrderElements')->will($this->returnValue(array($orderElement)));
     $order->expects($this->once())->method('getCustomer')->will($this->returnValue($customer));
     $currency = new Currency();
     $currency->setLabel('EUR');
     $order->expects($this->once())->method('getCurrency')->will($this->returnValue($currency));
     $transformer = new OrderTransformer($pool);
     $transformer->transformIntoBasket($order, $basket);
     $this->assertEquals(2, $basketElement->getQuantity());
 }