Здравствуйте, У меня следующая хотелка
Нужно при выводе товаров,показывать 2 числа ещё,
первое - это сколько на текущий момент человек его заказало
второе - сколько вообще раз его заказывали и получали (т.е. успешно закрытый заказ с этим продуктом)
первое что мне в голову приходит:
в типе продукта создать 2 десятичных поля: СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ и CКОЛЬКО РАЗ КУПЛЕНО ( по дефолту везде 0 )
* потом добавить правило, при завершении оформления заказа (Completing the checkout process)
выполнить действие Сalculate value, где с полем продукта СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ - +1
* а второе правило при смене статуса заказа на COMPLETED, аналогично менять значение у СКОЛЬКО СЕЙЧАС ЗАКАЗАЛИ -1, а CКОЛЬКО РАЗ КУПЛЕНО +1
Однако, меня настигло небольшое огорчение, при добавления действия Calculate value, не могу придти к редактированию ПОЛЯ ПРОДУКТА, там лишь
site:... (Информация о сайте)
commerce-order:... (Completed order)
Реально ли вообще придти к полю продукта?
Комментарии
Предлагаю решение - где вы решение предлагаете?
пардон, исправил
В Rules в Condition добавьте условия для двух ваших полей: Entity has field и соответствующие поля, т.о. получите доступ к своим полям в Actions.
т.е. я добавляю Condition - Entity has field
он предлагает выбрать Data Selector
а ниже ПОЛЕ, где я успешно нахожу свой тестовый field_kolvo_pokupok
он не понятно теперь, что он хочет от меня в Data Selector?
и что мне нужно выбрать, немного не понимаю в чём состоит логика на этом этапе, что я и для чего должен выбрать в этом Data selector
Data Selector => Commerce Order.
что то всё равно не получается
поздреваю что во втором скрине в Date Selector нужно как то оригинально прописать мой field_kolvo_pokupok
Добрый день. Можете скинуть подробные скриншоты как Вы решили свою задачу. Буду очень благодарен.
Нижний рисунок -> commerce-order -> там ваше поле должно появится...
понятно, т.е. по правильному, как я и думал, должно быть
commerce-order:filed_kolvo_pokupok
но к сожалению там такого нет :/
получается в Condition присваивание поля не получилось
Если же идти от действия Add product to the cart, то всё появляется commerce-order:filed_kolvo_pokupok
ОДНАКО! не выполняется арифметическое действие (Calculate a value), у всех значение по умолчанию 0, делаю при добавлении в корзину +1,
0 так и остаётся, если уже говорю указать значение определённое в действиях - то он меняет...
(правда в арифметическом действии есть снизу два поля Variable label и Variable name оставляю по умолчанию - может в этом косяк?)
вспомню, проверю, отпишусь завтра.
с Calculate разобрался
тороплюсь, не разбираюсь толком с функционалом,
Действие то он оказывается совершает, но он значение записывает в тот самый внизу 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»
Где вроде бы говорят что, это можно сделать помощью компонентов, но это для опытных, ЧЁРТ! а я ещё не опытныю, и не догоняю как это можно сделать :/
У меня схожая проблемма. Но при сет дата велью у меня например не видит переменной в которую был записан результат. делаю по видео уроку.
Ога, похоже это из этой же оперы, спасибо! поизучаю видео - что он в нём делает
Если поможет, буду рад. Может и Ваш опыт мне пригодится, а то уже вторые сутки торчу на этой проблемме.:(
Если у Вас есть что то более менее рабочее по вашей задаче, был бы благодарен либо за описание, либо ещё лучше за скриншоты
не шиша не получилось у меня поэтому видео, я как понял суть, он с помощью компонента просто выдирает значение веса из поля в типе продукта, потом это означение умножает на Quantity из заказа, и полученное умножает на 1000 (толи баксов толи чего)
апосля полученный результат (с помощью настройки компонента - Provider) он может вернуть/прочитать, при выполение своего основного Рулза - подсчёт цены на доставку текущего заказа... т.е. фишка в том что у него рулза идёт по посчёту стоимости, т.е. ему изначально доступно поле стоимости доставки у заказа
а в моём случае - оно изначально недоступно, т.к. я делаю операцию с заказом.
Т.е. я всё также повторил как он сделал для своей цели
Т.е. у меня компонент влазит внутри line items-ов и говорит что это commerce_product, а далече говорит что в commerce_product есть поля у типа продукта field_zakazalo_ludei
таким образом (в идеале он потом через loop посмотрит все продукты в текущем заказе) он с помощью компонента влазит внутрь продукта, читает текущее кол-во людей и плюсует к ним 1, а потом возращает это число переменной из компонента, которое потом по идее нужно просто сказать оригинальное поле field_zakazalo_ludei теперь должно быть равно переменной которая вернулась из компонента
что то - масло масляное написал - и похоже хрень какую то
(т.е. я компонентом то - молодец прочитал поле из продукта, и прибавил к нему, а вот как обратно то его запихать в зависимость от продукта который в заказе находится... )
Интересно... а у меня например по видео не получается ничего. Т.е. я все создаю до последнего экшена с сет велью а там у меня не высвечивается параметр с результатом вычислений.. ничего не пойму почему.
вот еще кое что, тут много всего может Вам и подойдет что нибудь.
Но я тоже чесн слово не пойму зачем он умножает на 1000, и что это 1000? Мне например надо сделать чтобы в зависимости от веса товара была стоимость расчитана с шагом в 100 грамм.
Расскажите свою задачу, может Вам смогу чем то помочь, раз пока со своей не могу справиться
Мне необходимо посчитать стоимость доставки товара в зависимости от его веса. Вес указал с помощью Phisical Field, такса $1,5 за сто грамм. Если необходимо то таксу можно взять и например 0,75 за 50 грамм. Вот.
Кстати вот что то по моему похожее на Ваш случай. Ну почти.
Буду очень признателен за любую посильную помощь. Я только начинаю и она мне ой как кстати...:)
В Вашем случае да, получается как на первом видео, так всё и есть
т.е. он создаёт Рулзу подсчёта общей стоимости доставки за всё что находиться в заказе, а делает это он
с помощью цикла (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) Повторяем сначала цикл со следующий позиции в заказе, и так пока не дойдём до последней
я так понял видео, у Вас + в том, что поле Общая сумма доставки , как бы сказать известно данной рулзе, и он с ним видит связь, у меня нет связи заказа с заказаными продуктами
Понятно. Я вот тоже хочу сделать в дальнейшем подсчет опта. Т.е. чтобы рачитывалась в заказе цена на опт. Но пока решил что для моих условий целесообразнее будет завести товары с оптовыми ценами и вывести их отдельно в раздел для оптовиков.
По поводу моего примера и описанных Вами пунктов, все хорошо, только я сейчас не соображу как все это реализовать.:( то ли двое суток сказываются бессонные то ли еще что.
я так понял что у нас с ним различаются только 3-е действие?
Усё, слава господи, похоже я разобрался
Суть в том, что есть 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ый просто ковыряется глубже, до полей типа продукта) по изменению поле материала
а рулзу - только лишь вызывает их в случае эвента, ну и прогоняет циклом по всем товарам заказа
Ну наконец то:) Поздравляю. Осталось мне разобраться со своим:)
Завтра попробую сымитировать Вашу задачу у себя
Хорошо, спасибо. А я попытаюсь поковырять у себя. Должен был еще сегодня уже сдать все, но вот перенес на завтра:(
Хотя если не получится то завалюсь:(
Удивительно, дошёл до конца расчёта цена за весь продукт в корзине (в зависимости от его кол-ва), пытаюсь записать результат последнего действия в PROVIDER shipping_cost_line_item, выбрав его как переменную в которую будем записывать, а переменная которая была последняя в вычислительных действиях - не доступна! Хотя только что спокойно делал CALCULATE с создаваемыми переменными :///
похоже дело было в 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руб)
Т.е. мне необходимо сменить тип переменной и в правиле прописать таксу?
Похоже да, он видать и рад присвоить значение этих вычислений переменной провайдерской, но Integer - переводится как ЦЕЛОЕ число, а там по ходу толи поле вес, толи вычисления приводят результаты не к целым
Таксу пока да, пропишите просто ручками, потестировать чтобы, если всё гуд, то её скорее всего можно выдрать тоже из текущего вида транспортировки (flat rate)
Хорошо, для присваивания таксы надо отдельно экшн делать или в существующих заменить какой то параметр? Его 1000 поменять на 100 и остальное все так же оставлять как в примере?
Вот на видео, на 5:15 он создаёт переменную, которая будет доступна рулзе которая запустила этот компонент, т.е. рулза которая запускается при экшене - подсчёт суммы доставки
а на 9:50 как раз видно, что он подсчитал всё (по одному товару в заказе), и присваивает результат как раз этой переменной с 5:15, получается сумму окончательно можно присваивать в рулзе которая вообще всё это запускает
А его 1000 я не совсем понял, потому что, он достаёт значение веса продукта, и умножает его на кол-во заказанного этого продукта (quantity), а потом зачем то умножает на 1000
хотя по логике вещей он получил общий вес одного вида продукта, он должен его разделить на весовку, которая стоит столько то
т.е. если отправляет 50грамм за 5$, то полученный вес делим на 50грамм и умножаем на 5$
т.е. мне надо на этом этапе вместо *1000 сделать /100?
ага (считая что при создании продуктов его весовка всегда будет написана в ГРАММАХ, т.к. такса идёт полтора доллара за сто ГРАММ)
а ниже добавить ещё действие, которые предыдущий результат умножит на Ваши 1,5$, это либо ручками писать(по тупому но по простейшему), либо рыться в Data Selection и искать значение поля которые вы заполняли при создании типа расчёта доставки, а именно (как на видео) By weight
ну и в итоге полученный результат присвоить переменной провайдерской
на этом действие компонента закончена
Огромное спасибо за помощь. Попробую сегдня вечером. Сейчас с дизом довожусь немного, и обязательно отпишусь о результате. Вдруг такая "разжевка" кому то поможет еще кроме меня:)
Все, победил. Я понял зачем он умножает на 1000. У него такса указана за фунт наверное, а вес он указывает просто 3, 5, вот и умножает чтобы было 5000 или 3000. Чес слово не знаю зачем. У себя я этот момент просто выкинул, не стал ни умножать ни делить, просто результат который выводит экшн который считает вес у меня, я умножил на свою таксу и получилось то что надо:) И все вывело. Огромнейшее спасибо за помощь:)
мозговой штурм помог обоим
Поздравляю! Наворотили конечно
Андрей, пожалуйста, опишите подробнее Ваше решение. Очень нужно сделать что-то подобное. У меня есть поле stock, выводиться с помощью модуля commerce stock, это количество товара на складе. После каждой покупки кол-во товара уменьшается на соответствующую величину.
Мне надо сделать еще одно поле, в котором будет выводиться общее количество уже заказанных товаров всеми пользователями. В итоге должны быть поля "доступно - 100 шт." и "куплено - 50 шт."
Если это возможно, экспортируйте компоненты и само правило, будет очень наглядно и понятно.
Заранее огромное спасибо!
В течении 1-2 дней подробно опишу логику поведения компонентов рулзы для вашего случая
Итак, логика в чём, для друпала как я понял, а точнее для коммерца такие понятие как ORDER, LINE-ITEM и PRODUCT это практически ничего неимеющие между собой сущности, это как НОДА и ТЕРМИН, вроде да они могут в паре работать, но абсолютно разные по логике
Поэтому допустим действие аля - после того как заказ оформлен то добавь к полю товара единичку не прокатит, т.к. действие происходит с ORDER - а он понятия не имеет что такое PRODUCT, в принципе не имеет, т.к. совсем другая сущность, и в ней другие поля и логика (хоть в них и учавствует название товара, цена и т.д., но это не они учавствует это грубо говоря остаточная информация о них в процессе формирование заказа, допустим это просто тупо текст)
однако есть выход, и он универсален не только для коммерца, а везде
его логика заключается в том, что.
цепочка создания заказа проходит через 3 сущности
1) PRODUCT
2) LINE-ITEM (очень загадочная сущность, что то вроде строка товара в заказе :-S )
3) ORDER
в нашем и вашем случае у нас экшн идёт от заказа, и нам нужно добраться до товара, до его полей
благо нам в этом поможет line-item
Мой пример такой (он даже сложнее стал предыдущего), у меня есть ТОВАР у него, и этот товар привязан к термину таксономии, в котором есть поле НАБРАНО (сумма)
задача такая, что когда товар добавляется в корзину и оформляется (у меня можно только один товар в корзину делать) то нужно сумму товара (его цену) добавить к полю термина таксономии НАБРАНО, т.о. народ так сказать заказывая товар - выполняет действия подсчёт общей сумму с товара привязанный к термину
Сейчас будет немного коряво, т.к. так устроена рулза, в нашей задаче рулзу придётся писать с конца
РИСУНОК X1
Происходит действие и мы уже вызываем компонент, параметры которого будут на X1-1 и X2
это означает что мы компоненту следом отправим все данные о ЗАКАЗЕ и его LINE-ITEM
РИСУНОК X3
Это как раз наш компонент с отправлеными параметрами
его цель таково что мы как бы узнаём тип LINE-ITEM (это почему название TITLE у товара)
т.е. у нас оказывается не просто заказ, а заказ в котором есть какие то даже строки товара, но это лишь строки товара, а не сам товар, поэтому мы вызываем следующий компонент - у которого уже параметры будут ORDER и PRODUCT (т.к. мы уже знаем что такое line item, нам теперь нужно узнать что же в товаре есть)
РИСУНОК X4
Это компонент в котором мы узнаем что есть тип товар под названием ТОВАР,
ТА-ДА! таким образом мы узнали что в заказе учавствует тип товара ТОВАР!
усё, теперь можно классические кондишн использовать ENTITY HAS FIELD, т.о. узнавая про поля в товаре
и далее делать с ними всё что угодно
вы можете заметить что в экшенах у меня есть ещё один компонент, этот компонент как раз идёт ещё дальше - в термин таксономии
Я надеюсь вам хоть немного это помогло, т.к. первый раз я без бутылки не понял, но теперь всё на свои места стало
будут вопросы, пишите
Андрей, огромное спасибо. Все удалось сделать. Ура!
Ха!!! На другом проекте, где подобная задача, одна проблема меня застала врасплох, я вроде всё также добрался до PRODUCT, а теперь мне нужно добраться до PRODUCT DISPLAY, и от которого с помощью Entity reference до ноды, да вот беда!!! PRODUCT DISPLAY ссылается на PRODUCT-ы, а не наоборот, получается нет цепочки от товара до дисплея!!! и как же теперь быть? :///
сделал по бредовому, в тип product добавил поле Entity reference на конечную ноду до которой хочу добраться,и в итоге рулзой по циклу в случае изменения product display, она присваивает каждому товару сущность конечной ноды через entity reference
А где можно увидеть Ваши рисунки? Помогите пожалуйста, не могу решить аналогичную задачку уже несколько дней!