maeln0r

ajax корзина virtuemart

Недавно понадобилось сделать дополнительный функционал для мини корзины товаров в virtuemart. Я использовал jomla 1.5 + vm 1.9, но не думаю, что в более поздних версиях что то будет сильно отличаться.
Добавленный функционал корзины: Миниатюры товаров + ajax удаление товаров из корзины. Код и пояснения под катом.

Собственно пост:
1) Сделаем отображение миниатюр товара в модуле корзины.

Идем по адресу site_dir/administrator/components/com_virtuemart/html/shop.basket_short.php и ищем такой код:

$minicart[$ci]['url'] = $url;
$minicart[$ci]['product_name'] = shopMakeHtmlSafe($ps_product->get_field($_SESSION['cart'][$i]["product_id"], "product_name"));
$minicart[$ci]['quantity'] = $cart[$i]["quantity"];
$minicart[$ci]['price'] = $CURRENCY_DISPLAY->getFullValue( $subtotal );
$minicart[$ci]['attributes'] = $html;

После него следует добавить строчку, которая будет вытягивать наши миниатюры:

$minicart[$ci]['image'] = shopMakeHtmlSafe($ps_product->get_field($_SESSION['cart'][$i]["product_id"], "product_thumb_image"));

И, если там таковая отсутствует, строчку с id продукта:

$minicart[$ci]['product_id'] = shopMakeHtmlSafe($ps_product->get_field($_SESSION['cart'][$i]["product_id"], "product_id"));

Теперь добавим изображения в шаблон корзины

(site_dir/public_html/components/com_virtuemart/themes/<span style="color: #ff0000;">название_вашей_темы</span>/templates/common/minicart.tpl.php)
где нибудь после
<div class="minicart_item">

<div style="text-align: center;">
    <img class="cart_image" src="/components/com_virtuemart/shop_image/product/<?php echo $cart['image'] ?>" /></div>

Никаких css стилей в данном примере указывать не буду, если возникнут вопросы, задавайте в комментариях.

2) Сделаем кнопку ajax удаления товаров

Тут все несколько легче. Первым делом добавим кнопку, с вызовом нужной нам функции в шаблон. Приведу полный код вывода товара из моего шаблона.

<div class="minicart_item"><input class="minicart_del_img" style="float: right;" alt="Удалить товар" src="ВАША КАРТИНКА" type="image" />)"/>
<div style="text-align: center;"><img class="cart_image" src="/components/com_virtuemart/shop_image/product/<?php echo $cart['image'] ?>" /></div>
<div style="clear: both;"></div>
<div style="text-align: center;"><a href="<?php echo $cart['url'] ?>"><!--?php echo mb_substr($cart['product_name'], 0, 30); if (mb_strlen($cart['product_name']) > 20)<br ?--> echo '...';
?></a>&nbs p; x &nbs p; <!--?php echo $cart['quantity'] ?--> //Уберите пробелы в &nbs p;</div>
<div style="clear: both;"></div>
<div class="cart_price" style="text-align: center;"></div>
 

</div>

А теперь, самое главное, где нибудь вверху данной страницы вставляем javascript с описанием функции productDelete(). Код с минимумом описания. Если вы его не понимаете, то просто вставьте как есть.

<script type="text/javascript">
    function updateMiniCarts() { //Обновляем корзину
        var callbackCart = function(responseText) {
            carts = $$( '.vmCartModule' );
            if( carts ) {
                try { 
                    for (var i=0; i<carts.length; i++){
                        carts[i].innerHTML = responseText;
                        color = carts[i].getStyle( 'color' );
                        bgcolor = carts[i].getStyle( 'background-color' );//Визуализация
                        var fxc = new Fx.Style(carts[i], 'color', {duration: 2000});//Визуализация
                        var fxbgc = new Fx.Style(carts[i], 'background-color', {duration: 1000});//Визуализация
                        fxc.start( '#ebebeb', color );//Визуализация
                        fxbgc.start( '#ebebeb', '#ffffff' );//Визуализация
                        if( parent ) {
                            setTimeout( "carts[" + i + "].setStyle( 'background-color', 'transparent' )", 1000 );//Визуализация
                        }
                    }
                } catch(e) {}
            }
        }
        option = { method: 'post', onComplete: callbackCart, data: { only_page:1,page: "shop.basket_short", option: "com_virtuemart" } }
        new Ajax( live_site + '/index2.php', option).request();
    }
    function productDelete(product_id){
        var callback = function(responseText){
            updateMiniCarts();// обновляем корзину по callback
        }
        var opt = {
            method: 'post', 
            onComplete: callback,
            data: { //Все это стандартные переменные с virtuemart, не трогайте их, правда.
                only_page:1,
                page: "shop.basket_short",
                option: "com_virtuemart",
                func: "cartDelete",
                product_id: product_id
            }
        }
        new Ajax( '/index2.php', opt ).request();
    } 

</script>

Ну, вот вроде и все, что я хотел рассказать. Дерзайте. По всем вопросам прошу в комментарии.


Последняя редакция 25 января, 2023 в 07:01