Циклический просмотр терминов таксономии и добавление их в поле ссылки на термин с правилами


У меня есть тип контента под названием Элементы.

В элементах у меня есть 3 неограниченных поля ссылки на термин.

Местоположение (field_location_pi)
Фаза (field_phases_pi)
Структура (field_structure_type_pi)

Я создаю систему детализации, используя ограничение на опорные параметры.

Таким образом, во втором типе контента вы бы выбрали элемент, затем поле таксономии местоположения было бы ограничено теми, которые обозначены этим элементом, затем этапы были бы ограничено теми, кто находится в местах, а структура - теми, кто находится на этапах.

Чтобы это работало, мне нужно иметь справочное поле в каждой таксономии, которое ссылается на таксономию, которая ее ограничивает.

Например

Элемент называется Заливкой цемента. Этот элемент имеет 3 возможных местоположения с тегами: Север, Юг, Запад. В нем также помечены термины 2 этапов: Первый, Второй. Наконец, в нем также есть два термина, обозначающих структуры: тротуар, стена.

Итак, Местоположение Термины таксономии имеют поле ссылки на сущность (field_pay_items_loc), которое ссылается на все элементы, помеченные терминами.

Затем Термины таксономии фазы имеют поле ссылки на термин (field_location_ref), которое ссылается на все общие местоположения в Элементах.

Затем термины структурной таксономии имеют поле ссылки на термин, которое ссылается на все этапы, которые у них есть общего в элементах.

Для дальнейшей экстраполяции на вышеупомянутый пример:

Каждый Термин местоположения: Север & Юг & На Западе есть ссылка на один пункт: Залить цемент

Каждый термин фазы: Первый & Во-вторых есть ссылки на 3 местоположения: Север, Юг, Запад

Каждый термин структуры: Стена & Тротуар имеет 2 фазы, на которые ссылаются: Первая, Вторая

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

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

Я с трудом пробирался через компоненты (я смотрел это видео: https://youtu.be/Bol6kNwVenA о создании нескольких обратных ссылок для руководства), и я не могу заставить его работать с таксономиями. Любой совет был бы очень признателен.

{ "rules_add_pi_to_phase" : {
    "LABEL" : "Add item to Phase",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : {
      "node_update--item" : { "bundle" : "item" },
      "node_insert--item" : { "bundle" : "item" }
    },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node:field-phases-pi" ], "field" : "field_pay_items_loc" } }
    ],
    "DO" : [
      { "data_set" : {
          "data" : [ "node:field-phases-pi:field-items-loc" ],
          "value" : [ "node" ]
        }
      },
      { "data_set" : {
          "data" : [ "node:field-phases-pi:field-location-ref" ],
          "value" : [ "node:field-location-pi" ]
        }
      }
    ]
  }
}

Вот правило, которое у меня есть до сих пор, чтобы пройти через все этапы в элементе. Без компонента.

{ "rules_add_pi_to_phase" : {
    "LABEL" : "Add PI to Phase",
    "PLUGIN" : "reaction rule",
    "ACTIVE" : false,
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : {
      "node_update--pay_item" : { "bundle" : "pay_item" },
      "node_insert--pay_item" : { "bundle" : "pay_item" }
    },
    "IF" : [
      { "node_is_of_type" : {
          "node" : [ "node" ],
          "type" : { "value" : { "pay_item" : "pay_item" } }
        }
      }
    ],
    "DO" : [
      { "LOOP" : {
          "USING" : { "list" : [ "node:field-phases-pi" ] },
          "ITEM" : { "phase_item" : "Current Phase" },
          "DO" : []
        }
      }
    ]
  }
}

Я только что понял, что думал об этом неправильно. Мне нужно получить все термины фаз, на которые ссылаются (field_phases_pi) в элементе, И все термины типов структур, на которые ссылаются (field_structure_type_pi) в элементе тоже. Затем мне нужно добавить все термины фаз в указанное поле (field_phases_ref) ко всем ссылочным терминам типов структур. Так что, я думаю, это будет несколько циклов.

