[development] Actions progress
John VanDyk
jvandyk at iastate.edu
Thu May 24 20:56:35 UTC 2007
Here's a progress report on actions-in-core.
Actions now have a new architecture. Instead of a single function, an
action now consists of several functions.
1. An implementation of hook_actions_info(). In this hook, an action
is described just like it was in the 'metadata' operation of the
previous action architecture. And supported hooks are declared:
function node_action_info() {
return array(
'node_make_sticky_action' => array(
'type' => 'node',
'description' => t('Make node sticky'),
'configurable' => FALSE,
'hooks' => array(
'nodeapi' => array('delete','insert','update', 'view'),
'comment' => array('delete','insert','update', 'view'),
),
),
);
}
Batchability has been dropped. Instead of actions declaring
themselves batchable and a node_save() being done at the end of the
batch, "Save node" is now a separate action.
2. The action itself:
/**
* Implementation of a Drupal action.
* Sets the sticky-at-top-of-list property of a node to 1.
*/
function node_make_sticky_action($context = array(), &$node) {
$node->sticky = 1;
$node->revision = 0;
watchdog('action', t('Made node id %id sticky', array('%id' => $node->nid)));
}
3. If the action is a configurable action such as the "Display a
message to the user" action, it needs to define a form, validate, and
submit function. The submit function is responsible for returning a
keyed array with parameters that will be stored and used when the
action is fired. E.g., (validate function not shown):
function system_message_action_form($edit) {
$form['message'] = array(
'#type' => 'textarea',
'#title' => t('Message'),
'#default_value' => isset($edit['message']) ? $edit['message'] : '',
'#required' => TRUE,
'#rows' => '8',
'#description' => t('The message to be displayed to the
current user. You may include the following variables: %site_name,
%username, %node_url, %node_type, %title, %teaser, %body.'),
);
return $form;
}
function system_message_action_form_submit($form_id, $form_values) {
return array('message' => $form_values['message']);
}
The HEAD version of actions is now stable enough to demonstrate the
assignment of actions to various hooks. It runs on Drupal 5
currently. I encourage you to check it out and give me feedback on
http://groups.drupal.org/actions or just in an email.
Hopefully we can have a facade action that hooks up to any Drupal
form id, and uses drupal_execute() to fire the action. That would
mean many Drupal forms become "scriptable" automatically.
John
More information about the development
mailing list