Как связать вьюшку Opencart с контроллером через ajax
На чём делал: ocstore 2.3
Задача: в списке товаров сделать при выборе другой опции перерасчёт цены продукта
Во вьюшке catalogviewthemedefaulttemplateproductcategory.tpl разместил код для вызова метода контроллера через ajax
<script type="text/javascript"> function refreshPrice(value,product_id) { $.ajax({ url:'index.php?route=product/category/refreshPrice', dataType:'json', type:'post', data:{'product_option_value_id':value}, success: function (json) { let butprice=Number.parseInt(json.baseprice); if (json.price_prefix == '+') butprice = (Number.parseInt(json.price) + butprice)*$('#select-sht-'+product_id).val(); else butprice = (butprice-Number.parseInt(json.price))*$('#select-sht-'+product_id).val(); $('#button-'+product_id).text(butprice); } }); } </script>
В контроллере catalogcontrollerproductcategory.php расписал новый метод
public function refreshPrice() { $this->load->model('catalog/category'); $result=$this->model_catalog_category->getPriceAddition($_POST['product_option_value_id']); $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($result)); }
Здесь подгружается его модель для получения опциальной добавочной цены и ценового префикса. Потом полученные данные запаковываются в json и отдаются обратно во вьюшку.
Код вызываемого метода модели catalogmodelcatalogcategory.php
public function getPriceAddition($product_option_value_id) { $sql = sprintf("SELECT opt.price,opt.price_prefix,pr.price as baseprice FROM `%sproduct_option_value` opt LEFT JOIN `%sproduct` pr ON (pr.product_id=opt.product_id) WHERE opt.product_option_value_id=%s",DB_PREFIX,DB_PREFIX,$product_option_value_id/*,$product_id*/); $result = $this->db->query($sql); return array('price'=>$result->row['price'], 'price_prefix'=>$result->row['price_prefix'], 'baseprice'=>$result->row['baseprice'] ); }
Дополнительно
Способ отправки данных формы через ajax jquery
$.ajax({ url: 'index.php?route=module/preorder', type: 'post', dataType: 'json', data: $("#form-preorder").serialize(),
url: '<?php echo $catalog; ?>index.php?route=api/cart/add&token=' + token + '&store_id=' + $('select[name='store_id'] option:selected').val(), type: 'post', data: $('#cart input[name^='product'][type='text'], #cart input[name^='product'][type='hidden'], #cart input[name^='product'][type='radio']:checked, #cart input[name^='product'][type='checkbox']:checked, #cart select[name^='product'], #cart textarea[name^='product']'), dataType: 'json', crossDomain: true, //подразумевает получение данных с сайта site2.ru для сайта site1.ru.
Ещё вот так
data: 'comment=' + encodeURIComponent($('#tab-history textarea[name='comment']').val()),