[УРОК] Создаём товары атрибутами и учим правильно считать

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

Аватар пользователя NaZg NaZg 16 июля 2012 в 12:51

Создание атрибутов товара в 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

Не обращайте внимания на то, что не отмечено галками, это от другого проекта Smile

Теперь переходим в создать материал и добавляем пепелац
Вот, что у нас получилось на выходе

И в корзине

Посчитаем
Базовая стоимость 2000 минус 300 за одно выбитое окно плюс 1000 месячный запас гравицапы и плюс скрипач без музыкального слуха за 300. Итого 3000.
Получите, распишитесь.

Спасибо за внимание.

Комментарии

Аватар пользователя kalekin kalekin 22 апреля 2013 в 10:12

При выборе атрибута сумма пересчитывается сразу или только после того как нажата кнопка добавить в корзину?

Аватар пользователя NaZg NaZg 22 апреля 2013 в 15:43

"kalekin" wrote:
При выборе атрибута сумма пересчитывается сразу или только после того как нажата кнопка добавить в корзину?

в корзине

Аватар пользователя kalekin kalekin 22 апреля 2013 в 18:42

"NaZg" wrote:

Хочу сделать, чтоб цена пересчитывалась при выборе чекбокса (атрибута), не подскажете как сделать? направьте хоть в нужном направлении.
т.е. хочеца цена пепелаца вверху 1000
если человек выбрал один из атрибутов, то 1000 превращается например в 1200...

Аватар пользователя kalekin kalekin 23 апреля 2013 в 10:15

NaZg wrote:
"kalekin" wrote:
направьте хоть в нужном направлении.

ajax attribute

сумма ж не пересчитывается... только атрибуты.

Аватар пользователя kalekin kalekin 23 апреля 2013 в 13:35

NaZg wrote:
"kalekin" wrote:
сумма ж не пересчитывается... только атрибуты.

пересчитывается

я наверное не правильно выразился, цена пересчитывается но возле атрибута, а общая только после нажатия на кнопку добавить в корзину. а мне поставили задачу сделать так чтоб общая цена пересчитывалась при выборе атрибута.
я так понял, что без form_alter не обойтись, но я ламер, надеялся, что можно модулем победить.

Аватар пользователя mNigma@drupal.org mNigma@drupal.org 10 июля 2013 в 0:50

Доброй ночи!
А кто подскажет как самому в зависимости от значений полей высчитывать цену?
А то сейчас приходится темизировать кучу выводов типа:_tapir_table_alter, _uc_cart_review_table, _uc_cart_block_summary, _uc_cart_checkout_review и т.д., чтобы напрямую там каждый раз пересчитывать стоимость товара и общую сумму.

Должна ж быть какая функция или хук отвечающие за это. Не могу найти. Пробовал разобраться как работает uc_attribute, но не понял как он меняет цену на товар. Если не понятно написал, есть еще пост http://www.drupal.ru/node/101485 может яснее будет.

Буду благодарен за любую помощь!

Аватар пользователя NaZg NaZg 10 июля 2013 в 11:26

"<a href="mailto:mNigma@drupal.org">mNigma@drupal.org</a>" wrote:
Пробовал разобраться как работает uc_attribute, но не понял как он меняет цену на товар

в зависимости от атрибута меняет цену, я же это достаточно подробно описывал

Аватар пользователя mNigma@drupal.org mNigma@drupal.org 10 июля 2013 в 12:54

"NaZg" wrote:
в зависимости от атрибута меняет цену, я же это достаточно подробно описывал

Да, спасибо, все хорошо описали для выбора из вариантов! Но у меня не выбор, а поле ввода. В это поле можно ввести число от 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;
}
}
?>

Аватар пользователя mNigma@drupal.org mNigma@drupal.org 11 июля 2013 в 0:57

"NaZg" wrote:
Не думали через conditional_fields сделать?

Как-то с этим модулем не встречался, да и раз уже решил вопрос, доп модули не нужны. Спасибо за направление, возможности модуля посмотрю!