diff --git a/core/lib/Thelia/Core/Template/Loop/Delivery.php b/core/lib/Thelia/Core/Template/Loop/Delivery.php index a379f9c3a..2e7391c95 100644 --- a/core/lib/Thelia/Core/Template/Loop/Delivery.php +++ b/core/lib/Thelia/Core/Template/Loop/Delivery.php @@ -1,109 +1,106 @@ -. */ -/* */ -/*************************************************************************************/ - -namespace Thelia\Core\Template\Loop; -use Thelia\Core\Template\Element\LoopResult; -use Thelia\Core\Template\Element\LoopResultRow; -use Thelia\Core\Template\Loop\Argument\Argument; -use Thelia\Exception\OrderException; -use Thelia\Model\CountryQuery; -use Thelia\Model\Module; -use Thelia\Module\BaseModule; -use Thelia\Module\DeliveryModuleInterface; -use Thelia\Module\Exception\DeliveryException; - -/** - * Class Delivery - * @package Thelia\Core\Template\Loop - * @author Manuel Raynaud - * @author Etienne Roudeix - */ -class Delivery extends BaseSpecificModule -{ - - public function getArgDefinitions() - { - $collection = parent::getArgDefinitions(); - - $collection->addArgument( - Argument::createIntTypeArgument("country") - ); - - return $collection; - } - - public function parseResults(LoopResult $loopResult) - { - $countryId = $this->getCountry(); - if (null !== $countryId) { - $country = CountryQuery::create()->findPk($countryId); - if (null === $country) { - throw new \InvalidArgumentException('Cannot found country id: `' . $countryId . '` in delivery loop'); - } - } else { - $country = $this->container->get('thelia.taxEngine')->getDeliveryCountry(); - } - - /** @var Module $deliveryModule */ - foreach ($loopResult->getResultDataCollection() as $deliveryModule) { - $loopResultRow = new LoopResultRow($deliveryModule); - - /** @var DeliveryModuleInterface $moduleInstance */ - $moduleInstance = $this->container->get(sprintf('module.%s', $deliveryModule->getCode())); - - if (false === $moduleInstance instanceof DeliveryModuleInterface) { - throw new \RuntimeException(sprintf("delivery module %s is not a Thelia\Module\DeliveryModuleInterface", $deliveryModule->getCode())); - } - - try { - // Check if module is valid, by calling isValidDelivery(), - // or catching a DeliveryException. - - if ($moduleInstance->isValidDelivery($country)) { - - $postage = $moduleInstance->getPostage($country); - - $loopResultRow - ->set('ID', $deliveryModule->getId()) - ->set('TITLE', $deliveryModule->getVirtualColumn('i18n_TITLE')) - ->set('CHAPO', $deliveryModule->getVirtualColumn('i18n_CHAPO')) - ->set('DESCRIPTION', $deliveryModule->getVirtualColumn('i18n_DESCRIPTION')) - ->set('POSTSCRIPTUM', $deliveryModule->getVirtualColumn('i18n_POSTSCRIPTUM')) - ->set('POSTAGE', $postage) - ; - - $loopResult->addRow($loopResultRow); - } - } catch (DeliveryException $ex) { - // Module is not available - } - } - - return $loopResult; - } - - protected function getModuleType() - { - return BaseModule::DELIVERY_MODULE_TYPE; - } -} +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Template\Loop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Loop\Argument\Argument; +use Thelia\Exception\OrderException; +use Thelia\Model\CountryQuery; +use Thelia\Module\BaseModule; +use Thelia\Module\DeliveryModuleInterface; + +/** + * Class Delivery + * @package Thelia\Core\Template\Loop + * @author Manuel Raynaud + * @author Etienne Roudeix + */ +class Delivery extends BaseSpecificModule +{ + + public function getArgDefinitions() + { + $collection = parent::getArgDefinitions(); + + $collection->addArgument( + Argument::createIntTypeArgument("country") + ); + + return $collection; + } + + public function parseResults(LoopResult $loopResult) + { + $countryId = $this->getCountry(); + if (null !== $countryId) { + $country = CountryQuery::create()->findPk($countryId); + if (null === $country) { + throw new \InvalidArgumentException('Cannot found country id: `' . $countryId . '` in delivery loop'); + } + } else { + $country = $this->container->get('thelia.taxEngine')->getDeliveryCountry(); + } + + foreach ($loopResult->getResultDataCollection() as $deliveryModule) { + $loopResultRow = new LoopResultRow($deliveryModule); + + $moduleInstance = $this->container->get(sprintf('module.%s', $deliveryModule->getCode())); + + if (false === $moduleInstance instanceof DeliveryModuleInterface) { + throw new \RuntimeException(sprintf("delivery module %s is not a Thelia\Module\DeliveryModuleInterface", $deliveryModule->getCode())); + } + + try { + $postage = $moduleInstance->getPostage($country); + } catch (OrderException $e) { + switch ($e->getCode()) { + case OrderException::DELIVERY_MODULE_UNAVAILABLE: + /* do not show this delivery module */ + continue(2); + break; + default: + throw $e; + } + } + + $loopResultRow + ->set('ID', $deliveryModule->getId()) + ->set('TITLE', $deliveryModule->getVirtualColumn('i18n_TITLE')) + ->set('CHAPO', $deliveryModule->getVirtualColumn('i18n_CHAPO')) + ->set('DESCRIPTION', $deliveryModule->getVirtualColumn('i18n_DESCRIPTION')) + ->set('POSTSCRIPTUM', $deliveryModule->getVirtualColumn('i18n_POSTSCRIPTUM')) + ->set('POSTAGE', $postage) + ; + + $loopResult->addRow($loopResultRow); + } + + return $loopResult; + } + + protected function getModuleType() + { + return BaseModule::DELIVERY_MODULE_TYPE; + } +}