[development] form_set_error and updating form values

Athanasios Velios a.velios at gmail.com
Mon Feb 20 17:09:24 UTC 2012


Sorry, I will have to accept your offer for editing as I am clearly 
missing something obvious:

function MYTHEME_form_alter(&$form, $form_state, $form_id) {
   global $user;
   //alter forms but not for admin account
   if ($user->uid != 1){ //limit it for some users, let's say admin only
     //various irrelevant alterations here
   } else {
     if ($form_id == 'uc_cart_view_form') {
       //add extra registration logic
       $form['#validate'] = array('congr_afternoon_bookings');
     }
   }
}

/**
  * Extra logic
  */
function congr_afternoon_bookings(&$form, &$form_state){
   //check afternoon tours for a max of 2 bookings
   $congr_highlight_afternoon_fields = array();
   $congr_max_afternoon = 0;
   foreach($form['items'] as $key=>&$val) {
     if (isset($val['nid']['#value'])) {
       $node = node_load($val['nid']['#value']); //load the node of the 
corresponding item in the form
       if ($node->field_product_type['und'][0]['tid'] == 476){ //if the 
associated term tid is 476
         $congr_max_afternoon = $congr_max_afternoon + 
$val['qty']['#default_value']; //add the quantity field of the item list 
to our max value
         $congr_highlight_afternoon_fields[] = $key; //also keep the key 
in an array
       }
     }
   }
   if ($congr_max_afternoon > 2) { //if the max number of quantity items 
is more than 2
     //$form_state['rebuild'] = TRUE; //TODO: I am told this is required 
because otherwise the form is not updated with the newly user inputted 
figures but it does not work...
     foreach($congr_highlight_afternoon_fields as $key=>$val) { //for 
each item in the list
       if ($key == 0) { //if it is the first one, show the full message 
which is independent of a specific quantity field
         form_set_error('','You have tried to buy 
'.$congr_max_afternoon.' items, but the maximum you can buy is 2. See 
below for a list of items which you can possibly amend.');
         form_set_error('items]['.$val,'Please amend this item: 
'.$form['items'][$val]['title']['#markup'].'.');
       } else { //for the rest do not show the message only highlight
         form_set_error('items]['.$val,'Please amend this item: 
'.$form['items'][$val]['title']['#markup'].'.');
       }
     }
   }
}

Thanks for looking into this.

Thanasis

On 20/02/12 16:02, Mukesh Agarwal wrote:
> http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_form_alter/7
> -- the hook takes $form as an argument passed by reference.. so all the
> changes you make in $form, it should get reflected in the UI.. Please
> share your code if it does not work for you..
>
> On Mon, Feb 20, 2012 at 8:57 PM, Athanasios Velios <a.velios at gmail.com
> <mailto:a.velios at gmail.com>> wrote:
>
>     Hm, I commented the lines in template.php and built a new module
>     with the hook_form_alter and additional logic but this does not make
>     any difference at all. Exactly the same behaviour...
>
>     Thanasis
>
>
>     On 20/02/12 09:25, Mukesh Agarwal wrote:
>
>         Yes, Drupal is quite structured and has defined ways to deal with
>         stuff.. template.php and hook_form_alter are for 2 different
>         purposes
>         and in your case writing a custom module which implements the
>         hook is
>         the right way.
>
>         On Mon, Feb 20, 2012 at 2:53 PM, Athanasios Velios
>         <a.velios at gmail.com <mailto:a.velios at gmail.com>
>         <mailto:a.velios at gmail.com <mailto:a.velios at gmail.com>>> wrote:
>
>             Do you reckon that the problem is putting the code in
>         template.php
>             instead of a custom module?
>
>             Thanks again,
>
>             Thanasis
>
>
>             On 20/02/12 08:27, Mukesh Agarwal wrote:
>
>                 The place to implement logic based form_set_error should
>         be in the
>                 validate function and not template.php .. I would
>         recommend you use
>                 hook_form_alter
>         <http://api.drupal.org/api/____drupal/modules%21system%____21system.api.php/function/____hook_form_alter/7
>         <http://api.drupal.org/api/__drupal/modules%21system%__21system.api.php/function/__hook_form_alter/7>
>
>         <http://api.drupal.org/api/__drupal/modules%21system%__21system.api.php/function/__hook_form_alter/7
>         <http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_form_alter/7>>>
>
>                 -> $form_id will indicate the form you wish to alter,
>         and there
>                 you can
>                 add a custom validate function in $form['#validate'] --
>         the custom
>                 function should then take care of form_set_error
>
>         http://api.drupal.org/api/____drupal/includes%21form.inc/____function/form_set_error/7
>         <http://api.drupal.org/api/__drupal/includes%21form.inc/__function/form_set_error/7>
>
>         <http://api.drupal.org/api/__drupal/includes%21form.inc/__function/form_set_error/7
>         <http://api.drupal.org/api/drupal/includes%21form.inc/function/form_set_error/7>>
>                 -- you need to set the element name as first parameter
>         to make
>                 sure that
>                 the particular field is highlighted.
>
>                 On Mon, Feb 20, 2012 at 1:51 PM, Athanasios Velios
>         <a.velios at gmail.com <mailto:a.velios at gmail.com>
>         <mailto:a.velios at gmail.com <mailto:a.velios at gmail.com>>
>         <mailto:a.velios at gmail.com <mailto:a.velios at gmail.com>
>         <mailto:a.velios at gmail.com <mailto:a.velios at gmail.com>>>> wrote:
>
>                     Hello,
>
>                     I am trying to alter a form (uc_cart_view_form) with
>         various
>                 input
>                     fields (Qty for products). In template.php I am
>         adding some
>                 extra
>                     logic which applies across a selection of these
>         fields. Once the
>                     logic is checked I need to display an error message.
>         I am using
>                     form_set_error to show the message. The problem is
>         that the user
>                     then updates the input values and updates the form,
>         but the new
>                     figures are not taken into account. They are shown
>         in the
>                 form, but
>                     not used in my template.php extra logic.
>
>                     drupal_set_message allows the new values to work but
>         the message
>                     appears twice and it does not, obviously, link to
>         specific
>                 fields in
>                     the form which are problematic.
>
>                     Setting form_state rebuild to true before form_set_error
>                 does not
>                     have an effect.
>
>                     Any ideas of what needs to be done for these values
>         to be
>                 taken into
>                     account with form_set_error?
>
>                     Thanks
>
>                     Thanasis
>
>
>
>
>                 --
>                 Cheers,
>                 Mukesh Agarwal
>                 ____________________________________
>
>                 Innoraft Solutions <http://www.innoraft.com>  || +91
>         8017220799
>
>
>
>
>         --
>         Cheers,
>         Mukesh Agarwal
>         __________________________________
>         Innoraft Solutions <http://www.innoraft.com>  || +91 8017220799
>
>
>
>
> --
> Cheers,
> Mukesh Agarwal
> ________________________________
> Innoraft Solutions <http://www.innoraft.com>  || +91 8017220799
>


More information about the development mailing list