2007-10-31 16:30:14 +00:00
< ? php
// $Id$
/**
* @ file
* Admin page callbacks for the trigger module .
*/
/**
2009-09-19 11:07:37 +00:00
* Builds the form that allows users to assign actions to triggers .
2007-10-31 16:30:14 +00:00
*
2009-09-19 11:07:37 +00:00
* @ param $module_to_display
* Which tab of triggers to display . E . g . , 'node' for all
* node - related triggers .
2007-10-31 16:30:14 +00:00
* @ return
* HTML form .
*/
2009-09-19 11:07:37 +00:00
function trigger_assign ( $module_to_display = NULL ) {
2007-10-31 16:30:14 +00:00
// If no type is specified we default to node actions, since they
// are the most common.
2009-09-19 11:07:37 +00:00
if ( ! isset ( $module_to_display )) {
2009-07-20 18:51:36 +00:00
drupal_goto ( 'admin/structure/trigger/node' );
2007-10-31 16:30:14 +00:00
}
2009-05-12 08:37:45 +00:00
$build = array ();
2009-09-19 11:07:37 +00:00
$trigger_info = module_invoke_all ( 'trigger_info' );
drupal_alter ( 'trigger_info' , $trigger_info );
foreach ( $trigger_info as $module => $hooks ) {
if ( $module == $module_to_display ) {
foreach ( $hooks as $hook => $description ) {
$form_id = 'trigger_' . $hook . '_assign_form' ;
$build [ $form_id ] = drupal_get_form ( $form_id , $module , $hook , $description [ 'label' ]);
2007-10-31 16:30:14 +00:00
}
}
}
2009-05-12 08:37:45 +00:00
return $build ;
2007-10-31 16:30:14 +00:00
}
/**
* Confirm removal of an assigned action .
*
2009-09-19 11:07:37 +00:00
* @ param $module
* The tab of triggers the user will be directed to after successful
* removal of the action , or if the confirmation form is cancelled .
2007-10-31 16:30:14 +00:00
* @ param $hook
* @ param $aid
* The action ID .
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see trigger_unassign_submit ()
2007-10-31 16:30:14 +00:00
*/
2009-09-19 11:07:37 +00:00
function trigger_unassign ( $form , $form_state , $module , $hook = NULL , $aid = NULL ) {
if ( ! ( $hook && $aid )) {
drupal_goto ( 'admin/structure/trigger' );
2007-10-31 16:30:14 +00:00
}
$form [ 'hook' ] = array (
'#type' => 'value' ,
'#value' => $hook ,
);
2009-09-19 11:07:37 +00:00
$form [ 'module' ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'value' ,
2009-09-19 11:07:37 +00:00
'#value' => $module ,
2007-10-31 16:30:14 +00:00
);
$form [ 'aid' ] = array (
'#type' => 'value' ,
'#value' => $aid ,
);
$action = actions_function_lookup ( $aid );
$actions = actions_get_all_actions ();
2009-09-19 11:07:37 +00:00
$destination = 'admin/structure/trigger/' . $module ;
2007-10-31 16:30:14 +00:00
return confirm_form ( $form ,
2009-09-19 11:07:37 +00:00
t ( 'Are you sure you want to unassign the action %title?' , array ( '%title' => $actions [ $action ][ 'label' ])),
2007-10-31 16:30:14 +00:00
$destination ,
t ( 'You can assign it again later if you wish.' ),
t ( 'Unassign' ), t ( 'Cancel' )
);
}
2009-09-19 11:07:37 +00:00
/**
* Submit callback for trigger_unassign () form .
*/
2007-10-31 16:30:14 +00:00
function trigger_unassign_submit ( $form , & $form_state ) {
2009-11-06 03:59:06 +00:00
if ( $form_state [ 'values' ][ 'confirm' ] == 1 ) {
$aid = actions_function_lookup ( $form_state [ 'values' ][ 'aid' ]);
2009-05-29 19:15:08 +00:00
db_delete ( 'trigger_assignments' )
2009-11-06 03:59:06 +00:00
-> condition ( 'hook' , $form_state [ 'values' ][ 'hook' ])
2009-05-29 19:15:08 +00:00
-> condition ( 'aid' , $aid )
-> execute ();
2007-10-31 16:30:14 +00:00
$actions = actions_get_all_actions ();
2009-09-19 11:07:37 +00:00
watchdog ( 'actions' , 'Action %action has been unassigned.' , array ( '%action' => check_plain ( $actions [ $aid ][ 'label' ])));
drupal_set_message ( t ( 'Action %action has been unassigned.' , array ( '%action' => $actions [ $aid ][ 'label' ])));
2009-11-06 03:59:06 +00:00
$form_state [ 'redirect' ] = 'admin/structure/trigger/' . $form_state [ 'values' ][ 'module' ];
2007-10-31 16:30:14 +00:00
}
else {
2009-07-20 18:51:36 +00:00
drupal_goto ( 'admin/structure/trigger' );
2007-10-31 16:30:14 +00:00
}
}
/**
2009-09-19 11:07:37 +00:00
* Returns the form for assigning an action to a trigger .
2007-10-31 16:30:14 +00:00
*
2009-09-19 11:07:37 +00:00
* @ param $module
* The name of the trigger group , e . g . , 'node' .
2007-10-31 16:30:14 +00:00
* @ param $hook
2009-09-19 11:07:37 +00:00
* The name of the trigger hook , e . g . , 'node_insert' .
* @ param $label
* A plain English description of what this trigger does .
2007-10-31 16:30:14 +00:00
*
* @ ingoup forms
* @ see trigger_assign_form_validate ()
* @ see trigger_assign_form_submit ()
*/
2009-09-19 11:07:37 +00:00
function trigger_assign_form ( $form , $form_state , $module , $hook , $label ) {
$form [ 'module' ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'hidden' ,
2009-09-19 11:07:37 +00:00
'#value' => $module ,
2007-10-31 16:30:14 +00:00
);
2009-09-19 11:07:37 +00:00
$form [ 'hook' ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'hidden' ,
2009-09-19 11:07:37 +00:00
'#value' => $hook ,
2007-10-31 16:30:14 +00:00
);
// All of these forms use the same validate and submit functions.
$form [ '#validate' ][] = 'trigger_assign_form_validate' ;
$form [ '#submit' ][] = 'trigger_assign_form_submit' ;
$options = array ();
$functions = array ();
2009-09-19 11:07:37 +00:00
// Restrict the options list to actions that declare support for this hook.
2007-10-31 16:30:14 +00:00
foreach ( actions_list () as $func => $metadata ) {
2009-09-19 11:07:37 +00:00
if ( in_array ( 'any' , $metadata [ 'triggers' ]) || in_array ( $hook , $metadata [ 'triggers' ])) {
2007-10-31 16:30:14 +00:00
$functions [] = $func ;
}
}
foreach ( actions_actions_map ( actions_get_all_actions ()) as $aid => $action ) {
if ( in_array ( $action [ 'callback' ], $functions )) {
2009-09-19 11:07:37 +00:00
$options [ $action [ 'type' ]][ $aid ] = $action [ 'label' ];
2007-10-31 16:30:14 +00:00
}
}
2009-09-19 11:07:37 +00:00
$form [ $hook ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'fieldset' ,
2009-11-02 04:36:25 +00:00
// !description is correct, since these labels are passed through t() in
// hook_trigger_info().
'#title' => t ( 'Trigger: !description' , array ( '!description' => $label )),
'#theme' => 'trigger_display' ,
2009-09-19 11:07:37 +00:00
);
// Retrieve actions that are already assigned to this hook combination.
$actions = trigger_get_assigned_actions ( $hook );
$form [ $hook ][ 'assigned' ][ '#type' ] = 'value' ;
$form [ $hook ][ 'assigned' ][ '#value' ] = array ();
foreach ( $actions as $aid => $info ) {
$form [ $hook ][ 'assigned' ][ '#value' ][ $aid ] = array (
'label' => $info [ 'label' ],
'link' => l ( t ( 'unassign' ), " admin/structure/trigger/unassign/ $module / $hook / " . md5 ( $aid )),
2007-10-31 16:30:14 +00:00
);
}
2009-09-19 11:07:37 +00:00
$form [ $hook ][ 'parent' ] = array (
2007-10-31 16:30:14 +00:00
'#prefix' => " <div class='container-inline'> " ,
'#suffix' => '</div>' ,
);
// List possible actions that may be assigned.
if ( count ( $options ) != 0 ) {
array_unshift ( $options , t ( 'Choose an action' ));
2009-09-19 11:07:37 +00:00
$form [ $hook ][ 'parent' ][ 'aid' ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'select' ,
'#options' => $options ,
);
2009-09-19 11:07:37 +00:00
$form [ $hook ][ 'parent' ][ 'submit' ] = array (
2007-10-31 16:30:14 +00:00
'#type' => 'submit' ,
'#value' => t ( 'Assign' )
);
}
else {
2009-09-19 11:07:37 +00:00
$form [ $hook ][ 'none' ] = array (
2009-09-01 16:50:12 +00:00
'#markup' => t ( 'No actions available for this trigger. <a href="@link">Add action</a>.' , array ( '@link' => url ( 'admin/config/system/actions/manage' )))
2007-10-31 16:30:14 +00:00
);
}
return $form ;
}
2008-01-05 22:23:45 +00:00
2007-10-31 16:30:14 +00:00
/**
* Validation function for trigger_assign_form () .
*
* Makes sure that the user is not re - assigning an action to an event .
*/
function trigger_assign_form_validate ( $form , $form_state ) {
$form_values = $form_state [ 'values' ];
if ( ! empty ( $form_values [ 'aid' ])) {
$aid = actions_function_lookup ( $form_values [ 'aid' ]);
2009-09-19 11:07:37 +00:00
$aid_exists = db_query ( " SELECT aid FROM { trigger_assignments} WHERE hook = :hook AND aid = :aid " , array (
2009-05-29 19:15:08 +00:00
':hook' => $form_values [ 'hook' ],
':aid' => $aid ,
)) -> fetchField ();
if ( $aid_exists ) {
2009-09-19 11:07:37 +00:00
form_set_error ( $form_values [ 'hook' ], t ( 'The action you chose is already assigned to that trigger.' ));
2007-10-31 16:30:14 +00:00
}
}
}
/**
* Submit function for trigger_assign_form () .
*/
2009-11-06 03:59:06 +00:00
function trigger_assign_form_submit ( $form , & $form_state ) {
if ( ! empty ( $form_state [ 'values' ][ 'aid' ])) {
$aid = actions_function_lookup ( $form_state [ 'values' ][ 'aid' ]);
$weight = db_query ( " SELECT MAX(weight) FROM { trigger_assignments} WHERE hook = :hook " , array ( ':hook' => $form_state [ 'values' ][ 'hook' ])) -> fetchField ();
2009-05-29 19:15:08 +00:00
2009-11-06 03:59:06 +00:00
// Insert the new action.
2009-05-29 19:15:08 +00:00
db_insert ( 'trigger_assignments' )
-> fields ( array (
2009-11-06 03:59:06 +00:00
'hook' => $form_state [ 'values' ][ 'hook' ],
2009-09-19 11:07:37 +00:00
'aid' => $aid ,
2009-05-29 19:15:08 +00:00
'weight' => $weight + 1 ,
))
-> execute ();
2009-09-19 11:07:37 +00:00
2009-11-06 03:59:06 +00:00
// If we are not configuring an action for a "presave" hook and this action
// changes an object property, then we need to save the object, so the
// property change will persist.
2007-10-31 16:30:14 +00:00
$actions = actions_list ();
2009-11-06 03:59:06 +00:00
if ( strpos ( $form_state [ 'values' ][ 'hook' ], 'presave' ) === FALSE && isset ( $actions [ $aid ][ 'behavior' ]) && in_array ( 'changes_property' , $actions [ $aid ][ 'behavior' ])) {
// Determine the corresponding save action name for this action.
$save_action = strtok ( $aid , '_' ) . '_save_action' ;
// If no corresponding save action exists, we need to bail out.
if ( ! isset ( $actions [ $save_action ])) {
throw new Exception ( t ( 'Missing/undefined save action (%save_aid) for %aid action.' , array ( '%save_aid' => $aid , '%aid' => $aid )));
}
// Delete previous save action if it exists, and re-add it using a higher
// weight.
$save_action_assigned = db_query ( " SELECT aid FROM { trigger_assignments} WHERE hook = :hook AND aid = :aid " , array ( ':hook' => $form_state [ 'values' ][ 'hook' ], ':aid' => $save_action )) -> fetchField ();
2009-05-29 19:15:08 +00:00
2009-11-06 03:59:06 +00:00
if ( $save_action_assigned ) {
2009-05-29 19:15:08 +00:00
db_delete ( 'trigger_assignments' )
2009-11-06 03:59:06 +00:00
-> condition ( 'hook' , $form_state [ 'values' ][ 'hook' ])
-> condition ( 'aid' , $save_action )
2009-05-29 19:15:08 +00:00
-> execute ();
2007-10-31 16:30:14 +00:00
}
2009-05-29 19:15:08 +00:00
db_insert ( 'trigger_assignments' )
-> fields ( array (
2009-11-06 03:59:06 +00:00
'hook' => $form_state [ 'values' ][ 'hook' ],
'aid' => $save_action ,
2009-05-29 19:15:08 +00:00
'weight' => $weight + 2 ,
))
-> execute ();
2009-11-06 03:59:06 +00:00
// If no save action existed before, inform the user about it.
if ( ! $save_action_assigned ) {
drupal_set_message ( t ( 'The %label action has been appended, which is required to save the property change.' , array ( '%label' => $actions [ $save_action ][ 'label' ])));
}
// Otherwise, just inform about the new weight.
else {
drupal_set_message ( t ( 'The %label action was moved to save the property change.' , array ( '%label' => $actions [ $save_action ][ 'label' ])));
2007-10-31 16:30:14 +00:00
}
}
}
}
/**
2009-09-19 11:07:37 +00:00
* Displays actions assigned to this hook in a table .
2007-10-31 16:30:14 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
* - element : The fieldset including all assigned actions .
*
2007-10-31 16:30:14 +00:00
* @ return
* The rendered form with the table prepended .
2007-12-06 09:58:34 +00:00
*
* @ ingroup themeable
2007-10-31 16:30:14 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_trigger_display ( $variables ) {
$element = $variables [ 'element' ];
2007-10-31 16:30:14 +00:00
$header = array ();
$rows = array ();
2009-09-19 11:07:37 +00:00
if ( isset ( $element [ 'assigned' ]) && count ( $element [ 'assigned' ][ '#value' ])) {
2007-10-31 16:30:14 +00:00
$header = array ( array ( 'data' => t ( 'Name' )), array ( 'data' => t ( 'Operation' )));
$rows = array ();
foreach ( $element [ 'assigned' ][ '#value' ] as $aid => $info ) {
$rows [] = array (
2009-09-19 11:07:37 +00:00
$info [ 'label' ],
2007-10-31 16:30:14 +00:00
$info [ 'link' ]
);
}
}
if ( count ( $rows )) {
2009-10-09 01:00:08 +00:00
$output = theme ( 'table' , array ( 'header' => $header , 'rows' => $rows )) . drupal_render_children ( $element );
2007-10-31 16:30:14 +00:00
}
else {
2009-02-03 18:55:32 +00:00
$output = drupal_render_children ( $element );
2007-10-31 16:30:14 +00:00
}
return $output ;
}