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 действий.
Код
<?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;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии