[РЕШЕНО]Доступ к custom fields в Rules

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

Аватар пользователя passtoor passtoor 13 октября 2013 в 19:39

Кто может подсказать, желательно поподробее, как обойти проблему в Rules связанную с доступом к созданным собственным полям ?
Why can't I access my custom fields in Rules?
Особенно интересует доступ к полям товара в commerce/

Drupal 7.23 & Commerce Stock API 7.x-2.0-rc1 & Rules 7.x-2.5+2-dev

Задача под commerce реализовать работу со складским учетом.
Добавил к Типу Товара - Товар, дополнительные поля: Склад, Резерв, В производстве, Заказано
Line Item так же имеет доп. поле Отгрузка Список с двумя варантами Со склада или Под заказ.
Соответственно через Rules есть задумка после оформления заказа, перемещать Товар в Резерв при Отгрузке Со склада и Отгрузке Под заказ увиличивать количество Заказаного Товара.

И практически сразу же споткнулся и не могу разобраться, нет из Rules доступ до тех полей оторые я сам добавил к Товару.
С меня 300р вебмани на пиво если все получится Smile

Комментарии

Аватар пользователя serega111 serega111 13 октября 2013 в 19:59

В условиях нужно добавить Entity has field и выбрать нужное поле. Тогда поле будет доступно и ниже в условиях и в действиях

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

Дык это понятно. НО.
Условие: После обновления существующей commerce line item или Окончание процесса оформления commerce-order

А доступ нужен к полю commerce-product:field-stock

Если я добавляю Условие Entity has field то сущность доступна только line item а не product, соответственно если я все же добавлю условие line item имеет поле field-stock то оно никогда не выполниться.

Аватар пользователя serega111 serega111 13 октября 2013 в 20:37

Так бы и объяснили )
тогда в действиях загрузите продукт из поля commerce_product. Это поле всегда есть у commerce_line_item. Далее создайте копмоненту типа Rule. Там нужно указать тип входных и выходных параметров, потом можно добавить условия и действия. Дальше эту компоненту можно добавить к действиям в основном правиле.

Аватар пользователя passtoor passtoor 13 октября 2013 в 20:55

Можно подробнее ПОЖАЛУЙСТА!

« тогда в действиях загрузите продукт из поля commerce_product. Это поле всегда есть у commerce_line_item. »
У меня получилось вот что , до поля добрался но чую не правильно ....

Цикл
Параметр: Список: [commerce-line-item:order...
Элемент списка: Текущий элемент списка (list_item)

Fetch entity by property
Параметр: Тип сущности: Commerce Товар, Свойство: Артикул, Значение: [list-item:line-item-label]
Предоставляет переменные: Извлекаемая сущность (entity_fetched)

Извлечь сущность по id
Параметр: Тип сущности: Commerce Товар, Идентификатор: [entity-fetched:0:product-id]
Предоставляет переменные: Извлекаемая сущность (entity_fetched2)

Аватар пользователя serega111 serega111 13 октября 2013 в 21:31

давайте так. вы мне назовите событие, которое используете, и какие поля каких сущностей вам нужно получить. Я завтра создам правило и экспортирую. А вы для себя его уже потом подредактируете. Там дел на 5 минут, а так мы долго будем друг друга не понимать.

Аватар пользователя passtoor passtoor 13 октября 2013 в 21:48

Ок, но я хочу сказать Вы меня уже пнули в нужном направлении, кое что получилось, наверно не оптимально, но все же.

Т.е. изначально задача такая. Ставить товар в резерв сразу же, как только Товар попал в корзину.
Как я понимаю надо обрабатывать два события:
Событие: После обновления существующей commerce line item
Событие1: После добавления товара в корзину

В Товаре добавлено два поля Склад и Резерв, как только товар добавлен в корзину товар со склада перемещается на резерв.

У меня сейчас кое как получилось, после того как я суть понял (вроде), т.е. Я создаю Компоненты Rules это типа функции, с базовыми действиями, 1.Уменьшить склад 2. Увеличить резерв . Параметрами в них передаю ссылку на сущность и количество. В основном Rules я их использую и передаю в них значение. Профит!
Но хотелось бы посмотреть, как правильно делать ....

Аватар пользователя serega111 serega111 14 октября 2013 в 9:34

Это основное правило
<?php
{ "rules_rule_for_change_stock_and_reserve" : {
"LABEL" : "rule to change stock and reserve",
"PLUGIN" : "reaction rule",
"REQUIRES" : [ "rules", "commerce_cart", "entity" ],
"ON" : [ "commerce_cart_product_add", "commerce_line_item_update" ],
"IF" : [
{ "entity_has_field" : { "entity" : [ "commerce-line-item" ], "field" : "commerce_product" } }
],
"DO" : [
{ "entity_fetch" : {
"USING" : {
"type" : "commerce_product",
"id" : [ "commerce-line-item:commerce-product:product-id" ]
},
"PROVIDE" : { "entity_fetched" : { "product" : "Product" } }
}
},
{ "component_rules_rule_component_for_action_on_a_field" : { "product" : [ "product" ] } }
]
}
}
?>
Это компонента
<?php
{ "rules_rule_component_for_action_on_a_field" : {
"LABEL" : "rule component for action on a field",
"PLUGIN" : "rule",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "product" : { "label" : "Product", "type" : "commerce_product" } },
"IF" : [
{ "entity_has_field" : { "entity" : [ "product" ], "field" : "field_test" } }
],
"DO" : [ { "data_set" : { "data" : [ "product:status" ], "value" : 0 } } ]
}
}
?>
Тут в компоненту не передано количество и стоит не то действие, но думаю это не важно, отредактировать сможете.
Выше вы вроде правильно описали все, но можете еще раз проверить.

Аватар пользователя passtoor passtoor 14 октября 2013 в 10:27

Да, у меня как я и предполагал, было сделано через костыль. Я выбирал не поле commerce_product, а сразу поле field_test. Во все остальном вроде получилось. Жду № вебмани