[development] form_set_error and updating form values

Athanasios Velios a.velios at gmail.com
Tue Feb 21 15:55:20 UTC 2012


Yes, I have tried the same code as a separate module as well. But the 
behaviour was identical. In D7, I believe, you can use _form_alter in 
the template.php but anyway it does not seem to make any difference.

Thanasis

On 21/02/12 12:32, Todd wrote:
> 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 <http://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
> <mailto: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>
>         <mailto: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>>
>         <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:
>
>                     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
>         <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>>>
>         <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 <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 <tel:8017220799>
>
>
>
>
>                 --
>                 Cheers,
>                 Mukesh Agarwal
>                 ____________________________________
>                 Innoraft Solutions <http://www.innoraft.com>  || +91
>         8017220799 <tel:%2B91%208017220799>
>
>
>
>
>         --
>         Cheers,
>         Mukesh Agarwal
>         __________________________________
>         Innoraft Solutions <http://www.innoraft.com>  || +91 8017220799
>         <tel:%2B91%208017220799>
>
>


More information about the development mailing list