[Помогите] Отключить кнопку КУПИТЬ, если не выбрано опций

Тема в разделе "OpenCart", создана пользователем samuel_L, 14 окт 2016.

Метки:
  1. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    Товарищи, замучался с опциями дальше некуда, выручайте.

    Суть: у товара несколько опций, все чекбокс (это к тому, что на другие не надо решение).
    То есть, к примеру:
    опции чекбокс ЦВЕТА: 1,2,3,4
    опции чекбокс РИСУНКИ: 1,2,3,4

    Мне нужно, чтобы обязательным был выбор одного значения ИЗ любой из групп опций. Тк без опций товар у меня стоит 0, но неондертальцы то всегда найдуться.
    Посему, ввиду моей не сильной мощи в программировании, возникла идея сделать через ajax проверку, но никак не могу соорудить конструкцию (перепробовал массу вариантов).

    Суть if #input checked = checked -> кнопка button-cart срабатывает, если unchecked -> alert('Выберите опцию')

    Ajax мой выглядить так (который отвечает за добавление в корзину)

    PS: если ктото знает более изящное и простое решение обязать выбрать ТОЛЬКО ОДНУ из опций - буду премного благодарен
     
    Последнее редактирование: 14 окт 2016
  2. MGT1

    MGT1

    Регистрация:
    5 янв 2013
    Сообщения:
    900
    Симпатии:
    218
    А там разве не выбирается опция обязательная для выбора?
     
  3. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    одну из. я могу поставить обязательным рисунок, но человек может выбрать только цвет
    то есть 2 разные опции (группы опций) и одна из них должна быть выбрана обязательно. или 1 группа или 2 группа
     
  4. settr

    settr

    Регистрация:
    12 окт 2016
    Сообщения:
    67
    Симпатии:
    54
    Вариант на бекэнде
    Все опции делаем обязательными.
    Затем в файле catalog/controller/checkout/cart.php найдите
    PHP:
    foreach ($product_options as $product_option) {
        if (
    $product_option['required'] && empty($option[$product_option['product_option_id']])) {
            
    $json['error']['option'][$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
        }
    }
    и замените на
    PHP:
    foreach ($product_options as $product_option) {
        if (
    $product_option['required'] && empty($option[$product_option['product_option_id']]) ) {
            
    $prd_opt_err[$product_option['product_option_id']] = $this->language->get('error_no_one_option');
        }
    }

    if ( 
    count ($product_options) == count ($prd_opt_err) ) {
        foreach (
    $prd_opt_err as $key => $value) {
            
    $json['error']['option'][$key] = $value;
        }
    }
    В файле catalog/language/russian/checkout/cart.php добавьте
    PHP:
    $_['error_no_one_option']    = 'Одно из полей должно быть заполнено';    
    Но такое лучше бы запилить в VQMOD - иначе потом не вспомнишь, что и где редактировал.
     
    Последнее редактирование: 14 окт 2016
    samuel_L нравится это.
  5. skiv14

    skiv14

    Регистрация:
    9 июн 2015
    Сообщения:
    437
    Симпатии:
    180
    Ну-ка попробуйте вот тут


    Если то, что нужно, то у меня с опциями связано 2 модуля. Один из них запрещает, но какой - хз.
    Скорей всего это модуль Изображения опций PRO

    В админке есть галочка "Обязательно" для каждой опции.
    Раз опция

    Два опция


    Есть ещё Product Block Option, может и он. Но он только за стили вроде отвечает. Выводит опции кнопками.
    Есть ещё Связанные опции, но он вряд ли.
     
    samuel_L нравится это.
  6. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    Спасибо за ответы! Сейчас буду тестить
    Skiv14, у вас немного иначе реализовано - опции связаны.
    А у меня нужно выбрать или одно или другое.
    То есть, на примере вашего магазина: нужно, чтобы клиент выбрал или объем рюкзака или цвет. Оба обязательными сделать я не могу, тк есть вариант при котором клиент выберет только 1 опцию и это не запрещается.
    Запретить нужно только выбор без опций.

    PS: кстати, на вашем магазине есть смысл попробовать сделать так http://prntscr.com/cu3sv1
    тк на экране 1366х768 (они у нас очень распространены) я прокрутил страницу вниз, выбрал опции - а кнопки купить не вижу)) она вверху. легкий приступ паники на пару секунд охватил меня как возможного клиента
    --- Добавлено, 15 окт 2016 ---
    Работает!:runner:
    Мои благодарности!
     
  7. settr

    settr

    Регистрация:
    12 окт 2016
    Сообщения:
    67
    Симпатии:
    54
    Приношу извинения, работать будет не совсем так как нужно.
    Не заметил сразу
    Если в товаре будут две "как-бы не совсем обязательные" опции эта логика сработает.
    Но если у Вас в одном товаре будут обязательная опция напр. "Размер" и две "как-бы не совсем обязательные" опции "Цвет" и "Рисунок" и покупатель выберет опцию "Размер" - заказ упадет в корзину. А я так понимаю нужно еще заставить выбрать одну из "как-бы не совсем обязательных" опций.

    Правильно сделать-бы ещё одно значение ( напр. 2 и обозвать его "Один из" ), которое заносится в базу при выборе обязательности опции. И в контроллере делать соответствующие проверки.

    Как временное решение - можно немного "закостылить"
    Найти в базе какие опции "как-бы не совсем обязательные" - взять их id.
    И заменить указанный выше код в файле catalog/controller/checkout/cart.php на
    PHP:
    $not_quite_requred_option_id = array(14,15); // массив id "как-бы не совсем обязательных" опций
     
    $opt_no_one_selected true;
                         
     foreach (
    $product_options as $product_option) {
                             
         if (
    in_array($product_option['option_id'],$not_quite_requred_option_id)   ) {
             if ( 
    $opt_no_one_selected  && empty($option[$product_option['product_option_id']])) {
                 
    $prd_opt_err[$product_option['product_option_id']] = $this->language->get('error_no_one_option');
                 
    $opt_no_one_selected true;
             } else {
                 
    $opt_no_one_selected false;
             }
         } elseif (
    $product_option['required'] && empty($option[$product_option['product_option_id']]) ) {
            
    $prd_opt_err[$product_option['product_option_id']] = sprintf($this->language->get('error_required'), $product_option['name']);
         }
     }
       
     foreach (
    $prd_opt_err as $key => $value) {
         
    $json['error']['option'][$key] = $value;
    }
    На скринах "Размер" - обязательная опция
    "Цвет" и "Рисунок" - "как-бы не совсем обязательные" опции (id в базе 14 и 15 соответсвенно)
    http://prnt.sc/cu559g
    http://prntscr.com/cu5788
    http://prntscr.com/cu57o2
    --- Добавлено, 15 окт 2016 ---
    А точнее так ))
    PHP:
    $not_quite_requred_option_id = array(14,15); // массив id "как-бы не совсем обязательных" опций
    $opt_one_selected false;
                           
               foreach (
    $product_options as $product_option) {
                               
                   if (
    in_array($product_option['option_id'],$not_quite_requred_option_id)  ) {
                       
                       if (empty(
    $option[$product_option['product_option_id']]) && !$opt_one_selected ) {
                           
    $prd_opt_err[$product_option['product_option_id']]['not_quite_requred'] = $this->language->get('error_no_one_option');
                           
    $opt_one_selected false;
                       } else {
                           
    $opt_one_selected true;
                       }
                   } elseif (
    $product_option['required'] && empty($option[$product_option['product_option_id']]) ) {
                       
    $prd_opt_err[$product_option['product_option_id']]['required'] = sprintf($this->language->get('error_required'), $product_option['name']);
                   }
               }
               
               if (isset(
    $prd_opt_err)) {
                   foreach (
    $prd_opt_err as $key => $value) {
                       if (isset(
    $value['required']))
                       {
                           
    $json['error']['option'][$key] = $value['required'];
                       }
                       if (!
    $opt_one_selected and isset($value['not_quite_requred'] ) ) {
                           
    $json['error']['option'][$key] = $value['not_quite_requred'];
                       }
                   }
               }
     
    Последнее редактирование: 15 окт 2016
    samuel_L нравится это.
  8. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    фух, чуть позже опробую метод, мысль понял) пойдет и костыль.
    Settr, позвольте чуть понаглеть: как можно выводить error под всеми опциями http://image.prntscr.com/image/8f4ffcc7b7964e0283a1e31c84e523a4.png

    я так понимаю выводится код этим
     
    skiv14 нравится это.
  9. settr

    settr

    Регистрация:
    12 окт 2016
    Сообщения:
    67
    Симпатии:
    54
    Эту часть
    Код:
    for (i in json['error']['option']) {
                            var element = $('#input-option' + i.replace('_', '-'));
                           
                            if (element.parent().hasClass('input-group')) {
                                element.parent().after('<div class="text-danger">' + json['error']['option'][i] + '</div>');
                            } else {
                                element.after('<div class="text-danger">' + json['error']['option'][i] + '</div>');
                            }
                        }
    Замените на
    Код:
    var error_option = json['error']['option'];
    var i = Object.keys(error_option).pop();  // последний элемент объекта json['error']['option']
    //for (i in json['error']['option']) { 
        var element = $('#input-option' + i.replace('_', '-'));
        if (element.parent().hasClass('input-group')) {
             element.parent().after('<div class="text-danger">' + json['error']['option'][i] + '</div>');
        } else {
             element.after('<div class="text-danger">' + json['error']['option'][i] + '</div>');
        }
    //}
     
    samuel_L нравится это.
  10. skiv14

    skiv14

    Регистрация:
    9 июн 2015
    Сообщения:
    437
    Симпатии:
    180
    samuel_L, да, я могу назначить опцию обязательной или необязательной.
    Но поставить условие обязательного выбора только одной, но любой опции - я не могу.

    По совету - понял, подумаю как это можно реализовать. Не силён я в коде, тут вёрстку править надо.
     
  11. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    Там один div перетащить. Если интересно - пришлите product.tpl , поправлю и будет с чем сравнить
     
    skiv14 нравится это.
  12. samuel_L

    samuel_L

    Регистрация:
    6 окт 2012
    Сообщения:
    221
    Симпатии:
    132
    Settr, к сожалению не работает вариант вывода под всеми опциями предупреждения. Писал на почту, кстати)