Создание атрибутов товара в UberCart 3
Задача: создать товар, стоимость которого в зависимости от атрибутов будет меняться в ту или другую сторону.
Нам понадобится:
- Drupal 7
- Ubercart 3.1
-- включённый под-модуль uc_attribute
Термины и определения
Класс товаров - товары, объединённые в одну смысловую группу.
Атрибут – свойство товара
Опция атрибута – состояние, которое может принимать атрибут
Описание проекта.
У нас есть небольшой сайт, торгующий пепелацами. Пепелац в базовой комплектации стоит 1000 у.е. Запас гравицапы на день, неделю или месяц 500/700/1000 у.е. соответственно Скрипач умеющий играть или нет 300/500 у.е. Пачка КЦ 750 у.е. и доп-опция – выбить у пепелаца окно или два, что снизит стоимость на 300/500 у.е.
Реализация
Создадим класс товаров «пепелац» идём admin/store/products/classes и заполняем там форму
Теперь создадим атрибут «гравицапа». Идём в управление атрибутами (для этого нам и понадобился включенный под-модуль) admin/store/products/attributes и жмём «Add an attribute» admin/store/products/attributes/add
Создадим атрибут гравицапы
А теперь добавим опции для этого атрибута.
Что должно получиться
Теперь разберёмся с выбитыми окнами
Обратите внимание на отрицательную цифру, это снижает итоговую стоимость и даёт ту самую скидку.
Теперь включим опцию свойства товаров, для показа итоговой цены с учётом атрибутов. Идём admin/store/settings/products пункт «Atrtribute settinngs» и устанавливам переклюк на «Display total price»
Теперь, когда мы создали класс товара и необходимые атрибуты и опции к ним, нам необходимо всё это связать. Переходим в управление классами товара admin/store/products/classes и в редактирование нашего класса «пепелац» admin/store/products/classes/pepelac/edit перейдём на вкладку атрибуты admin/store/products/classes/pepelac/attributes и добавим атрибуты для этого класса admin/store/products/classes/pepelac/attributes/add
Не обращайте внимания на то, что не отмечено галками, это от другого проекта
Теперь переходим в создать материал и добавляем пепелац
Вот, что у нас получилось на выходе
И в корзине
Посчитаем
Базовая стоимость 2000 минус 300 за одно выбитое окно плюс 1000 месячный запас гравицапы и плюс скрипач без музыкального слуха за 300. Итого 3000.
Получите, распишитесь.
Спасибо за внимание.
Комментарии
Полезный материал, спасибо.
Спасибо, пригодится!
спасибо)
не за что
надеюсь, что кому-нибудь да помог
на скриншотах пепелац иногда мутирует перелац
При выборе атрибута сумма пересчитывается сразу или только после того как нажата кнопка добавить в корзину?
в корзине
Хочу сделать, чтоб цена пересчитывалась при выборе чекбокса (атрибута), не подскажете как сделать? направьте хоть в нужном направлении.
т.е. хочеца цена пепелаца вверху 1000
если человек выбрал один из атрибутов, то 1000 превращается например в 1200...
ajax attribute
сумма ж не пересчитывается... только атрибуты.
пересчитывается
я наверное не правильно выразился, цена пересчитывается но возле атрибута, а общая только после нажатия на кнопку добавить в корзину. а мне поставили задачу сделать так чтоб общая цена пересчитывалась при выборе атрибута.
я так понял, что без form_alter не обойтись, но я ламер, надеялся, что можно модулем победить.
у них курс плавающий (:
Ура, победил, спасибо за общение
Доброй ночи!
А кто подскажет как самому в зависимости от значений полей высчитывать цену?
А то сейчас приходится темизировать кучу выводов типа:_tapir_table_alter, _uc_cart_review_table, _uc_cart_block_summary, _uc_cart_checkout_review и т.д., чтобы напрямую там каждый раз пересчитывать стоимость товара и общую сумму.
Должна ж быть какая функция или хук отвечающие за это. Не могу найти. Пробовал разобраться как работает uc_attribute, но не понял как он меняет цену на товар. Если не понятно написал, есть еще пост http://www.drupal.ru/node/101485 может яснее будет.
Буду благодарен за любую помощь!
в зависимости от атрибута меняет цену, я же это достаточно подробно описывал
Да, спасибо, все хорошо описали для выбора из вариантов! Но у меня не выбор, а поле ввода. В это поле можно ввести число от 300 до 6000 и для каждого значения должен быть расчет. Или я что-то не дочитал?
С своей задачей я вот только разобрался.
Напишу кусок из модуля, чтобы немного пояснить.
Есть материал profnastil
Есть одно поле uc_attribute типа textfield.
Вот так считаю общую цену:
<?php
/* hook_uc_order (изменение общей цены)*/
function uc_mnigma_uc_order($op, $order, $arg2) {
switch ($op) {
case 'total':
$total=0;
$old_total=0;
foreach($order->products as $key=>$order_item){
$node=node_load($order_item->nid);
if($node->type=='profnastil'){
foreach($order_item->data['attributes'] as $attributes_list){
if(is_array($attributes_list))$attribut=$attributes_list[0];
else $attribut=$attributes_list;
}
$total += $order_item->price * $order_item->qty * ($attribut/1000) * ($node->field_shirina_lista['und'][0]['value']/1000);
/* в строке выше: стоимость(идет как за м кв.) * кол-во товара * ВВЕДЕННАЯ пользователем длина в мм * на ширину листа */
}else{
$total+=$order_item->price * $order_item->qty;
}
$old_total+=$order_item->price * $order_item->qty;
}
return (-$old_total+$total);
break;
}
}
?>
Не думали через conditional_fields сделать?
Как-то с этим модулем не встречался, да и раз уже решил вопрос, доп модули не нужны. Спасибо за направление, возможности модуля посмотрю!
Можно ли создать атрибут с текстовым полем и в зависимости от числа введенного туда менялась цена?