Community Documentation

Converting cancel link to a button in confirmation pages

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":

<?php
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);
//+ 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') with if ($form['#base'] = 'confirm_form')

About this page

Drupal version
Drupal 5.x

Reference

Drupal’s online documentation is © 2000-2012 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.
nobody click here