Клонируйте узлы и изменяйте поля с помощью правил и VBO


Я пытаюсь создать компонент правил, который клонирует выбранные узлы, а затем изменяет некоторые поля, используя правила , VBO и Клон узла.

VBO и клонирование узлов работают нормально, но я не могу впоследствии изменять значения каждого поля в клонах. После действия "Клонировать узел" я могу добавить действие "установить данные в значение", чтобы изменить только поля основного узла (например, статус, привязка...), но селектор не показывает мне другие мои поля, определенные в содержимом введите (например, клонированный узел: field_xyz).

Я также пытался использовать Бонусный пакет правил вместо клонирования узлов для дублирования узлов, но безуспешно: та же проблема.

После некоторых исследований я попытался принудительно сохранить действие сущности на клонированном узле, а затем попытался загрузить сущность из cloned-nid, но я не могу выбрать поля своего типа контента, чтобы изменить их.

Я также добавил условие сверху, например "Контент - это тип |сущность имеет поле |сущность - это пакет", но ничего происходит.

Наверное, я что-то упускаю. Есть идеи?

Заранее благодарю

Author: Cheope, 2015-05-20

2 answers

Я решил использовать пользовательский PHP-код в своем компоненте вместо действия клонирования узла, поэтому я хотел бы поделиться этим с вами:

// load the original node
$node = node_load($node_parameter->nid);
$node->nid = null;
$node->vid = null;
// park the new node
node_object_prepare($node);
// reset fields
$node->uid = 1;
$node->status = 1;
$node->path = null;
$node->created = 1432072800;
$node->title = $site->current_date;
$node->field_one['und'][0]['target_id']= 11530;
$node->field_two['und'][0]['value']= 'my text';
unset($node->field_three);
// save the new node
node_save($node);
// flush
unset($node);  

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

Итак, еще одно решение, которое я попробовал, - создать компонент, который просто клонирует узел, переданный VBO. А затем создайте отдельное правило, которое реагирует на событие "после клонирования узла", и введите в него условие "тип содержимого" и все необходимые мне действия "установить значение данных".

И это работает.

В любом случае я предпочитаю первое решение, поэтому я могу хранить все, что мне нужно, в одном месте и избегать использования модуля клонирования узлов. Я беспокоился о производительности выполнения PHP и node_load() в Правила, но всего за несколько минут я успешно клонировал и обновил 2260 узлов.

Спасибо всем

 0
Author: Cheope, 2015-05-22 09:36:22

@Cheope точно решил проблему:

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

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

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

 0
Author: , 2016-01-31 02:21:20