diff --git a/core/lib/Thelia/Action/Currency.php b/core/lib/Thelia/Action/Currency.php index d7467c41a..2a276cd9e 100644 --- a/core/lib/Thelia/Action/Currency.php +++ b/core/lib/Thelia/Action/Currency.php @@ -26,6 +26,7 @@ namespace Thelia\Action; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Thelia\Core\Event\ActionEvent; use Thelia\Model\CurrencyQuery; use Thelia\Model\Currency as CurrencyModel; @@ -130,7 +131,7 @@ class Currency extends BaseAction implements EventSubscriberInterface } } - public function updateRates(EventDispatcherInterface $dispatcher) + public function updateRates(ActionEvent $event) { $rates_url = ConfigQuery::read('currency_rate_update_url', 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml'); @@ -144,7 +145,7 @@ class Currency extends BaseAction implements EventSubscriberInterface if (null !== $currency = CurrencyQuery::create()->findOneByCode($code)) { $currency - ->setDispatcher($dispatcher) + ->setDispatcher($event->getDispatcher()) ->setRate($rate) ->save() ; diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php index 59bde6905..bac7c1624 100644 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php @@ -127,20 +127,25 @@ class Form extends AbstractSmartyPlugin } } - protected function assignFieldValues($template, $fieldName, $fieldValue, $fieldVars, $total_value_count = 1) + protected function assignFieldValues( + $template, + $fieldName, + $fieldValue, + $fieldType, + $fieldVars, + $total_value_count = 1 + ) { $template->assign("name", $fieldName); - $template->assign("value", $fieldValue); + $template->assign("data", $fieldVars['data']); + + $template->assign("type", $fieldType); $template->assign("checked", isset($fieldVars['checked']) ? $fieldVars['checked'] : false); $template->assign("choices", isset($fieldVars['choices']) ? $fieldVars['choices'] : false); $template->assign("multiple", isset($fieldVars['multiple']) ? $fieldVars['multiple'] : false); - - //data - $template->assign("data", $fieldVars['data']); - $template->assign("label", $fieldVars["label"]); $template->assign("label_attr", $fieldVars["label_attr"]); @@ -214,6 +219,8 @@ class Form extends AbstractSmartyPlugin $formFieldView = $this->getFormFieldView($params); $formFieldConfig = $this->getFormFieldConfig($params); + $formFieldType = $formFieldConfig->getType()->getName(); + $this->assignFormTypeValues($template, $formFieldConfig, $formFieldView); $value = $formFieldView->vars["value"]; @@ -233,9 +240,22 @@ class Form extends AbstractSmartyPlugin $val = $value[$key]; - $this->assignFieldValues($template, $name, $val, $formFieldView->vars, count($formFieldView->children)); + $this->assignFieldValues( + $template, + $name, + $val, + $formFieldType, + $formFieldView->vars, + count($formFieldView->children) + ); } else { - $this->assignFieldValues($template, $formFieldView->vars["full_name"], $formFieldView->vars["value"], $formFieldView->vars); + $this->assignFieldValues( + $template, + $formFieldView->vars["full_name"], + $formFieldView->vars["value"], + $formFieldType, + $formFieldView->vars + ); } $formFieldView->setRendered(); @@ -254,16 +274,20 @@ class Form extends AbstractSmartyPlugin } if (isset(self::$taggedFieldsStack[self::$taggedFieldsStackPosition])) { + + $field = self::$taggedFieldsStack[self::$taggedFieldsStackPosition]; + $this->assignFieldValues( $template, - self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['view']->vars["full_name"], - self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['view']->vars["value"], - self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['view']->vars + $field['view']->vars["full_name"], + $field['view']->vars["value"], + $field['config']->getType()->getName(), + $field['view']->vars ); - $this->assignFormTypeValues($template, self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['config'], self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['view']); + $this->assignFormTypeValues($template, $field['config'], $field['view']); - self::$taggedFieldsStack[self::$taggedFieldsStackPosition]['view']->setRendered(); + $field['view']->setRendered(); $repeat = true; } diff --git a/core/lib/Thelia/Module/BaseModule.php b/core/lib/Thelia/Module/BaseModule.php index 92ca5458f..1a3e54be9 100644 --- a/core/lib/Thelia/Module/BaseModule.php +++ b/core/lib/Thelia/Module/BaseModule.php @@ -29,11 +29,15 @@ use Propel\Runtime\Propel; use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; +use Thelia\Core\HttpFoundation\Session\Session; +use Thelia\Model\Cart; +use Thelia\Model\Country; use Thelia\Model\Map\ModuleTableMap; use Thelia\Model\ModuleI18nQuery; use Thelia\Model\Map\ModuleImageTableMap; use Thelia\Model\ModuleI18n; use Thelia\Model\Order; +use Thelia\TaxEngine\TaxEngine; use Thelia\Tools\Image; use Thelia\Exception\ModuleException; use Thelia\Model\Module; @@ -125,8 +129,18 @@ class BaseModule extends ContainerAware implements BaseModuleInterface $this->request = $request; } + /** + * @return \Thelia\Core\HttpFoundation\Request the request. + * + * @throws \RuntimeException + */ public function getRequest() { + if ($this->hasRequest() === false) { + // Try to get request from container. + $this->setRequest($this->container->get('request')); + } + if ($this->hasRequest() === false) { throw new \RuntimeException("Sorry, the request is not available in this context"); } @@ -153,6 +167,12 @@ class BaseModule extends ContainerAware implements BaseModuleInterface return $this->dispatcher; } + /** + * Sets a module titles for various languages + * + * @param Module $module the module. + * @param $titles an associative array of locale => title_string + */ public function setTitle(Module $module, $titles) { if (is_array($titles)) { @@ -174,6 +194,20 @@ class BaseModule extends ContainerAware implements BaseModuleInterface } } + /** + * Ensure the proper deployment of the module's images. + * + * TODO : clarify the purpose of ModuleImage. How this table will be used elswhere in Thelia ? + * TODO : this method doesn't take care of internationalization. This is a bug. + * + * @param Module $module the module + * @param string $folderPath the image folder path + * @param ConnectionInterface $con + * + * @throws \Thelia\Exception\ModuleException + * @throws \Exception + * @throws \UnexpectedValueException + */ public function deployImageFolder(Module $module, $folderPath, ConnectionInterface $con = null) { try { @@ -182,7 +216,7 @@ class BaseModule extends ContainerAware implements BaseModuleInterface throw $e; } if (null === $con) { - $con = \Propel\Runtime\Propel::getConnection( + $con = Propel::getConnection( ModuleImageTableMap::DATABASE_NAME ); } @@ -287,6 +321,44 @@ class BaseModule extends ContainerAware implements BaseModuleInterface return $order->getDeliveryModuleId() == $model->getId(); } + /** + * A convenient method to get the current order total, with or without tax, discount or postage. + * This method operates on the order currently in the user's session, and should not be used to + * get the total amount of an order already stored in the database. For such orders, use + * Order::getTotalAmount() method. + * + * @param bool $with_tax if true, to total price will include tax amount + * @param bool $with_discount if true, the total price will include discount, if any + * @param bool $with_postage if true, the total price will include the delivery costs, if any. + * + * @return float|int the current order amount. + */ + public function getCurrentOrderTotalAmount($with_tax = true, $with_discount = true, $with_postage = true) { + + /** @var Session $session */ + $session = $this->getRequest()->getSession(); + + /** @var Cart $cart */ + $cart = $session->getCart(); + + /** @var Order $order */ + $order = $session->getOrder(); + + /** @var TaxEngine $taxEngine */ + $taxEngine = $this->container->get("thelia.taxengine"); + + /** @var Country $country */ + $country = $taxEngine->getDeliveryCountry(); + + $amount = $with_tax ? $cart->getTaxedAmount($country, $with_discount) : $cart->getTotalAmount($with_discount); + + if ($with_postage) { + $amount += $order->getPostage(); + } + + return $amount; + } + /** * * This method allow adding new compilers to Thelia container @@ -327,33 +399,69 @@ class BaseModule extends ContainerAware implements BaseModuleInterface return array(); } + /** + * This method is called when the plugin is installed for the first time, using + * zip upload method. + * + * @param ConnectionInterface $con + */ public function install(ConnectionInterface $con = null) { // Implement this method to do something useful. } + /** + * This method is called before the module activation, and may prevent it by returning false. + * + * @param ConnectionInterface $con + * + * @return bool true to continue module activation, false to prevent it. + */ public function preActivation(ConnectionInterface $con = null) { + // Override this method to do something useful. + return true; } + /** + * This method is called just after the module was successfully activated. + * + * @param ConnectionInterface $con + */ public function postActivation(ConnectionInterface $con = null) { - // Implement this method to do something useful. + // Override this method to do something useful. } + /** + * This method is called before the module de-activation, and may prevent it by returning false. + * + * @param ConnectionInterface $con + * @return bool true to continue module de-activation, false to prevent it. + */ public function preDeactivation(ConnectionInterface $con = null) { + // Override this method to do something useful. + return true; } + public function postDeactivation(ConnectionInterface $con = null) { - // Implement this method to do something useful. + // Override this method to do something useful. } + /** + * This method is called just before the deletion of the module, giving the module an opportunity + * to delete its data. + * + * @param ConnectionInterface $con + * @param bool $deleteModuleData if true, the module should remove all its data from the system. + */ public function destroy(ConnectionInterface $con = null, $deleteModuleData = false) { - // Implement this method to do something useful. + // Override this method to do something useful. } } diff --git a/templates/frontOffice/default/order-invoice.html b/templates/frontOffice/default/order-invoice.html index afe865d7f..500b14f29 100644 --- a/templates/frontOffice/default/order-invoice.html +++ b/templates/frontOffice/default/order-invoice.html @@ -173,8 +173,9 @@ {/form} + {form name="thelia.order.payment"} - {assign var="isPost" value="{$smarty.post|count}"} + {assign var="isPost" value=$smarty.post|count}
- {/form} - - - - - {/block}