Последние темы


Ограничение на товар в корзине

  • Доброго дня.

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

               <button type="submit" onclick="SHKtoCartCallback($('#pr[[+id]]').hide(300));" class="shk-but">+</button></td>
    ****где #pr[[+id]] - это id обертки чанка с формой.
    

    Не срабатывает.

    Может это реализуется доп полем? Мне нужно не товар продать, а услугу. Т.е. в неограниченном количестве для всех, но в лимитированном для 1 карточки заказа.
    Прошу подсказки от знатоков, как скрывать уже добавленное.

    Перекопала гугл, но нахожу старые темы форума, на которых закрыт сам вопрос, хоть задавался он и не однократно.
    Например
    http://modx-shopkeeper.ru/forum/viewtopic.php?id=1947
    http://modx-shopkeeper.ru/forum/viewtopic.php?id=2606
    http://modx-shopkeeper.ru/forum/viewtopic.php?id=2629
    Есть такая тема http://modx-shopkeeper.ru/forum/viewtopic.php?pid=4986#p4986 пятилетней давности.

    1. Написать плагин на событие "OnSHKaddProduct" чтобы ограничить добавление товара в корзину.
    2. Используя JavaScript API, проверять нахождение товара в корзине по ID и скрывать кнопку "В корзину" на странице.
  • @Andchir сказал Ограничение на товар в корзине:

    OnSHKaddProduct

    Вот второй способ кручу уже неделю - не выходит. Может я туго соображаю, но упорно не могу сказать на js, что "если id этого блока равно части имени id в строке каталога - его нужно скрыть". Мозг мой взорвался, поняла - что так ничего не добьюсь.

    По первому вроде кажется проще, но снова вопрос по логике:

    <div class="[[myplagin]]">Я есть один товар в списке</div>
    
    1. Слушаем событие
    2. Определяем id того, кто полетел в корзину (тут вопрос, по какому именно принципу мы его находим, не сориентируте?)
    3. Проверяем тв-поле полученного документа, если условие верно передаем в чанк запись, например имя класса.
  • Пример для страницы товара, кнопку которого надо скрыть, если он уже в корзине:

    var SHKloadCartCallback = function(){
        
        var productId = [[*id]];
        
        if( SHK.data.ids.indexOf(productId) > -1 ){
            
            document.getElementById('submitButton').style.display = 'none';
            
        }
        
    };
    

    submitButton - ID элемента кнопки.

  • @Andchir Спасибо) На странице товара проще. Тут нам не нужно догадываться какая из кнопок нажата 🙂 Сложности у меня именно в категории (ну и сплю я по 3 часа уже вторую неделю).

    var productId = [[+id]];
    

    Получается мне нужно выяснить id нажатой кнопки и сравнить ее с id товаром в корзине. Именно здесь и клинит...

    <div id="[[+id]]-tovar" class="odin-iz-mnogih-na-stranice">Я один товар в списке/div>
    
    

    Корзина

    <tr class="cart-order" id="[[+id]]-tovar2">
        <td class="text-left"><strong>[[+name]]</strong> </td>
        <td class="text-right">[[+price_count_total:num_format]] р.</td>
        <td class="text-right"> <a href="[[+url_del_item]]" title="Удалить" class="shk-del">x</a>
        </td>
    </tr>
    

    Ну и собственно сравнить как-то

    var productId = $("#[[+id]]-tovar");
    var productId2 =$( "#[[+id]]-tovar2");
    var productIdPreobrazuem = productId + '2';
    if (productIdPreobrazuem == productId2) {
    бла-бла-бла
    }
    
    

    Но загвоздка конкретно в этой части:
    var productId = $("#[[+id]]-tovar");
    var productId2 =$( "#[[+id]]-tovar2");
    Если ее писать в чанке карточки в категории - да, сработает, но это куча скриптов в листе страницы.
    Если вынести в отдельный файл, то я пыталась по классу получить id, приклеить к его имени цифру 2, а потом найти готовое имя [[+id]]-tovar2... Ну и конечно ничего не добилась 🙂

    var myclass = $(".odin-iz-mnogih-na-stranice").attr('id');
    var myclass2 = '$(".' + myclass + '2' + '")';
    
  • Я дал пример. Если у вас только один товар, который можно положить в корзину один раз,
    то это

    var productId = [[*id]];
    

    не нужно. Нужно сразу прописать ID товара

    var productId = 10;
    

    А на странице каталога остается только написать селектор кнопки.

  • @Andchir Ваш скрипт работает на странице товара безупречно.
    Пытаюсь сделать как ваша собеседница в каталоге:

    <script>
    var SHKloadCartCallback = function(){
        
        var productId = [[+id]];
        
        if( SHK.data.ids.indexOf(productId) > -1 ){
            
    document.getElementById('submitButton-[[+idx]]').style.display = 'none';
            
        }
    };
    </script>
    

    Такой же счетчик

    [[+idx]]
    

    используется в чанке карточки товара для селектора кнопки.
    Выводится все правильно, для каждой позиции - свой скрипт. Но не работает. В чем может быть дело? Или оно не работает для нескольких позиций на странице?

  • Если нужно скрыть кнопку на странице со списком товаров:

    <script>
    var SHKloadCartCallback = function(){
        SHK.data.ids.forEach(function(id){
            $('input[name="shk-id"][value="' + id+ '"]').closest('form').find(':submit').hide();
        });
    }
    </script>
    

    Вместо ':submit' можно вставить другой селектор кнопки, например CSS класс.

  • @Andchir Вставил в шаблон скрипт как есть. Не работает. Не владею JS((((
    Может что-то нужно подправить?

  • Участник @kovyrzin написал

    Может что-то нужно подправить?

    Ссылку где посмотреть дадите?

  • @Andchir На локальном сервере пока

  • @Andchir На локальном сервере пока

    Вот страничка со списком товаров (сокращено) - может поможет:

    
    <head>
    <meta charset=UTF-8>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="yandex-verification" content="77bde91011a09577" />
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" href="assets/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="assets/css/slicknav.css">
    <link rel="stylesheet" href="assets/css/style.css">
    <!--[if lte IE 7]>
    	<link rel="stylesheet" href="assets/css/ie.css" type="text/css" charset="UTF-8" />	
    <![endif]-->
    <link rel="stylesheet" href="/assets/components/shopkeeper3/web/css/default/style.css" type="text/css" />
    <link rel="stylesheet" href="/assets/components/ajaxform/css/default.css" type="text/css" />
    </head>
    
    <body>
    
    ....
    
    <div id="shop-cart" data-shopcart="1" class="mini-cart-count">
        <span class="" data-toggle="dropdown" href="#"  aria-expanded="true">1</span>
    </div>
    
    .......................
    
    
    <div class="product">
        <div class="row">
           	<div class="col-xxs-12 col-xs-4 col-sm-3 col-md-2">
            		<a href="obuchenie/zanyatiya/kristally"><img src="/assets/cache_image/assets/img/crystals_120x120_5e8.jpg" alt="Image" class=""></a>
           	</div>
            <div class="shedule-price" id="shedule-price-7">
                    <span class="text-success"><ins>Запись:</ins> 
        <span class="text-danger">300 рублей</span>
                    </span>
            </div>
            <div class="shk-item" id="purchase-block-54">
                 <form action="/obuchenie/zanyatiya/kristally" method="post"> 
                     <input type="hidden" name="shk-id" value="54__record-price" />
                     <input type="hidden" name="shk-name" value="Кристаллы" />
                     <input type="hidden" name="test__54__add" value="Запись занятия" />
                     <input name="shk-count" type="hidden" value="1" />
                     <button id="addto-cart-54" type="submit" name="shk-submit" class="btn btn-default shk-but" target="_blank"  style="margin-top:10px;">Купить запись</button>
                </form>
            </div>
        </div>
    </div>
        
        
        ....................
        
    <script src="/assets/js/jquery-1.11.2.min.js"></script>
    <link href="assets/css/jquery.fancybox.min.css" rel="stylesheet">    
    <script src="assets/js/jquery.fancybox.min.js"></script>
    <script type="text/javascript">
    	$("[data-fancybox]").fancybox({
    		thumbs : {
    		showOnStart : true
    	}
    	});
    </script>
    <script>
    var SHKloadCartCallback = function(){
        SHK.data.ids.forEach(function(id){
            $('input[name="shk-id"][value="' + id+ '"]').closest('form').find(':submit').hide();
        });
    }
    </script>
    <script type="text/javascript" src="/assets/components/shopkeeper3/web/js/lang/ru.js?v=3.2.7"></script>
    <script type="text/javascript" src="/assets/components/shopkeeper3/web/js/shopkeeper.js?v=3.2.7"></script>
    	<script type="text/javascript">
            SHK.data = {"price_total":"375.00","items_total":1,"items_unique_total":1,"delivery_price":0,"delivery_name":"","ids":[54]};
            jQuery(document).ready(function(){
                SHK.init( {"prodCont":"div.shk-item","site_base_url":"\/","counterField":false,"counterFieldCart":true,"changePrice":"0","flyToCart":"image","noLoader":false,"allowFloatCount":false,"animCart":false,"goToOrderFormPage":false,"orderFormPageUrl":"\/korzina\/oformlenie-zakaza\/","debug":false} );
            });
    	</script>
    
    <script type="text/javascript" src="/assets/components/tickets/js/web/editor/jquery.markitup.js"></script>
    <script type="text/javascript" src="/assets/components/tickets/js/web/default.js"></script>
    <script type="text/javascript" src="/assets/components/ajaxform/js/default.js"></script>
    <script type="text/javascript">AjaxForm.initialize({"assetsUrl":"\/assets\/components\/ajaxform\/","actionUrl":"\/assets\/components\/ajaxform\/action.php","closeMessage":"\u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435","formSelector":"form.ajax_form","pageId":75});</script>
    </body>
    
    
  • Вашем случае будет так:

    <script>
    var SHKloadCartCallback = function(){
        SHK.data.ids.forEach(function(id){
            $('input[name="shk-id"][value="' + id+ '__record-price"]').closest('form').find(':submit').hide();
        });
    }
    </script>
    
  • @Andchir Отлично! Большое спасибо!

 

Последние комментарии

  • M

    @Andchir , спасибо. Проблема и правда была в одном из плагинов, который на другом сайте нормально работает

    Читать далее
  • Что нового в Shopkeeper 4.0.3:

    Исправлено некорректное определение языка по умолчанию В настройках в админке скрываются пароли. Добавлена возможность загружать картинки для категорий. shopkeeper.js - добавлена функция updateProductsPrice() для поддержки текстовых полей для цены. Twig-функции contentList() и includeContent() вынесены в отдельный класс. Добавлено событие "order.before_create". Сортировка всех полей типа контента перетаскиванием. Автоматическое сохранение сортировки полей при сохранении типа контента (не нужно нажимать на отдельную кнопку). В интерфейсе админа добавлено поле поиска для списка Composer-пакетов.

    Скачать можно на главной странице https://modx-shopkeeper.ru/

    Читать далее
  • Вот этот плагин:
    0_1550334109280_screenshot_022.png

    Вроде по умолчанию он выключен. Надо включить. Но плагин работает только на редактирование товаров, при удалении он делалать ничего не будет. Только что проверил кнопку, всё работает корректно, фильтры удаляются и добавляются, когда нужно. Но нужно очищать корзину после удаления товаров (возможно баг).

    Читать далее
  • J

    @Andchir Если нажимаю кнопочку "Обновить значения", то в фильтрах появляются как раз те самые удаленные значения фильтра.. Потом приходится Ручками выбирать эти удаленные значения.
    вот так выглядит Управление фильтрами когда удаляешь ручками: https://yadi.sk/i/_zw64CGkZ_sAYg
    А вот так выглядит когда просто нажимаешь "Обновить значения": https://yadi.sk/i/7WFbXC6xV5sQAw (красным выделено, то что приходится постоянно удалять

    Читать далее