[РЕШЕНО] Drupal Commerce - Изменение(+1 или -1) значения поля продукта при оформлении на него заказа

Аватар пользователя andreystrelkov andreystrelkov 24 декабря 2012 в 13:38

Здравствуйте, У меня следующая хотелка Smile

Нужно при выводе товаров,показывать 2 числа ещё,
первое - это сколько на текущий момент человек его заказало
второе - сколько вообще раз его заказывали и получали (т.е. успешно закрытый заказ с этим продуктом)

первое что мне в голову приходит:
в типе продукта создать 2 десятичных поля: СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ и CКОЛЬКО РАЗ КУПЛЕНО ( по дефолту везде 0 )
* потом добавить правило, при завершении оформления заказа (Completing the checkout process)
выполнить действие Сalculate value, где с полем продукта СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ - +1
* а второе правило при смене статуса заказа на COMPLETED, аналогично менять значение у СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ -1, а CКОЛЬКО РАЗ КУПЛЕНО +1

Однако, меня настигло небольшое огорчение, при добавления действия Calculate value, не могу придти к редактированию ПОЛЯ ПРОДУКТА, там лишь
site:... (Информация о сайте)
commerce-order:... (Completed order)

Реально ли вообще придти к полю продукта?

Комментарии

Аватар пользователя Nikit Nikit 24 декабря 2012 в 15:31

В Rules в Condition добавьте условия для двух ваших полей: Entity has field и соответствующие поля, т.о. получите доступ к своим полям в Actions.

Аватар пользователя andreystrelkov andreystrelkov 24 декабря 2012 в 16:17

т.е. я добавляю Condition - Entity has field
он предлагает выбрать Data Selector
а ниже ПОЛЕ, где я успешно нахожу свой тестовый field_kolvo_pokupok

он не понятно теперь, что он хочет от меня в Data Selector?
и что мне нужно выбрать, немного не понимаю в чём состоит логика на этом этапе, что я и для чего должен выбрать в этом Data selector

Аватар пользователя andreystrelkov andreystrelkov 25 декабря 2012 в 9:32

что то всё равно не получается Sad

поздреваю что во втором скрине в Date Selector нужно как то оригинально прописать мой field_kolvo_pokupok

Аватар пользователя vasilyok vasilyok 18 октября в 13:54

Добрый день. Можете скинуть подробные скриншоты как Вы решили свою задачу. Буду очень благодарен.

Аватар пользователя andreystrelkov andreystrelkov 25 декабря 2012 в 16:49

понятно, т.е. по правильному, как я и думал, должно быть
commerce-order:filed_kolvo_pokupok

но к сожалению там такого нет :/
получается в Condition присваивание поля не получилось

Аватар пользователя andreystrelkov andreystrelkov 25 декабря 2012 в 22:18

Если же идти от действия Add product to the cart, то всё появляется commerce-order:filed_kolvo_pokupok

ОДНАКО! не выполняется арифметическое действие (Calculate a value), у всех значение по умолчанию 0, делаю при добавлении в корзину +1,
0 так и остаётся, если уже говорю указать значение определённое в действиях - то он меняет...
(правда в арифметическом действии есть снизу два поля Variable label и Variable name оставляю по умолчанию - может в этом косяк?)

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 18:29

с Calculate разобрался Smile
тороплюсь, не разбираюсь толком с функционалом,

Действие то он оказывается совершает, но он значение записывает в тот самый внизу Variable Name, а не в то поле, надо которым совершалось, поэтому нужно далее добавить новый Action с Set a data value, где указать что FIELD_KOLVO_POKUPOK равно той переменной которую прописали в VARIABLE NAME (в которой шагом раньше записался результат)

НО вопрос всё равно висит, как же для действия над ORDER-ом, связать поля PRODUCT-а

На офф сайте, они посылают народ сюда: http://www.drupalcommerce.org/faq/rules-field-data-selection
где вот главный текст

«Unfortunately, there's also a bug in Rules that may account for the lack of fields in your data selector. In instances where you're looking for fields on an entity referenced by another entity (e.g. fields on the product reference by a line item in a product pricing rule), Rules will not acknowledge the existence of fields on the referenced entity. The workaround to this is to use Rules components to access field data on the referenced entities, but this method is really only feasible for advanced Rules users with a programming background. Your best bet will be to follow along in the issue waiting for it to be solved in Rules:

