Но на этапе добавления условий и действий при создании правила по этому ивенту постоянно получаю ошибку, не дающую сохранить правило:
RulesEvaluationException: Argument <emclass="placeholder">node-unchanged</em> is missing. в функции RulesPlugin->setUpState() (строка 717 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\includes\rules.core.inc).
Если же я убираю из переменных ивента 'node-unchanged' и оставляю только 'node', ругается уже на связующее свойство:
EntityMalformedException: Отсутствует связующее свойство у сущности типа node. в функции entity_extract_ids() (строка 7929 в файле Z:\home\helpdeskpfr.local\www\includes\common.inc).
RulesEvaluationException: Argument <emclass="placeholder">node_original</em> is missing. в функции RulesPlugin->setUpState() (строка 717 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\includes\rules.core.inc).
Здравствуйте возможно я ошибаюсь.
По моему мнению ваше событие ждет переменную с типом node, но такого типа переменной не существует,
Цитирую
"type: The rules data type of the variable. All types declared in hook_rules_data_info() or supported by hook_entity_property_info() may be specified."
Посмотрите в других модулях которые используют рулы. Или более внимательнее читайте API.
Неверно. Ничего хорошего не случилось, снова при сохранении правила:
Notice: Undefined property: RulesReactionRule::$type в функции RulesNodeConditionType->execute() (строка 55 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\modules\node.eval.inc).
Комментарии
Спасибо, поштудировал. Но столкнулся с проблемами.
Есть функция в модуле, вызываемая JavaScript-ом, на обновление данных ноды:
<?php
/**
* Close ticket.
*/
function hdpfr_close_ticket($upd_nid) {
if ($upd_nid):
$term = hdpfr_get_tid_by_name('status', 'Closed');
if ($term != NULL):
$node = node_load($upd_nid);
$node->original = $node;
$node->field_status['und'][0]['tid'] = (int) $term;
field_attach_presave('node', $node);
field_attach_update('node', $node);
rules_invoke_event('hdrules_ticket_close', $node, $node->original);
return TRUE;
else:
return FALSE;
endif;
else:
return FALSE;
endif;
}
?>
Как видно, после обновления данных ноды вызывается rules_invoke_event('hdrules_ticket_close', $node, $node->original).
Вот код этого ивента:
<?php
/**
* Implements hook_rules_event_info().
*/
function hdrules_rules_event_info() {
$items = array(
'hdrules_ticket_close' => array(
'label' => t('Close ticket'),
'group' => 'HDRules',
'variables' => array(
'node' => array(
'type' => 'node',
'label' => t('Ticket'),
),
'node-unchanged' => array(
'type' => 'node',
'label' => t('Ticket (before change)'),
),
),
),
);
return $items;
}
?>
Но на этапе добавления условий и действий при создании правила по этому ивенту постоянно получаю ошибку, не дающую сохранить правило:
Если же я убираю из переменных ивента 'node-unchanged' и оставляю только 'node', ругается уже на связующее свойство:
Проверяйте наличие и тип $node->original
<?php
$node = node_load($upd_nid);
$node->original = $node;
?>
Не совсем понял, как проверить. У меня ошибка появляется не во время выполнения кода функции, а на этапе просто сохранения правила.
Возможно, нужно написать $node->original = clone($node);
При присваивании объектов присваиваются лишь ссылки на объект.
Не помогло. Ровно все то же самое.
<?php
$node = node_load($upd_nid);
//$node->original = $node;
$node->original = clone($node);
$node->field_status['und'][0]['tid'] = (int) $term;
field_attach_presave('node', $node);
field_attach_update('node', $node);
rules_invoke_event('hdrules_ticket_close', $node, $node->original);
?>
При попытке сохранить правило:
А где у вас в коде node_original, что-то не вижу. Вижу только original
Здравствуйте возможно я ошибаюсь.
По моему мнению ваше событие ждет переменную с типом node, но такого типа переменной не существует,
Цитирую
"type: The rules data type of the variable. All types declared in hook_rules_data_info() or supported by hook_entity_property_info() may be specified."
Посмотрите в других модулях которые используют рулы. Или более внимательнее читайте API.
Из того, что понял, видимо, для node надо декларировать свой тип в hook_rules_data_info() наследованием от entity:
<?php
function hook_rules_data_info() {
return array(
'node' => array(
'label' => t('content'),
'parent' => 'entity',
'group' => t('Node'),
)
);
}
?>
Верно?
Неверно. Ничего хорошего не случилось, снова при сохранении правила:
http://drupal.ru/node/134616#comment-698247 это не замечено как я понял?
Это упс. Я менял имена переменных, поэтому ошибка с node_original возникала на чуть поздней редакции кода, когда хук ивента выглядел так:
<?php
/**
* Implements hook_rules_event_info().
*/
function hdrules_rules_event_info() {
$items = array(
'hdrules_ticket_close' => array(
'label' => t('Close ticket'),
'group' => 'HDRules',
'variables' => array(
'node' => array(
'type' => 'node',
'label' => t('Ticket'),
),
'node_original' => array(
'type' => 'node',
'label' => t('Ticket (before change)'),
),
),
),
);
return $items;
}
?>