actions_do

Хочешь помочь с переводом? Это очень просто и быстро. Лишь зарегистрируйся, и можешь тут же начать переводить.

includes/actions.inc, строка 41

Версии
6
actions_do($action_ids, &$object, $context = NULL, $a1 = NULL, $a2 = NULL)

Выполняет заданный список действий путем выполнения соответствующих коллбэков.

Этой функции передаются ID действий, которые должны быть выполнены, затем она, используя запросы к базе, находит коллбэки, привязанные к этим действиям. Затем вызывает каждый коллбэк используя следующий вызов: $function($object, $context, $a1, $a2) -, где $function - это имя функции, записанное в соответствии с описанием действия; к примеру: foo($object, $context).

Параметры

$action_ids ID действия для выполнения. Может быть одиночным ID или массивом ID. ID инстанций (копий какого-либа действия) будут численными; ID одиночных действий - именами функций.

$object Параметр, который будет передан коллбэку. Обычно это объект, над которым выполняется действие: нода, юзер, объект коммента и т.п. Если действие не выполняется ни над каким-либо объектом, передаётся dummy-объект. Это необходимо для поддержки объектных ссылок в PHP 4.

$context Параметр, который будет передан коллбэку. $context - это ассоциативный массив, хранящий доп. информацию о том, что происходит в момент выполнения коллбэка. Обычно, $context['hook'] и $context['op'] определяет, какая хук-op комбинация привела к вызову actions_do().

$a1 Параметр, который будет передан коллбэку.

$a2 Параметр, который будет передан коллбэку.

Возвращаемое значение

Ассоциативный массив, включающий результат выполнения функций, выполняющих действия. Ключами выступают ID действий.

▾ 5 функции вызывают actions_do()

trigger_comment in modules/trigger/trigger.module
Реализация hook_comment().
trigger_cron in modules/trigger/trigger.module
Реализация hook_cron().
trigger_nodeapi in modules/trigger/trigger.module
Реализация hook_nodeapi().
trigger_taxonomy in modules/trigger/trigger.module
Реализация hook_taxonomy().
trigger_user in modules/trigger/trigger.module
Реализация hook_user().

Код

<?php
function actions_do($action_ids, &$object, $context = NULL, $a1 = NULL, $a2 = NULL) {
  // $stack tracks the number of recursive calls.
  static $stack;
  $stack++;
  if ($stack > variable_get('actions_max_stack', 35)) {
    watchdog('actions', 'Stack overflow: too many calls to actions_do(). Aborting to prevent infinite recursion.', array(), WATCHDOG_ERROR);
    return;
  }
  $actions = array();
  $available_actions = actions_list();
  $result = array();
  if (is_array($action_ids)) {
    $where = array();
    $where_values = array();
    foreach ($action_ids as $action_id) {
      if (is_numeric($action_id)) {
        $where[] = "OR aid = '%s'";
        $where_values[] = $action_id;
      }
      elseif (isset($available_actions[$action_id])) {
        $actions[$action_id] = $available_actions[$action_id];
      }
    }

    // When we have action instances we must go to the database to
    // retrieve instance data.
    if ($where) {
      $where_clause = implode(' ', $where);
      // Strip off leading 'OR '.
      $where_clause = '('. strstr($where_clause, " ") .')';
      $result_db = db_query('SELECT * FROM {actions} WHERE '. $where_clause, $where_values);
      while ($action = db_fetch_object($result_db)) {
        $actions[$action->aid] = $action->parameters ? unserialize($action->parameters) : array();
        $actions[$action->aid]['callback'] = $action->callback;
        $actions[$action->aid]['type'] = $action->type;
      }
    }

    // Fire actions, in no particular order.
    foreach ($actions as $action_id => $params) {
      if (is_numeric($action_id)) { // Configurable actions need parameters.
        $function = $params['callback'];
        $context = array_merge($context, $params);
        $result[$action_id] = $function($object, $context, $a1, $a2);
      }
      // Singleton action; $action_id is the function name.
      else {
        $result[$action_id] = $action_id($object, $context, $a1, $a2);
      }
    }
  }
  // Optimized execution of single action.
  else {
    // If it's a configurable action, retrieve stored parameters.
    if (is_numeric($action_ids)) {
      $action = db_fetch_object(db_query("SELECT * FROM {actions} WHERE aid = '%s'", $action_ids));
      $function = $action->callback;
      $context = array_merge($context, unserialize($action->parameters));
      $result[$action_ids] = $function($object, $context, $a1, $a2);
    }
    // Singleton action; $action_ids is the function name.
    else {
      $result[$action_ids] = $action_ids($object, $context, $a1, $a2);
    }
  }
  $stack--;
  return $result;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вход в систему