http://drupal.org/node/1053850»

Где вроде бы говорят что, это можно сделать помощью компонентов, но это для опытных, ЧЁРТ! а я ещё не опытныю, и не догоняю как это можно сделать :/

Аватар пользователя 1541 1541 26 декабря 2012 в 19:13

У меня схожая проблемма. Но при сет дата велью у меня например не видит переменной в которую был записан результат. делаю по видео уроку.

Аватар пользователя 1541 1541 26 декабря 2012 в 19:38

Если поможет, буду рад. Может и Ваш опыт мне пригодится, а то уже вторые сутки торчу на этой проблемме.:(

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 20:54

Если у Вас есть что то более менее рабочее по вашей задаче, был бы благодарен либо за описание, либо ещё лучше за скриншоты Smile

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 20:53

не шиша не получилось у меня поэтому видео, я как понял суть, он с помощью компонента просто выдирает значение веса из поля в типе продукта, потом это означение умножает на Quantity из заказа, и полученное умножает на 1000 (толи баксов толи чего)
апосля полученный результат (с помощью настройки компонента - Provider) он может вернуть/прочитать, при выполение своего основного Рулза - подсчёт цены на доставку текущего заказа... т.е. фишка в том что у него рулза идёт по посчёту стоимости, т.е. ему изначально доступно поле стоимости доставки у заказа

а в моём случае - оно изначально недоступно, т.к. я делаю операцию с заказом.

Т.е. я всё также повторил как он сделал для своей цели
Т.е. у меня компонент влазит внутри line items-ов и говорит что это commerce_product, а далече говорит что в commerce_product есть поля у типа продукта field_zakazalo_ludei
таким образом (в идеале он потом через loop посмотрит все продукты в текущем заказе) он с помощью компонента влазит внутрь продукта, читает текущее кол-во людей и плюсует к ним 1, а потом возращает это число переменной из компонента, которое потом по идее нужно просто сказать оригинальное поле field_zakazalo_ludei теперь должно быть равно переменной которая вернулась из компонента

что то - масло масляное написал - и похоже хрень какую то

(т.е. я компонентом то - молодец прочитал поле из продукта, и прибавил к нему, а вот как обратно то его запихать в зависимость от продукта который в заказе находится... Smile )

Аватар пользователя 1541 1541 26 декабря 2012 в 21:16

Интересно... а у меня например по видео не получается ничего. Т.е. я все создаю до последнего экшена с сет велью а там у меня не высвечивается параметр с результатом вычислений.. ничего не пойму почему.
вот еще кое что, тут много всего может Вам и подойдет что нибудь.
Но я тоже чесн слово не пойму зачем он умножает на 1000, и что это 1000? Мне например надо сделать чтобы в зависимости от веса товара была стоимость расчитана с шагом в 100 грамм.

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 21:23

Расскажите свою задачу, может Вам смогу чем то помочь, раз пока со своей не могу справиться

Аватар пользователя 1541 1541 26 декабря 2012 в 21:29

Мне необходимо посчитать стоимость доставки товара в зависимости от его веса. Вес указал с помощью Phisical Field, такса $1,5 за сто грамм. Если необходимо то таксу можно взять и например 0,75 за 50 грамм. Вот.

Аватар пользователя 1541 1541 26 декабря 2012 в 22:05

Буду очень признателен за любую посильную помощь. Я только начинаю и она мне ой как кстати...:)

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 22:31

В Вашем случае да, получается как на первом видео, так всё и есть
т.е. он создаёт Рулзу подсчёта общей стоимости доставки за всё что находиться в заказе, а делает это он
с помощью цикла (loop), в котором как я понимаю прогоняются все line-item отдельно.

Т.е.

1) Читаю первый line-item, там 5 пачек (Quantity=5) по 100гр сахара (Продукт Сахар 100гр весовка)
2) Умножаю 5 х 100 = 500 гр
3) Умножаю (в его случае 1000), хотя в Вашем получается должно быть
3.1) делю 500 на 100 (т.к. у вас такса 1,5$ за 100 грамм)
3.2) полученное умножаю уже на 1,5$
4) Получаем стоимость доставки за один продукт определённого кол-ва в штуках
5) То что получаем прибавляем к общей стоимости доставки
6) Повторяем сначала цикл со следующий позиции в заказе, и так пока не дойдём до последней

