Товарищи, замучался с опциями дальше некуда, выручайте. Суть: у товара несколько опций, все чекбокс (это к тому, что на другие не надо решение). То есть, к примеру: опции чекбокс ЦВЕТА: 1,2,3,4 опции чекбокс РИСУНКИ: 1,2,3,4 Мне нужно, чтобы обязательным был выбор одного значения ИЗ любой из групп опций. Тк без опций товар у меня стоит 0, но неондертальцы то всегда найдуться. Посему, ввиду моей не сильной мощи в программировании, возникла идея сделать через ajax проверку, но никак не могу соорудить конструкцию (перепробовал массу вариантов). Суть if #input checked = checked -> кнопка button-cart срабатывает, если unchecked -> alert('Выберите опцию') Ajax мой выглядить так (который отвечает за добавление в корзину) PS: если ктото знает более изящное и простое решение обязать выбрать ТОЛЬКО ОДНУ из опций - буду премного благодарен
одну из. я могу поставить обязательным рисунок, но человек может выбрать только цвет то есть 2 разные опции (группы опций) и одна из них должна быть выбрана обязательно. или 1 группа или 2 группа
Вариант на бекэнде Все опции делаем обязательными. Затем в файле 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 - иначе потом не вспомнишь, что и где редактировал.
Ну-ка попробуйте вот тут Если то, что нужно, то у меня с опциями связано 2 модуля. Один из них запрещает, но какой - хз. Скорей всего это модуль Изображения опций PRO В админке есть галочка "Обязательно" для каждой опции. Раз опция Два опция Есть ещё Product Block Option, может и он. Но он только за стили вроде отвечает. Выводит опции кнопками. Есть ещё Связанные опции, но он вряд ли.
Спасибо за ответы! Сейчас буду тестить Skiv14, у вас немного иначе реализовано - опции связаны. А у меня нужно выбрать или одно или другое. То есть, на примере вашего магазина: нужно, чтобы клиент выбрал или объем рюкзака или цвет. Оба обязательными сделать я не могу, тк есть вариант при котором клиент выберет только 1 опцию и это не запрещается. Запретить нужно только выбор без опций. PS: кстати, на вашем магазине есть смысл попробовать сделать так http://prntscr.com/cu3sv1 тк на экране 1366х768 (они у нас очень распространены) я прокрутил страницу вниз, выбрал опции - а кнопки купить не вижу)) она вверху. легкий приступ паники на пару секунд охватил меня как возможного клиента --- Добавлено, 15 окт 2016 --- Работает! Мои благодарности!
Приношу извинения, работать будет не совсем так как нужно. Не заметил сразу Если в товаре будут две "как-бы не совсем обязательные" опции эта логика сработает. Но если у Вас в одном товаре будут обязательная опция напр. "Размер" и две "как-бы не совсем обязательные" опции "Цвет" и "Рисунок" и покупатель выберет опцию "Размер" - заказ упадет в корзину. А я так понимаю нужно еще заставить выбрать одну из "как-бы не совсем обязательных" опций. Правильно сделать-бы ещё одно значение ( напр. 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']; } } }
фух, чуть позже опробую метод, мысль понял) пойдет и костыль. Settr, позвольте чуть понаглеть: как можно выводить error под всеми опциями http://image.prntscr.com/image/8f4ffcc7b7964e0283a1e31c84e523a4.png я так понимаю выводится код этим
Эту часть Код: 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, да, я могу назначить опцию обязательной или необязательной. Но поставить условие обязательного выбора только одной, но любой опции - я не могу. По совету - понял, подумаю как это можно реализовать. Не силён я в коде, тут вёрстку править надо.
Settr, к сожалению не работает вариант вывода под всеми опциями предупреждения. Писал на почту, кстати)