diff --git a/asset/css/front.css b/asset/css/front.css index 4c8e6d4..f89e43b 100644 --- a/asset/css/front.css +++ b/asset/css/front.css @@ -1,7 +1,7 @@ ul.progtrckr { margin: 0; padding: 0; - list-style-type none; + list-style-type: none; } ul.progtrckr li { @@ -70,4 +70,18 @@ ul.progtrckr li.progtrckr-todo:before { #pi-order .finishBox .finishLogo { padding-bottom: 20px; +} + +.cart-product .panel-body { + padding: 5px; +} + +.cart-product-list { + margin-bottom: 10px; +} + +.cart-product-single { + border-bottom: 1px solid #ddd; + padding-bottom: 10px; + margin-bottom: 10px; } \ No newline at end of file diff --git a/config/module.php b/config/module.php index 1a4056b..574e6a6 100644 --- a/config/module.php +++ b/config/module.php @@ -15,7 +15,7 @@ 'meta' => array( 'title' => _a('Orders'), 'description' => _a('Manage order process and payment'), - 'version' => '1.7.0', + 'version' => '1.7.1', 'license' => 'New BSD', 'logo' => 'image/logo.png', 'readme' => 'docs/readme.txt', diff --git a/sql/mysql.sql b/sql/mysql.sql index 27d71fa..18d48cb 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -156,6 +156,8 @@ CREATE TABLE `{customer}` ( `time_create` INT(10) UNSIGNED NOT NULL DEFAULT '0', `time_update` INT(10) UNSIGNED NOT NULL DEFAULT '0', `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', + `delivery` INT(10) UNSIGNED NOT NULL DEFAULT '0', + `location` INT(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `uid` (`uid`), KEY `status` (`status`), diff --git a/src/Api/Customer.php b/src/Api/Customer.php index 6ec72b0..c5812c4 100644 --- a/src/Api/Customer.php +++ b/src/Api/Customer.php @@ -29,7 +29,8 @@ public function addCustomer($values) { // Set values $values['time_update'] = $values['time_create']; - $values['state'] = 1; + $values['status'] = 1; + unset($values['user_note']); // Save customer info $customer = Pi::model('customer', $this->getModule())->createRow(); $customer->assign($values); @@ -44,7 +45,8 @@ public function updateCustomer($values) { // Set values $values['time_update'] = time(); - $values['state'] = 1; + $values['status'] = 1; + unset($values['user_note']); // Find customer info $customer = Pi::model('customer', $this->getModule())->find($values['customer_id']); // Check customer diff --git a/src/Api/Order.php b/src/Api/Order.php index a61a2d9..6340f1b 100644 --- a/src/Api/Order.php +++ b/src/Api/Order.php @@ -103,7 +103,7 @@ public function orderStatus($status) break; case '7': - $return['orderClass'] = 'btn-inverse'; + $return['orderClass'] = 'btn-primary'; $return['orderTitle'] = __('Orders finished'); break; } diff --git a/src/Controller/Front/CheckoutController.php b/src/Controller/Front/CheckoutController.php index c4da5c2..3c01e4f 100644 --- a/src/Controller/Front/CheckoutController.php +++ b/src/Controller/Front/CheckoutController.php @@ -17,6 +17,8 @@ use Pi\Mvc\Controller\ActionController; use Module\Order\Form\OrderForm; use Module\Order\Form\OrderFilter; +use Module\Order\Form\OrderSimpleForm; +use Module\Order\Form\OrderSimpleFilter; use Zend\Json\Json; class CheckoutController extends IndexController @@ -293,13 +295,15 @@ public function indexAction() // Set new form $user = Pi::api('user', 'order')->getUserInformation(); $user['customer_id'] = 0; + $forms = array(); $forms['new'] = new OrderForm('order', $option); $forms['new']->setData($user); // Set customer forms if (!empty($customers)) { foreach ($customers as $customer) { $key = sprintf('customer-%s', $customer['id']); - $forms[$key] = new OrderForm('order', $option); + $option['location'] = $customer['location']; + $forms[$key] = new OrderSimpleForm('order', $option); $forms[$key]->setData($data); } } @@ -308,13 +312,17 @@ public function indexAction() // Set new form $user = Pi::api('user', 'order')->getUserInformation(); $user['customer_id'] = 0; + $forms = array(); $forms['new'] = new OrderForm('order', $option); $forms['new']->setData($user); // Set customer forms if (!empty($customers)) { foreach ($customers as $customer) { $key = sprintf('customer-%s', $customer['id']); - $forms[$key] = new OrderForm('order', $option); + $option['location'] = $customer['location']; + unset($customer['delivery']); + unset($customer['user_note']); + $forms[$key] = new OrderSimpleForm('order', $option); $forms[$key]->setData($customer); } } @@ -324,6 +332,7 @@ public function indexAction() $price['discount'] = 0; $price['shipping'] = 0; $price['packing'] = 0; + $price['setup'] = 0; $price['vat'] = 0; $price['total'] = 0; foreach ($cart['product'] as $product) { @@ -357,6 +366,11 @@ public function indexAction() $plan = Pi::api('installment', 'order')->setPriceForInvoice($price['total'], $cart['plan'], $user); $this->view()->assign('plan', $plan); } + // Set products + foreach ($cart['product'] as $product) { + $cart['product'][$product['product']]['details'] = Pi::api('order', $cart['module_name'])->getProductDetails($product['product']); + $cart['product'][$product['product']]['product_price_view'] = Pi::api('api', 'order')->viewPrice($product['product_price']); + } // Set view $this->view()->setTemplate('checkout'); $this->view()->assign('forms', $forms); diff --git a/src/Form/Element/Delivery.php b/src/Form/Element/Delivery.php new file mode 100644 index 0000000..d8e4543 --- /dev/null +++ b/src/Form/Element/Delivery.php @@ -0,0 +1,48 @@ + + */ + +namespace Module\Order\Form\Element; + +use Pi; +use Zend\Form\Element\Select; + +class Delivery extends Select +{ + /** + * @return array + */ + public function getValueOptions() + { + if (empty($this->valueOptions)) { + $list = array(); + $where = array('location' => $this->options['location']); + $select = Pi::model('location_delivery', 'order')->select()->where($where); + $rowset = Pi::model('location_delivery', 'order')->selectWith($select); + foreach ($rowset as $row) { + $delivery = Pi::model('delivery', 'order')->find($row->delivery)->toArray(); + if ($delivery['status']) { + $list[$delivery['id']] = sprintf('%s - %s : %s - %s : %s %s' , + $delivery['title'], + __('Price'), + Pi::api('api', 'order')->viewPrice($row->price), + __('Time'), + _number($row->delivery_time), + __('Days') + ); + } + } + $this->valueOptions = $list; + } + return $this->valueOptions; + } +} \ No newline at end of file diff --git a/src/Form/OrderForm.php b/src/Form/OrderForm.php index 60b2da1..280091c 100644 --- a/src/Form/OrderForm.php +++ b/src/Form/OrderForm.php @@ -305,7 +305,7 @@ public function init() ), 'attributes' => array( 'id' => 'select-delivery', - 'size' => 5, + 'size' => 3, 'required' => true, ) )); @@ -332,7 +332,7 @@ public function init() ), 'attributes' => array( 'id' => 'select-payment', - 'size' => 5, + 'size' => 3, 'required' => true, ) )); @@ -369,7 +369,6 @@ public function init() break; case 'service': - $gatewayList = Pi::api('gateway', 'order')->getActiveGatewayName(); if (count($gatewayList) == 1) { $gatewayList = array_keys($gatewayList); // gateway @@ -466,7 +465,7 @@ public function init() 'type' => 'submit', 'attributes' => array( 'value' => $title, - 'class' => 'btn btn-primary', + 'class' => 'btn btn-success', ) )); } diff --git a/src/Form/OrderSimpleFilter.php b/src/Form/OrderSimpleFilter.php new file mode 100644 index 0000000..68d04d5 --- /dev/null +++ b/src/Form/OrderSimpleFilter.php @@ -0,0 +1,336 @@ + + */ + +namespace Module\Order\Form; + +use Pi; +use Zend\InputFilter\InputFilter; +use Module\System\Validator\UserEmail as UserEmailValidator; + +class OrderSimpleFilter extends InputFilter +{ + public function __construct($option = array()) + { + $config = Pi::service('registry')->config->read('order', 'order'); + // customer_id + $this->add(array( + 'name' => 'customer_id', + 'required' => false, + )); + // name + if ($config['order_name']) { + // first_name + $this->add(array( + 'name' => 'first_name', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + // last_name + $this->add(array( + 'name' => 'last_name', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // id_number + if ($config['order_idnumber']) { + $this->add(array( + 'name' => 'id_number', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // email + if ($config['order_email']) { + $this->add(array( + 'name' => 'email', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + 'validators' => array( + array( + 'name' => 'EmailAddress', + 'options' => array( + 'useMxCheck' => false, + 'useDeepMxCheck' => false, + 'useDomainCheck' => false, + ), + ), + new UserEmailValidator(array( + 'blacklist' => false, + 'check_duplication' => false, + )), + ), + )); + } + // phone + if ($config['order_phone']) { + $this->add(array( + 'name' => 'phone', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // mobile + if ($config['order_mobile']) { + $this->add(array( + 'name' => 'mobile', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // company + if ($config['order_company']) { + // company + $this->add(array( + 'name' => 'company', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // company extra + if ($config['order_company_extra']) { + // company_id + $this->add(array( + 'name' => 'company_id', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + // company_vat + $this->add(array( + 'name' => 'company_vat', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // address + if ($config['order_address']) { + $this->add(array( + 'name' => 'address1', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // address 2 + if ($config['order_address2']) { + $this->add(array( + 'name' => 'address2', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // country + if ($config['order_country']) { + $this->add(array( + 'name' => 'country', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // state + if ($config['order_state']) { + $this->add(array( + 'name' => 'state', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // city + if ($config['order_city']) { + $this->add(array( + 'name' => 'city', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // zip_code + if ($config['order_zip']) { + $this->add(array( + 'name' => 'zip_code', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // packing + if ($config['order_packing']) { + $this->add(array( + 'name' => 'packing', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // Check type_commodity + switch ($option['type_commodity']) { + case 'product': + if ($config['order_location_delivery']) { + // location + $this->add(array( + 'name' => 'location', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + // delivery + $this->add(array( + 'name' => 'delivery', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + // gateway + $this->add(array( + 'name' => 'gateway', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } else { + // gateway + $this->add(array( + 'name' => 'gateway', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + break; + + case 'service': + // gateway + $this->add(array( + 'name' => 'gateway', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + break; + } + // user_note + if ($config['order_usernote']) { + $this->add(array( + 'name' => 'user_note', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // promo_value + if ($config['order_promo']) { + $this->add(array( + 'name' => 'promo_value', + 'required' => false, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + )); + } + // order_term + if ($config['order_term']) { + $this->add(array( + 'name' => 'order_term', + 'required' => true, + 'filters' => array( + array( + 'name' => 'StringTrim', + ), + ), + 'validators' => array( + new \Module\Order\Validator\Term, + ), + )); + } + } +} \ No newline at end of file diff --git a/src/Form/OrderSimpleForm.php b/src/Form/OrderSimpleForm.php new file mode 100644 index 0000000..3459e59 --- /dev/null +++ b/src/Form/OrderSimpleForm.php @@ -0,0 +1,422 @@ + + */ + +namespace Module\Order\Form; + +use Pi; +use Pi\Form\Form as BaseForm; + +class OrderSimpleForm extends BaseForm +{ + public function __construct($name = null, $option = array()) + { + $this->option = $option; + $this->config = Pi::service('registry')->config->read('order', 'order'); + parent::__construct($name); + } + + public function getInputFilter() + { + if (!$this->filter) { + $this->filter = new OrderSimpleFilter($this->option); + } + return $this->filter; + } + + public function init() + { + // customer_id + $this->add(array( + 'name' => 'customer_id', + 'attributes' => array( + 'type' => 'hidden', + ), + )); + // name + if ($this->config['order_name']) { + // first_name + $this->add(array( + 'name' => 'first_name', + 'options' => array( + 'label' => __('First name'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + // last_name + $this->add(array( + 'name' => 'last_name', + 'options' => array( + 'label' => __('Last name'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // id_number + if ($this->config['order_idnumber']) { + $this->add(array( + 'name' => 'id_number', + 'options' => array( + 'label' => __('ID number'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // email + if ($this->config['order_email']) { + $this->add(array( + 'name' => 'email', + 'options' => array( + 'label' => __('Email'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // phone + if ($this->config['order_phone']) { + $this->add(array( + 'name' => 'phone', + 'options' => array( + 'label' => __('Phone'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // mobile + if ($this->config['order_mobile']) { + $this->add(array( + 'name' => 'mobile', + 'options' => array( + 'label' => __('Mobile'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // company + if ($this->config['order_company']) { + // company + $this->add(array( + 'name' => 'company', + 'options' => array( + 'label' => __('Company'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // company extra + if ($this->config['order_company_extra']) { + // company_id + $this->add(array( + 'name' => 'company_id', + 'options' => array( + 'label' => __('Company id'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + // company_vat + $this->add(array( + 'name' => 'company_vat', + 'options' => array( + 'label' => __('Company vat'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // address + if ($this->config['order_address']) { + $this->add(array( + 'name' => 'address1', + 'options' => array( + 'label' => __('Delivery address'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // address 2 + if ($this->config['order_address2']) { + $this->add(array( + 'name' => 'address2', + 'options' => array( + 'label' => __('Address 2'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // country + if ($this->config['order_country']) { + $this->add(array( + 'name' => 'country', + 'options' => array( + 'label' => __('Country'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // state + if ($this->config['order_state']) { + $this->add(array( + 'name' => 'state', + 'options' => array( + 'label' => __('State'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // city + if ($this->config['order_city']) { + $this->add(array( + 'name' => 'city', + 'options' => array( + 'label' => __('City'), + ), + 'attributes' => array( + 'type' => 'hidden', + ) + )); + } + // zip_code + if ($this->config['order_zip']) { + $this->add(array( + 'name' => 'zip_code', + 'options' => array( + 'label' => __('Zip code'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + } + // packing + if ($this->config['order_packing']) { + $this->add(array( + 'name' => 'packing', + 'type' => 'checkbox', + 'options' => array( + 'label' => __('Packing'), + ), + 'attributes' => array( + 'description' => '', + ) + )); + } + // Check type_commodity + $gatewayList = Pi::api('gateway', 'order')->getActiveGatewayName(); + switch ($this->option['type_commodity']) { + case 'product': + if ($this->config['order_location_delivery']) { + // location + $this->add(array( + 'name' => 'location', + 'options' => array( + 'label' => __('Location'), + ), + 'attributes' => array( + 'type' => 'hidden', + 'required' => true, + ) + )); + // delivery + $this->add(array( + 'name' => 'delivery', + 'type' => 'Module\Order\Form\Element\Delivery', + 'options' => array( + 'label' => __('Delivery methods'), + 'value_options' => array(), + 'location' => $this->option['location'], + ), + 'attributes' => array( + 'id' => 'customer-select-delivery', + 'size' => 3, + 'required' => true, + ) + )); + // check gateway + if (count($gatewayList) == 1) { + $gatewayList = array_keys($gatewayList); + // gateway + $this->add(array( + 'name' => 'gateway', + 'attributes' => array( + 'id' => 'customer-select-payment', + 'type' => 'hidden', + 'value' => $gatewayList['0'], + ), + )); + } else { + // gateway + $this->add(array( + 'name' => 'gateway', + 'type' => 'select', + 'options' => array( + 'label' => __('Adapter'), + 'value_options' => array(), + ), + 'attributes' => array( + 'id' => 'customer-select-payment', + 'size' => 3, + 'required' => true, + ) + )); + } + } else { + if (count($gatewayList) == 1) { + $gatewayList = array_keys($gatewayList); + // gateway + $this->add(array( + 'name' => 'gateway', + 'attributes' => array( + 'id' => 'customer-select-payment', + 'type' => 'hidden', + 'value' => $gatewayList['0'], + ), + )); + } else { + // gateway + $this->add(array( + 'name' => 'gateway', + 'type' => 'select', + 'options' => array( + 'label' => __('Adapter'), + 'value_options' => $gatewayList, + ), + 'attributes' => array( + 'id' => 'customer-select-payment', + 'size' => 1, + 'required' => true, + ) + )); + } + } + break; + + case 'service': + if (count($gatewayList) == 1) { + $gatewayList = array_keys($gatewayList); + // gateway + $this->add(array( + 'name' => 'gateway', + 'attributes' => array( + 'type' => 'hidden', + 'value' => $gatewayList['0'], + ), + )); + } else { + // gateway + $this->add(array( + 'name' => 'gateway', + 'type' => 'select', + 'options' => array( + 'label' => __('Adapter'), + 'value_options' => $gatewayList, + ), + 'attributes' => array( + 'id' => 'customer-select-payment', + 'size' => 1, + 'required' => true, + ) + )); + } + break; + } + // user_note + if ($this->config['order_usernote']) { + $this->add(array( + 'name' => 'user_note', + 'options' => array( + 'label' => __('User note'), + ), + 'attributes' => array( + 'type' => 'textarea', + 'rows' => '5', + 'cols' => '40', + 'description' => '', + ) + )); + } + // promo_value + if ($this->config['order_promo']) { + $this->add(array( + 'name' => 'promo_value', + 'options' => array( + 'label' => __('Promo'), + ), + 'attributes' => array( + 'type' => 'text', + 'description' => '', + ) + )); + } + // order_term + if ($this->config['order_term'] && !empty($this->config['order_termurl'])) { + $term = sprintf('%s', $this->config['order_termurl'], __('Terms & Conditions')); + $term = sprintf(__('Accept %s'), $term); + $this->add(array( + 'name' => 'order_term', + 'type' => 'checkbox', + 'options' => array( + 'label' => '', + ), + 'attributes' => array( + 'description' => $term, + 'required' => true, + ) + )); + } + // Save + if ($this->config['order_payment'] == 'payment') { + $title = __('Pay'); + } else { + $title = __('Save order'); + } + $this->add(array( + 'name' => 'submit', + 'type' => 'submit', + 'attributes' => array( + 'value' => $title, + 'class' => 'btn btn-success', + ) + )); + } +} \ No newline at end of file diff --git a/src/Installer/Action/Update.php b/src/Installer/Action/Update.php index c5b3c7c..8e0251e 100644 --- a/src/Installer/Action/Update.php +++ b/src/Installer/Action/Update.php @@ -271,6 +271,33 @@ public function updateSchema(Event $e) } } + if (version_compare($moduleVersion, '1.7.1', '<')) { + // Alter table field add + $sql = sprintf("ALTER TABLE %s ADD `delivery` INT(10) UNSIGNED NOT NULL DEFAULT '0'", $customerTable); + try { + $customerAdapter->query($sql, 'execute'); + } catch (\Exception $exception) { + $this->setResult('db', array( + 'status' => false, + 'message' => 'Table alter query failed: ' + . $exception->getMessage(), + )); + return false; + } + // Alter table field add + $sql = sprintf("ALTER TABLE %s ADD `location` INT(10) UNSIGNED NOT NULL DEFAULT '0'", $customerTable); + try { + $customerAdapter->query($sql, 'execute'); + } catch (\Exception $exception) { + $this->setResult('db', array( + 'status' => false, + 'message' => 'Table alter query failed: ' + . $exception->getMessage(), + )); + return false; + } + } + return true; } } \ No newline at end of file diff --git a/src/Model/Customer.php b/src/Model/Customer.php index 3540a2e..db3cf93 100644 --- a/src/Model/Customer.php +++ b/src/Model/Customer.php @@ -24,6 +24,6 @@ class Customer extends Model 'id', 'uid', 'ip', 'id_number', 'first_name', 'last_name', 'email', 'phone', 'mobile', 'address1', 'address2', 'country', 'state', 'city', 'zip_code', 'company', 'company_id', 'company_vat', 'user_note', - 'time_create', 'time_update', 'status', 'address_type' + 'time_create', 'time_update', 'status', 'address_type', 'delivery', 'location' ); } \ No newline at end of file diff --git a/template/front/checkout.phtml b/template/front/checkout.phtml index f9be140..373023a 100644 --- a/template/front/checkout.phtml +++ b/template/front/checkout.phtml @@ -85,7 +85,152 @@ $script = sprintf( ); $this->footScript()->appendScript($script); ?> -
+
+ + + + +
+
+ +
+ + + +
+
+
+ +
+ + + + + + + + + + +
+ + escape($customer['first_name']); ?> + escape($customer['last_name']); ?> + ( escape($customer['email']); ?> ) + + + +
+

: escape($customer['state']); ?>

+

: escape($customer['city']); ?>

+
+

: escape($customer['address1']); ?>

+

: escape($customer['zip_code']); ?>

+
+

: escape($customer['phone']); ?>

+

: escape($customer['mobile']); ?>

+
+
+ + + +
+
+
+ form($forms['new']); ?> +
+
+
+ + form($forms['new']); ?> + +
+
+
+
+

+
+
+
+ +
+
+
+ + escape($product['details']['title']); ?> + +
+
+ + + +
+
+
+ : escape($product['product_price_view']); ?> +
+
+
+
+ +
+

+ : + viewPrice($this->escape($price['product'])); ?> +

+

+ : + viewPrice($this->escape($price['discount'])); ?> +

+

+ : + viewPrice($this->escape($price['shipping'])); ?> +

+

+ : + viewPrice($this->escape($price['vat'])); ?> +

+

+ : + + viewPrice($this->escape($price['total'])); ?> + +

+
+
+
+
+
+ +
- \ No newline at end of file + + */ ?> \ No newline at end of file