я так понял видео, у Вас + в том, что поле Общая сумма доставки , как бы сказать известно данной рулзе, и он с ним видит связь, у меня нет связи заказа с заказаными продуктами

Аватар пользователя 1541 1541 26 декабря 2012 в 22:53

Понятно. Я вот тоже хочу сделать в дальнейшем подсчет опта. Т.е. чтобы рачитывалась в заказе цена на опт. Но пока решил что для моих условий целесообразнее будет завести товары с оптовыми ценами и вывести их отдельно в раздел для оптовиков.
По поводу моего примера и описанных Вами пунктов, все хорошо, только я сейчас не соображу как все это реализовать.:( то ли двое суток сказываются бессонные то ли еще что.
я так понял что у нас с ним различаются только 3-е действие?

Аватар пользователя andreystrelkov andreystrelkov 26 декабря 2012 в 23:09

Усё, слава господи, похоже я разобрался

Суть в том, что есть Action на завершение чекаута, после которого нужно запустить по циклу по всем видам товаров в заказе - компонент №1(хотя у меня только один товар разрешён в заказе, вот такие вот нюансы =), т.е. мне в принципе loop делать не обязательно, однако просто запустить компонент я не смог, в одном поле требует данные внести, а что вносить нужно я так и не понял, но не суть)

1) первый компонент создаёт 2 параметра Commerce Order и Commerce Line Item, и начинает сравнивать Commerce Line Item (по типу) - Product? (имеется ввиду entity)
если да, то запускай 2ой компонент
2) 2ой компонент аналогично, т.к. уже влезли и добрались до Product, продолжает дальше - а он какого типа продукт - (у меня) Детская одежда?
если да, тогда Хохоууу!!! Давай мне поле у него - kolvo_zakazalo и плюсуй к нему 1 - а что получилось это переменная result, с которой мы сейчас приравняем kolvo_zakazalo

Таким образом, компоненты делают работу (точнее 2ой компонент делает основную, 1ый просто ковыряется глубже, до полей типа продукта) по изменению поле материала
а рулзу - только лишь вызывает их в случае эвента, ну и прогоняет циклом по всем товарам заказа

Аватар пользователя 1541 1541 26 декабря 2012 в 23:16

Ну наконец то:) Поздравляю. Осталось мне разобраться со своим:)

Аватар пользователя 1541 1541 26 декабря 2012 в 23:33

