[development] form_set_error and updating form values

Todd todd at savagevenus.net
Tue Feb 21 12:32:40 UTC 2012


What are you using for the name space for your functions?

Instead of using MYTHEME_form_alter, you should use {modulename}_form_alter
(where "modulename" is anything, as long as it's not already being used by
Drupal).

You'll also need a .info file.

So, for instance, your directory structure in /sites/all/modules will look
like this, assuming that the module name is "velios" (your last name).

velios [directory]
+ velios.info [See here for info: http://drupal.org/node/542202]
+ velios.module [contains the code below, using the namespace "velios" for
your hooks. Ie, "velios_form_alter()"]

Once you have all that added, you'll have to go to your modules page and
enable it and it should alter the form properly.

Regards,
Todd

On 20 February 2012 12:09, Athanasios Velios <a.velios at gmail.com> 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<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<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>
>> >
>>
>>
>>        <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
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.drupal.org/pipermail/development/attachments/20120221/91e60206/attachment.html 


More information about the development mailing list