Last updated January 13, 2008. Created by Christefano on January 13, 2008.
Edited by owahab. Log in to edit this page.
The following code snippet will allow you to have all "Cancel" links in confirmation screens converted to buttons without touching the core.
Note: This snippet requires jQuery to be loaded.
Simply place this code snippet in a hook_form_alter:
function mymodule_form_alter($form_id, &$form) {
// Converting all links to form buttons
if ($form['#base'] = 'confirm_form') {
$no = $form['actions']['cancel']['#value'];
if (!is_null($no)) {
// Get the text to put on the cancel button
$value = preg_replace('/(<\/?)(\w+)([^>]*>)/e', '', $no);
// Hide the old cancel link
$form['actions']['cancel']['#prefix'] = '';
$form['actions']['cancel']['#suffix'] = '';
// Add our own button
$form['actions']['docancel'] = array(
'#type' => 'button',
'#button_type' => 'reset',
'#name' => 'cancel',
'#submit' => 'false',
'#value' => $value,
'#attributes' => array(
'onclick' => '$(this).parents("form").attr("allowSubmission", "false");
window.location = $("div#'. md5($no) .'").find("a").attr("href");'),
);
// Prevent the form submission via our button
$form['#attributes']['onsubmit'] =
'if ($(this).attr("allowSubmission") == "false") return false;';
}
}
}Suggestions and enhancements are welcome.
Comments
First of all thanks for this
First of all thanks for this usefull tip.
it didn't work for me, but I think I got the idea behind this ;)
It seemed, that there was a javascript-Problem with finding the href of the cancel-link,
(e.g. on "node/123/delete" the form-location on pressing the cancel-Button was "node/123/undefined")
so I modified it a bit with a little regexp-trick so it works for me right now.
The cancel-link was also visible, so I just resetted the '#value' of the cancel-link.
EDIT: The if-equals was missing an equal-Sign too:
if ($form['#base'] == 'confirm_form')
Would be glad if someone could give me some feedback if this was just a
problem that appeared on my Drupal-Installation (5.10) or if it's more widely spread.
So here is my "fix":
<?phpfunction mymodule_form_alter($form_id, &$form) {
// Converting all links to form buttons
if ($form['#base'] == 'confirm_form') {
$no = $form['actions']['cancel']['#value'];
if (!is_null($no)) {
// Get the text to put on the cancel button
$value = preg_replace('/(<\/?)(\w+)([^>]*>)/e', '', $no);
//+ ADDED:
eregi('m|href\s*=\s*\"([^\"]+)\"|ig', $no, $href);
//+ get the value of the "href" from the cancel-link
//-+ REPLACED:
$form['actions']['cancel']['#value'] = '';
//-+ Hide the old cancel link
// Add our own button
$form['actions']['docancel'] = array(
'#type' => 'button',
'#button_type' => 'reset',
'#name' => 'cancel',
'#submit' => 'false',
'#value' => $value,
'#attributes' => array(
//-+ REPLACED:
'onclick' => '$(this).parents("form").attr("allowSubmission", "false");
window.location = "'.$href[1].'";'),
//-+ just print the first result of the eregi-function
//(as in the cancel-link there always be min. and max. 1 instance of ' href="" ')
);
// Prevent the form submission via our button
$form['#attributes']['onsubmit'] =
'if ($(this).attr("allowSubmission") == "false") return false;';
}
}
}
?>
- - - - - - - - - - - - - - - - - - - - - - -
best regards from a docMatic newbie.
- - - - - - - - - - - - - - - - - - - - - - -
best regards from a docMatic newbie.
It Worked for me
It worked for me, but had to replace
if ($form['#base'] == 'confirm_form')withif ($form['#base'] = 'confirm_form')