Sonata\Component\Delivery\Selector::getAvailableMethods PHP Method

getAvailableMethods() public method

public getAvailableMethods ( Sonata\Component\Basket\BasketInterface $basket = null, Sonata\Component\Customer\AddressInterface $deliveryAddress = null )
$basket Sonata\Component\Basket\BasketInterface
$deliveryAddress Sonata\Component\Customer\AddressInterface
    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;
    }

Usage Example

Example #1
0
 public function testAvailableMethods()
 {
     $deliveryMethod_low = new ServiceDelivery();
     $deliveryMethod_low->setCode('ups_low');
     $deliveryMethod_low->setEnabled(true);
     $deliveryMethod_low->setPriority(1);
     $deliveryMethod_high = new ServiceDelivery();
     $deliveryMethod_high->setCode('ups_high');
     $deliveryMethod_high->setEnabled(true);
     $deliveryMethod_high->setPriority(2);
     $deliveryMethod_high_bis = new ServiceDelivery();
     $deliveryMethod_high_bis->setCode('ups_high_bis');
     $deliveryMethod_high_bis->setEnabled(true);
     $deliveryMethod_high_bis->setPriority(2);
     $deliveryPool = new DeliveryPool();
     $deliveryPool->addMethod($deliveryMethod_low);
     $deliveryPool->addMethod($deliveryMethod_high);
     $deliveryPool->addMethod($deliveryMethod_high_bis);
     $productPool = new ProductPool();
     $productDelivery_low = $this->getMock('Sonata\\Component\\Product\\DeliveryInterface');
     $productDelivery_low->expects($this->any())->method('getCode')->will($this->returnValue('ups_low'));
     $productDelivery_high = $this->getMock('Sonata\\Component\\Product\\DeliveryInterface');
     $productDelivery_high->expects($this->any())->method('getCode')->will($this->returnValue('ups_high'));
     $productDelivery_high_bis = $this->getMock('Sonata\\Component\\Product\\DeliveryInterface');
     $productDelivery_high_bis->expects($this->any())->method('getCode')->will($this->returnValue('ups_high_bis'));
     $product = $this->getMock('Sonata\\Component\\Product\\ProductInterface');
     $product->expects($this->once())->method('getDeliveries')->will($this->returnValue(array($productDelivery_low, $productDelivery_high, $productDelivery_high_bis)));
     $basketElement = $this->getMock('Sonata\\Component\\Basket\\BasketElementInterface');
     $basketElement->expects($this->once())->method('getProduct')->will($this->returnValue($product));
     $basket = $this->getMock('Sonata\\Component\\Basket\\BasketInterface');
     $basket->expects($this->once())->method('getBasketElements')->will($this->returnValue(array($basketElement)));
     $address = $this->getMock('Sonata\\Component\\Customer\\AddressInterface');
     $selector = new Selector($deliveryPool, $productPool);
     $selector->setLogger($this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface'));
     $instances = $selector->getAvailableMethods($basket, $address);
     $this->assertCount(3, $instances);
     $this->assertEquals($instances[0]->getCode(), 'ups_high_bis');
     $this->assertEquals($instances[1]->getCode(), 'ups_high');
     $this->assertEquals($instances[2]->getCode(), 'ups_low');
 }