[Решено] Запрет заказывать больше чем есть в наличии

Тема в разделе "OpenCart", создана пользователем skiv14, 9 янв 2016.

  1. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Это особенность вашего шаблона: он сам скрывает такие уведомления без необходимости их закрывать вручную, так что крестик там не обрабатывается.
    Вот так он уведомления выводит:
    Код:
    $('.success-new').fadeIn('slow').delay(4000).slideUp(2000, function() {$(this).remove();});
     
  2. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    А языковой файл я правильный выбрал? Попробовал остальные, все равно появляется значение указанное в файле контроллера. Может я не так прописываю? Значение в файле контроллера
    $json['error']['quantity'] = 'quantity_error'; прописал в языковом файле контроллера $_['quantity_error'] = 'Минимальное количество для заказа %s!'; Или не правильно?
     
  3. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Конечно, неправильно!
    Вы разве не знаете, как из языкового файла вытягиваются переменные?
    В самом языковом файле вы то прописали правильно, но вы эту переменную затем оттуда не вытягиваете в контроллере, а просто вписали статичный текст (который совпадает с названием переменной, но не более того - оно так не работает).

    Посмотрите в том же контроллере, как происходит вызов языковых переменных.
     
  4. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
  5. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Все отлично работает. Но обратил внимание, что сообщение о максимально возможном заказе появляется не только при превышении этого количества, но и при не выборе какой нибудь из опций (при этом количество товара выбрано 1). Можно ли как то разграничить эти ошибки? Не выбор опции и превышении лимита на складе?
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Видимо, вы снова что-то не так сделали.
    Покажите весь код метода add из /catalog/controller/checkout/cart.php.
     
  7. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Dotrox, здесь я с Вами полностью согласен. Вот код.

    $this->load->model('tool/image');


    $canAdd = $this->cart->checkStock($this->request->post['product_id'], $quantity);
    if(!$canAdd){
    $json['error']['quantity'] = sprintf($this->language->get('quantity_error'), $product_info['quantity']);
    }


    if (!$json) {
    $this->cart->add($this->request->post['product_id'], $quantity, $option);
    Сделал все так как было показано и рассказано выше.
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А в js у вас что?
     
  9. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Еще раз проверил. Все работает как надо. Спасибо.
     
  10. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    То есть, там таки была ошибка?
     
  11. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Честно говоря ничего не делал. Просто проверил еще раз, все работает. Протестю еще какое то время. А "посмотреть в js" Это я так понимаю это скрипт, который срабатывает при нажатии кнопки в файле шаблона товара?
     
  12. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Dotrox. Продолжаю вопрос по теме. При тесте всего выше сказанного, а работает все прекрасно, натолкнулся на проблему взаимосвязи количества товара в опциях и общего количества. Приведенный выше код контролирует общее количество товара, указанного в Данных товара, а можно ли к коду добавить проверку количества в опциях? Спасибо.
     
  13. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Да.

    Можно. А заодно тогда и проверку, вычитается ли опция со склада, чтоб ошибка не возникала, когда не надо.
    Но у меня сейчас нет времени это расписывать.
     
  14. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Спасибо еще раз за помощь. Надеюсь время у Вас появится. Если разберусь сам напишу здесь.
     
  15. GammI

    GammI

    Регистрация:
    23 сен 2018
    Сообщения:
    5
    Симпатии:
    0
    Dotrox, сделал все по инструкции, получилось все кроме вывода сообщения! Понимаю что дело в шаблоне, но что, где и к чему не могу разобраться. Пробовал все способы выше, ничего не вышло. Если будет время натолкните на мысль пожалуйста!

    Сайт - умельница.рф
     
  16. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Файл /catalog/view/theme/shop/js/common.js, блок кода:
    Код:
    if (json['error']) {
                        if (json['error']['option']) {
                            for (i in json['error']['option']) {
                                //$('#option-' + i).after($('<span class="error">' + json['error']['option'][i] + '</span>').fadeIn().delay('2000').fadeOut(function() {$(this).remove()}));
                                $('#input-option' + i).parent().after($('<span class="error">' + json['error']['option'][i] + '</span>').fadeIn().delay('5000').fadeOut(function() {$(this).remove()}));
                            }
                        }
                    }
    После строки if (json['error']) { добавляете проверку и вывод вашего stock из json. для начала попробуйте код отсюда. Если не сработает, будем дальше разбираться.
     
  17. GammI

    GammI

    Регистрация:
    23 сен 2018
    Сообщения:
    5
    Симпатии:
    0
    Dotrox, сделал как вы написали, но ничего не вышло. код привожу ниже:
    Код:
    if (json['error']) {
                        if (json['error']['quantity']) {
                            $('#notification').html('<div class="error">' + json['error']['quantity'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');
                        }
                        if (json['error']['option']) {
                            for (i in json['error']['option']) {
                                //$('#option-' + i).after($('<span class="error">' + json['error']['option'][i] + '</span>').fadeIn().delay('2000').fadeOut(function() {$(this).remove()}));
                                $('#input-option' + i).parent().after($('<span class="error">' + json['error']['option'][i] + '</span>').fadeIn().delay('5000').fadeOut(function() {$(this).remove()}));
                            }
                        }
                    }
    Код:
    // Error
    $_['error_stock']              = 'Продукты отмеченные *** отсутствуют в нужном количестве или их нет в наличии!';
    $_['error_minimum']            = 'Минимальное количество товара для заказа %s равняется %s!';
    $_['error_required']           = '%s необходим!';
    $_['error_product']            = 'В вашей корзине нет товаров!';
    $_['error_recurring_required'] = 'Выберите платежный профиль!';
    $_['Error message']             = 'К сожалению, к покупке доступно только: %s';
    Код:
    $canAdd = $this->cart->checkStock($this->request->post['product_id'], $quantity);
                if(!$canAdd){
                    $json['error']['quantity'] = 'Error message';
                }
    Код:
    public function checkStock($product_id, $qty){
        $canAdd = true;
        $count = 0;
        $cartProducts = $this->getProducts();
      
        if(!empty($cartProducts)){
            $products_ids = array();
    
            foreach ($cartProducts as $pData) {
                if(isset($products_ids[$pData['product_id']])){
                    $products_ids[$pData['product_id']] += (int)$pData['quantity'];
                } else {
                    $products_ids[$pData['product_id']] = (int)$pData['quantity'];
                }
            }
    
            if(isset($products_ids[$product_id])){
                $count = $products_ids[$product_id];
            }
        }
    
        $stock = $this->db->query("SELECT quantity FROM " . DB_PREFIX . "product p
                        WHERE p.product_id = '" . (int)$product_id . "'
                        AND p.date_available <= NOW() AND p.status = '1'")->row;
    
        if($stock['quantity'] - $count - $qty < 0){
            $canAdd = false;
        }
    
        return $canAdd;
    }
     
  18. Андррей

    Андррей

    Регистрация:
    21 авг 2018
    Сообщения:
    17
    Симпатии:
    0
    Скорее всего дело в Вашем шаблоне. У меня было тоже самое. Проблема с блоком <div id="notification"></div> где должно выводится сообщение. Я прописывал новый блок в нужном мне месте и уже в нем выводил сообщение. Файл /catalog/view/theme/имя шаблона/template/product/product.tpl
     
  19. GammI

    GammI

    Регистрация:
    23 сен 2018
    Сообщения:
    5
    Симпатии:
    0
    Хм, спасибо. Завтра-послезавтра попробую пошаманить, может что и выйдет.
     
  20. GammI

    GammI

    Регистрация:
    23 сен 2018
    Сообщения:
    5
    Симпатии:
    0
    Не вышло сделать так как вы написали, прописал блок <div id="notification">Недостаточно товара на складе</div> в product.tpl результата - 0.