Хорошо, спасибо. А я попытаюсь поковырять у себя. Должен был еще сегодня уже сдать все, но вот перенес на завтра:(
Хотя если не получится то завалюсь:(

Аватар пользователя andreystrelkov andreystrelkov 27 декабря 2012 в 14:01

Удивительно, дошёл до конца расчёта цена за весь продукт в корзине (в зависимости от его кол-ва), пытаюсь записать результат последнего действия в PROVIDER shipping_cost_line_item, выбрав его как переменную в которую будем записывать, а переменная которая была последняя в вычислительных действиях - не доступна! Хотя только что спокойно делал CALCULATE с создаваемыми переменными :///

Аватар пользователя andreystrelkov andreystrelkov 27 декабря 2012 в 14:25

похоже дело было в Integer, видать результат не получится целым числом (хотя не может быть), сделал Decimal появилось поле
Однако решил постетить, создал 3 продукта, у всех своя цена 5руб 10руб 25руб, и вес - 10гр 100гр 1000гр

при таксе в 45руб за 100грамм,

по логике при загазе 5 штук продуктов номер 2. Т.е. 5*100 = 500гр/100гр(такса) = 5 * 45 = 225руб за доставку + 5*10руб (за товар) 275руб итого обойдётся
НО сайт при любом раскладе пишет что доставка 45руб и точка, подозрения, что где то просто переменную не запихнул в стоимость, или в арифметике спутал переменную, и он всех дефолтную считает (странно кста, я ввёл в настройках у создаваемой Flat Rate, там где внизу вводится такса, сумму 45руб, но этого поля нет в рулзах, т.е. напрямую пока не получилось тянуть из Flat Rate, пришлось по тупо в Calcute ручками писать 45руб)

Аватар пользователя 1541 1541 27 декабря 2012 в 16:47

Т.е. мне необходимо сменить тип переменной и в правиле прописать таксу?

Аватар пользователя andreystrelkov andreystrelkov 27 декабря 2012 в 17:24

Похоже да, он видать и рад присвоить значение этих вычислений переменной провайдерской, но Integer - переводится как ЦЕЛОЕ число, а там по ходу толи поле вес, толи вычисления приводят результаты не к целым

Таксу пока да, пропишите просто ручками, потестировать чтобы, если всё гуд, то её скорее всего можно выдрать тоже из текущего вида транспортировки (flat rate)

Аватар пользователя 1541 1541 27 декабря 2012 в 17:33

Хорошо, для присваивания таксы надо отдельно экшн делать или в существующих заменить какой то параметр? Его 1000 поменять на 100 и остальное все так же оставлять как в примере?

Аватар пользователя andreystrelkov andreystrelkov 27 декабря 2012 в 17:41

Вот на видео, на 5:15 он создаёт переменную, которая будет доступна рулзе которая запустила этот компонент, т.е. рулза которая запускается при экшене - подсчёт суммы доставки
а на 9:50 как раз видно, что он подсчитал всё (по одному товару в заказе), и присваивает результат как раз этой переменной с 5:15, получается сумму окончательно можно присваивать в рулзе которая вообще всё это запускает

А его 1000 я не совсем понял, потому что, он достаёт значение веса продукта, и умножает его на кол-во заказанного этого продукта (quantity), а потом зачем то умножает на 1000
хотя по логике вещей он получил общий вес одного вида продукта, он должен его разделить на весовку, которая стоит столько то
т.е. если отправляет 50грамм за 5$, то полученный вес делим на 50грамм и умножаем на 5$

Аватар пользователя andreystrelkov andreystrelkov 27 декабря 2012 в 17:49

ага (считая что при создании продуктов его весовка всегда будет написана в ГРАММАХ, т.к. такса идёт полтора доллара за сто ГРАММ)
а ниже добавить ещё действие, которые предыдущий результат умножит на Ваши 1,5$, это либо ручками писать(по тупому Smile но по простейшему), либо рыться в Data Selection и искать значение поля которые вы заполняли при создании типа расчёта доставки, а именно (как на видео) By weight

ну и в итоге полученный результат присвоить переменной провайдерской

на этом действие компонента закончена

Аватар пользователя 1541 1541 27 декабря 2012 в 17:53

Огромное спасибо за помощь. Попробую сегдня вечером. Сейчас с дизом довожусь немного, и обязательно отпишусь о результате. Вдруг такая "разжевка" кому то поможет еще кроме меня:)

Аватар пользователя 1541 1541 28 декабря 2012 в 2:08

Все, победил. Я понял зачем он умножает на 1000. У него такса указана за фунт наверное, а вес он указывает просто 3, 5, вот и умножает чтобы было 5000 или 3000. Чес слово не знаю зачем. У себя я этот момент просто выкинул, не стал ни умножать ни делить, просто результат который выводит экшн который считает вес у меня, я умножил на свою таксу и получилось то что надо:) И все вывело. Огромнейшее спасибо за помощь:)

Аватар пользователя rngcontrol rngcontrol 11 октября 2013 в 1:09

"andreystrelkov" wrote:
Усё, слава господи, похоже я разобрался

Андрей, пожалуйста, опишите подробнее Ваше решение. Очень нужно сделать что-то подобное. У меня есть поле stock, выводиться с помощью модуля commerce stock, это количество товара на складе. После каждой покупки кол-во товара уменьшается на соответствующую величину.
Мне надо сделать еще одно поле, в котором будет выводиться общее количество уже заказанных товаров всеми пользователями. В итоге должны быть поля "доступно - 100 шт." и "куплено - 50 шт."
Если это возможно, экспортируйте компоненты и само правило, будет очень наглядно и понятно.
Заранее огромное спасибо!

Аватар пользователя andreystrelkov andreystrelkov 13 октября 2013 в 16:23

В течении 1-2 дней подробно опишу логику поведения компонентов рулзы для вашего случая

Аватар пользователя andreystrelkov andreystrelkov 10 ноября 2015 в 11:49

