[РЕШЕНО] Опции товара Ubercart

Главные вкладки

Аватар пользователя gun_dose gun_dose 26 апреля 2016 в 17:20

Может и глупый вопрос, но с атрибутами в уберкарте не доводилось плотно работать, поэтому больно не бейте. Интересуют следующие вопросы:

1. Как вывести опции не над кнопкой корзины, а в другом нужном мне месте, где-то между полями? Изучал код модуля uc_attribute, и понял, что всё очень плохо - он там рендерит по-своему форму корзины, что потом непонятно, как из неё выпилить лишнее. Ну хотя ладно, можно на крайняк через css скрыть ненужное, но как потом это нужное вывести там, где мне надо?
2. Хотелось бы, чтобы показывалась абсолютная цена, а не плюс-минус рубли. И ещё хотелось бы, чтобы при выборе опции основная цена изменялась.

Нужно такое решение, чтобы всё работало и у товаров без опций, т.к. у ряда товаров опций нет и не предвидится.

И ещё: туда ли я копаю в принципе, если опций суммарно окажется очень много, т.к. у меня опции немного не стандартные - это не цвет, размер или гигабайты, а модификация товара, а это значит, что повторное использование одной опции в разных товарах заведомо исключено. Просто я для одного товара завёл три тестовые опции и уже устал)))

Решение написал в конце темы

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 30 апреля 2016 в 9:41

>1. Как вывести опции не над кнопкой корзины
Я тебе удивляюсь, видгеты конечно. Если не форма, то либо ajax либо js.
>2. Хотелось бы, чтобы показывалась абсолютная цена, а не плюс-минус рубли. И ещё хотелось бы, чтобы при выборе опции основная цена изменялась.
"живой" пересчет на странице делать js
> Опции уникальные для каждого товара, без повторного использования
Что мешает завести аттрибут и стандартно в товаре отметить те опции, корорые будут испльзолваться в данном товаре?

Аватар пользователя gun_dose gun_dose 30 апреля 2016 в 14:16

1. Ээээ, шта?)) Виджеты - это те, что для гаджетов? Если честно, не понял, что ты имеешь в виду. Можно ссылки, примеры и т.д?
2. Живой пересчёт через js - это запросто, но это ведь тот ещё костыль. Более того, с точки зрения администрирования товаров относительные цены - это полный фуфел. Хотя есть модуль, который позволяет использовать другой товар в качестве опции, надо попробовать.
3. Ничего не мешает, просто раскрывающийся список на 300 опций - это немного не то, о чём каждый мечтал с детства)))

Аватар пользователя VasyOK VasyOK 1 мая 2016 в 10:51

"Как вывести опции не над кнопкой корзины, а в другом нужном мне месте, где-то между полями? "
Можно быдлокодингом:
position: absolut; и в нужное место.

Аватар пользователя gun_dose gun_dose 9 мая 2016 в 13:51

"Имплементируй хуки или умри, а если умер, то можно попробовать и костыли" - таков девиз друпал-разработчика.
Поэтому решение получилось долгое, сложное, но отлично работающее. И так приступим:
1. Установил модуль uc_product_as_attribute_option, чтобы можно было цеплять другой товар в качестве опции. Это нужно было для того, чтобы цены опций поддавались экспорту и импорту, который уже настроен на сайте.
2. Имплементнул хукца uc_product_alter, чтобы сделать цены опций абсолютными. Конкретно просто скопировал хук из модуля uc_attribute, и заменил "+=" на "=" вот тут:

<?phpif(is_array($option) && !empty($option)){
          $node->cost = $option['cost'];
          $node->price = $option['price'];
          $node->weight = $option['weight'];
            }?>

Через hook_module_implements_alter задвинул этот хук в самый конец, иначе после него мог отрабатывать стандартный хук из uc_attribute и снова суммировать цен.
3. Добавил поле, которое не нужно заполнять, в препроцессе ноду вытаскиваю в этом поле инфу об опциях и их ценах, в итоге появилась возможность перетаскивать эти опции в админке, как обычное поле, сьандартные опции скрыл через цсс, привинтил скрипт, который по клику на новые опции выбирает соответствующие им скрытые стандартные.
4. Реализовал возможность не выбирать опцию у товара, если опции есть (из коробки опцию всегда надо было выбрать хоть одну). Но вышла куча ошибок в связи с тем, что uc_attribute по прежнему думал, что опции есть, и кидал ошибки на нон обжекты и андифайнд индексы, написал небольшой код, который ансеттит атрибуты вообще, если они не выбраны, чтобы последующие хуки в итоге не срабатывали в холостую. Через hook_module_implements_alter задвинул этот хук в самое начало. Ошибки пропали, но оказалось, что если товар без опции добавить в корзину, то потом его из корзины нельзя ни удалить, ни поменять количество, пока не добавишь второй такой же товар. Разобрался, оказалось, что удаляю атрибуты из ноды под корень, а в корзине в сериализованной дате записано, что атрибуты - это массив из одного элемента типа boolean, потому по нажатию кнопок не находится соответствие, в общем, добавил к коду, убирающему пустые атрибуты ещё и запрос в базу, чтобы убирал их ещё и там в корзине.

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