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



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

    В документации ничего не нашла по лимиту выборки товаров для 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>
    


Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.