Итак, логика в чём, для друпала как я понял, а точнее для коммерца такие понятие как ORDER, LINE-ITEM и PRODUCT это практически ничего неимеющие между собой сущности, это как НОДА и ТЕРМИН, вроде да они могут в паре работать, но абсолютно разные по логике
Поэтому допустим действие аля - после того как заказ оформлен то добавь к полю товара единичку не прокатит, т.к. действие происходит с ORDER - а он понятия не имеет что такое PRODUCT, в принципе не имеет, т.к. совсем другая сущность, и в ней другие поля и логика (хоть в них и учавствует название товара, цена и т.д., но это не они учавствует это грубо говоря остаточная информация о них в процессе формирование заказа, допустим это просто тупо текст)
однако есть выход, и он универсален не только для коммерца, а везде
его логика заключается в том, что.
цепочка создания заказа проходит через 3 сущности
1) PRODUCT
2) LINE-ITEM (очень загадочная сущность, что то вроде строка товара в заказе :-S )
3) ORDER

в нашем и вашем случае у нас экшн идёт от заказа, и нам нужно добраться до товара, до его полей
благо нам в этом поможет line-item

Мой пример такой (он даже сложнее стал предыдущего), у меня есть ТОВАР у него, и этот товар привязан к термину таксономии, в котором есть поле НАБРАНО (сумма)
задача такая, что когда товар добавляется в корзину и оформляется (у меня можно только один товар в корзину делать) то нужно сумму товара (его цену) добавить к полю термина таксономии НАБРАНО, т.о. народ так сказать заказывая товар - выполняет действия подсчёт общей сумму с товара привязанный к термину

Сейчас будет немного коряво, т.к. так устроена рулза, в нашей задаче рулзу придётся писать с конца Smile

РИСУНОК X1
Происходит действие и мы уже вызываем компонент, параметры которого будут на X1-1 и X2
это означает что мы компоненту следом отправим все данные о ЗАКАЗЕ и его LINE-ITEM

РИСУНОК X3
Это как раз наш компонент с отправлеными параметрами
его цель таково что мы как бы узнаём тип LINE-ITEM (это почему название TITLE у товара)
т.е. у нас оказывается не просто заказ, а заказ в котором есть какие то даже строки товара, но это лишь строки товара, а не сам товар, поэтому мы вызываем следующий компонент - у которого уже параметры будут ORDER и PRODUCT (т.к. мы уже знаем что такое line item, нам теперь нужно узнать что же в товаре есть)

РИСУНОК X4
Это компонент в котором мы узнаем что есть тип товар под названием ТОВАР,
ТА-ДА! таким образом мы узнали что в заказе учавствует тип товара ТОВАР!
усё, теперь можно классические кондишн использовать ENTITY HAS FIELD, т.о. узнавая про поля в товаре
и далее делать с ними всё что угодно

вы можете заметить что в экшенах у меня есть ещё один компонент, этот компонент как раз идёт ещё дальше - в термин таксономии

Я надеюсь вам хоть немного это помогло, т.к. первый раз я без бутылки не понял, но теперь всё на свои места стало
будут вопросы, пишите

Аватар пользователя andreystrelkov andreystrelkov 3 апреля 2014 в 22:56

Ха!!! На другом проекте, где подобная задача, одна проблема меня застала врасплох, я вроде всё также добрался до PRODUCT, а теперь мне нужно добраться до PRODUCT DISPLAY, и от которого с помощью Entity reference до ноды, да вот беда!!! PRODUCT DISPLAY ссылается на PRODUCT-ы, а не наоборот, получается нет цепочки от товара до дисплея!!! и как же теперь быть? :///

Аватар пользователя andreystrelkov andreystrelkov 4 апреля 2014 в 17:19

сделал по бредовому, в тип product добавил поле Entity reference на конечную ноду до которой хочу добраться,и в итоге рулзой по циклу в случае изменения product display, она присваивает каждому товару сущность конечной ноды через entity reference

Аватар пользователя vasilyok vasilyok 19 октября в 18:46

andreystrelkov wrote: РИСУНОК X1

А где можно увидеть Ваши рисунки? Помогите пожалуйста, не могу решить аналогичную задачку уже несколько дней!