Хочу поделится. сделал для себя.
Работает, но еще требует некоторого "причесывания".
п.0.
Что имеем: п.0.1. В
/templates/default/category/category_default.php генерируется форма для каждого товара:
<form name = "product" method = "post" action = "<?php print $this->action?>" >
<input type = "text" name = "quantity" value="1" />
<input type = "submit" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart')"/>
<input type="hidden" name="to" id='to' value="cart" />
<input type = "hidden" name = "product_id" value = "<?php print $product->product_id?>" />
<input type = "hidden" name = "category_id" value = "<?php print $this->category->category_id?>" />
</form>
п.0.2 В
/controllers/category.php в
function view() строка:
$view->assign('action', SEFLink('index.php?option=com_jshopping&controller=cart&task=add'));
то что делать форме когда нажат submit.
п.1.1
Сам js выглядит так:<script>jQuery(document).ready(function(){
jQuery('form').submit(function() { //реагируем на submit
if(jQuery(this).data('formstatus')!== 'submitting'){ // проверяем статус, чтобы избежать множественной отправки формы
var str = jQuery(this).serialize(); //собираем данные из input'ов в строку
jQuery(this).data('formstatus','submitting');
jQuery.ajax({
type: "POST",
url: "<?php print $this->action?>",
data: str,
datatype:'json',
//beforeSend: function(x){jQuery('#ajax-loader').css('visibility','visible');}, необязательная строка. показываем лоадер пользователю
success: function(data){ //принимаем информацию (см. п. 1.2.1 и 1.2.2 (echo json_encode(...)) )
switch(data.status){
case 0://если статус 0 - значит была ошибка
alert(data.msg); //выводим алерт, но можно использовать prompt (всплывающее окно, см ниже)
break;
case 1:
jQuery('#ajax-loader').css('visibility','hidden');
jQuery("#jshop_module_cart").fadeOut("fast",function(){
jQuery("#jshop_module_cart .empty").hide(); /
jQuery('#jshop_module_cart .corzina').css('display','inline');
jQuery("#jshop_module_cart .count").empty();
jQuery("#jshop_module_cart .count").append(data.count_product + ' на сумму ' + data.price ); //выгружаем данные от сервера в элемент с классом count и родительским элементом с id jshop_module_cart
});
jQuery("#jshop_module_cart").fadeIn();
jQuery.prompt('Товар добавлен в корзину', //всплывающее окно (см. п.3)
{
buttons: { "Продолжить": 1, "В корзину": 2 },
timeout: 3000,
submit:function(v,m,f){
if(v==1) jQuery.prompt.close()
else if(v=2)
window.location.href = "<?php print SEFLink('index.php?option=com_jshopping&controller=cart&task=view', 1)?>";
}
});
break;
}
},
error: function(data) {
alert("Сервер не отвечает");
}
});
jQuery(this).data('formstatus','idle');
}
return false;
});
});
</script>
п.1.2
Серверная сторона запроса п.1.2.1 в
/controllers/cart.php в
function add() после 43 строки добавляем:
if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
header("Content-Type: json/html; charset=utf-8");
$msg_txt= array( 'status'=>1, 'count_product'=>$cart->count_product, 'price'=>formatprice($cart->getSum(0,1)) );
echo json_encode($msg_txt);
die();
}
проверяем если это AJAX запрос, то отдаем JS скрипту данные
п.1.2.2 в
/models/cart.php в
function add($product_id, $quantity, $attr_id, $freeattributes) после 498 строки (начинается с JError:raiseWarning) добавляем:
if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
header("Content-Type: json/html; charset=utf-8");
$status=0;
$msg = "В корзине находится максимально доступное количество товара";
echo json_encode(array("status"=>$status, "msg"=>$msg));
die();
}
и еще раз добавляем там же в районе 534 строки ( после строки JError:raiseWarning)
п.2
Куда будем выводить?/modules/mod_jshopping_cart/tmpl/default.phpЗдесь верстаем нашу мини корзину, какой хотим ее видеть. И под шаблон уже правим JS (п.1.1)
Я сделал так:
<h3>Корзина:</h3>
<div id = "jshop_module_cart" class = "vmCartModule">
<span class="empty" <?php if ($cart->count_product>0){ ?> style="display:none;"<?php }?>>Корзина пуста</span>
<div class="corzina" <?php if ($cart->count_product==0){ ?> style="display:none;"<?php }?>>
<span class="count"><?php print $cart->count_product?> на сумму <?php print formatprice($cart->getSum(0,1))?></span>
<span><a href = "<?php print SEFLink('index.php?option=com_jshopping&controller=cart&task=view', 1)?>"><?php print "Перейти"?></a></span>
</div>
</div>
п.3
Скрипт я разместил прямо в
/templates/default/category/category_default.phpДля всплывающего окна с информацией "Товар добавлен", использовал
Impromptuподключается так:
<script src="http://www.trentrichardson.com/Impromptu/scripts/jquery-impromptu.3.1.min.js" type="text/javascript"></script>
css окна настроил под себя. На сайте есть информация.
С отключенным JS корзина работает, как обычно. Т.е. здесь добавлен только JS скрипт, который перехватывает сабмит, берет данные из формы, кидает их серверу, php скрипты jshopping'a отрабатывают свою часть и посылают информацию о количестве товара и его суммарной стоимости (можно получить и другие данные) обратно js скрипту, который выводит это в мини корзину без обновления страницы.
Вроде бы ничего не забыл. Рад любой помощи в оптимизации и "доведения до ума"