[development] form_set_error and updating form values

Richard Burford lists at freestylesystems.co.uk
Tue Feb 21 14:00:22 UTC 2012


I took the liberty of cleaning it up a bit to follow Drupal's coding standards.

https://gist.github.com/1876688

http://drupal.org/coding-standards

One major issue I noticed was that the validate function was added like this:

> $form['#validate'] = array('congr_afternoon_bookings');

This will override any existing validate functions so instead you should use:

> $form['#validate'][] = 'congr_afternoon_bookings';


Regards,

Richard

--
http://fs.io/
http://dgo.to/@psynaptic
http://twitter.com/psynaptic
http://drupalcontrib.org/

On 20 Feb 2012, at 17:09, Athanasios Velios wrote:

> 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