Программный запуск правила Rules

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

Комментарии

Аватар пользователя Shipovnix Shipovnix 18 сентября 2017 в 13:56

Спасибо, поштудировал. Но столкнулся с проблемами.
Есть функция в модуле, вызываемая 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;
}
?>

Но на этапе добавления условий и действий при создании правила по этому ивенту постоянно получаю ошибку, не дающую сохранить правило:

RulesEvaluationException: Argument <em class="placeholder">node-unchanged</em> is missing. в функции RulesPlugin->setUpState() (строка 717 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\includes\rules.core.inc).
Аватар пользователя Shipovnix Shipovnix 18 сентября 2017 в 13:56

Если же я убираю из переменных ивента 'node-unchanged' и оставляю только 'node', ругается уже на связующее свойство:

EntityMalformedException: Отсутствует связующее свойство у сущности типа node. в функции entity_extract_ids() (строка 7929 в файле Z:\home\helpdeskpfr.local\www\includes\common.inc).
Аватар пользователя Shipovnix Shipovnix 19 сентября 2017 в 8:12

Не совсем понял, как проверить. У меня ошибка появляется не во время выполнения кода функции, а на этапе просто сохранения правила.

Аватар пользователя gun_dose gun_dose 18 сентября 2017 в 20:18
1

Возможно, нужно написать $node->original = clone($node);
При присваивании объектов присваиваются лишь ссылки на объект.

Аватар пользователя Shipovnix Shipovnix 19 сентября 2017 в 7:30

Не помогло. Ровно все то же самое.

<?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);
?>

При попытке сохранить правило:

RulesEvaluationException: Argument <em class="placeholder">node_original</em> is missing. в функции RulesPlugin->setUpState() (строка 717 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\includes\rules.core.inc).
Аватар пользователя BatKor BatKor 20 сентября 2017 в 11:53
1

Здравствуйте возможно я ошибаюсь.
По моему мнению ваше событие ждет переменную с типом 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.

Аватар пользователя Shipovnix Shipovnix 20 сентября 2017 в 13:03

Из того, что понял, видимо, для node надо декларировать свой тип в hook_rules_data_info() наследованием от entity:

<?php
function hook_rules_data_info() {
  return array(
    
'node' => array(
      
'label' => t('content'), 
      
'parent' => 'entity'
      
'group' => t('Node'),
    )
  );
}
?>

Верно?

Аватар пользователя Shipovnix Shipovnix 20 сентября 2017 в 15:17

Неверно. Ничего хорошего не случилось, снова при сохранении правила:

Notice: Undefined property: RulesReactionRule::$type в функции RulesNodeConditionType->execute() (строка 55 в файле Z:\home\helpdeskpfr.local\www\sites\all\modules\rules\modules\node.eval.inc).
Аватар пользователя Shipovnix Shipovnix 21 сентября 2017 в 7:11

Это упс. Я менял имена переменных, поэтому ошибка с 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;
}
?>