Вот моя попытка создать компонент, но я знаю, что это неправильно, потому что, когда я пытаюсь добавить его в правило, оно не позволяет мне выбирать данные, и ему нужны идентификаторы терминов таксономии, с которыми я не знаю, что делать...

{ "rules_add_phase_to_structure_type" : {
    "LABEL" : "Add Phase To Structure Type",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "phase_term" : { "label" : "Phase To Add", "type" : "list\u003Ctaxonomy_term\u003E" },
      "structure_term" : {
        "label" : "Structure Type To Add To",
        "type" : "list\u003Ctaxonomy_term\u003E"
      }
    },
    "DO" : [
      { "LOOP" : {
          "USING" : { "list" : [ "structure-term" ] },
          "ITEM" : { "structure_item" : "Current Structure item" },
          "DO" : [
            { "entity_fetch" : {
                "USING" : { "type" : "taxonomy_term", "id" : [ "structure-item:tid" ] },
                "PROVIDE" : { "entity_fetched" : { "fetched_structure" : "Fetched structure" } }
              }
            },
            { "list_add" : {
                "list" : [ "phase-term" ],
                "item" : [ "structure-item" ],
                "unique" : "1"
              }
            }
          ]
        }
      }
    ]
  }
}
Author: Dab0416, 2018-02-03

2 answers

Похоже, вы могли бы просто использовать действие правил "Добавить в список".

Для полей с несколькими значениями вы не должны использовать "Установить значение данных" (похоже, это то, что вы пробовали, распространенная ошибка при использовании правил для таких полей).

Обратитесь к ответу на " Как задать несколько значений для поля ссылки на неограниченный срок с правилами " для "некоторых" более подробных сведений...

 1
Author: Pierre.Vriens, 2018-02-03 19:43:02

Это делается для того, чтобы Добавить термин привязки местоположения к правильным терминам фазы.

Во-первых: я изменил свое условие на "объект имеет поле", "узел", "field_phases_pi"

Затем я прошелся по этапам в пункте оплаты

Затем я добавляю элемент оплаты в поле ссылки на сущность элемента оплаты на каждом из этапов. (Это был скорее тест, так как я уже знал, как это сделать)

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

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

Как только я получил циклы для возврата правильного значения, это был просто вопрос выбора правильного поля ссылки в каждой фазе (элемент фазы: поле-местоположение-ссылка) и добавления элемента loc-ref из цикла.

Затем я создал то же правило (за исключением таргетинга на разные термины) для добавления фазы в тип структуры. Поэтому у меня будет 3 отдельных правила, возможно, есть способ объединить их, но я в восторге от того, что зашел так далеко!

Вот экспорт:

{ "rules_location_to_phase" : {
"LABEL" : "Add Location To Phase",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : {
  "node_update--pay_item" : { "bundle" : "pay_item" },
  "node_insert--pay_item" : { "bundle" : "pay_item" }
},
"IF" : [
  { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_phases_pi" } }
],
"DO" : [
  { "LOOP" : {
      "USING" : { "list" : [ "node:field-phases-pi" ] },
      "ITEM" : { "phase_item" : "Phase item" },
      "DO" : [
        { "list_add" : {
            "list" : [ "phase-item:field-pay-items-loc" ],
            "item" : [ "node" ],
            "unique" : "1"
          }
        },
        { "LOOP" : {
            "USING" : { "list" : [ "node:field-location-pi" ] },
            "ITEM" : { "loc_ref_item" : "Location Ref item" },
            "DO" : [
              { "drupal_message" : { "message" : "Loc-ref-item:name value:[loc-ref-item:name]\r\n\r\nPhase Item Name Value: [phase-item:name]" } },
              { "list_add" : {
                  "list" : [ "phase-item:field-location-ref" ],
                  "item" : [ "loc-ref-item" ],
                  "unique" : "1"
                }
              }
            ]
          }
        }
      ]
    }
   }
  ]
 }
}
 1
Author: Dab0416, 2018-02-06 19:47:23