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/... -- 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@gmail.com <mailto:a.velios@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@gmail.com <mailto:a.velios@gmail.com> <mailto:a.velios@gmail.com <mailto:a.velios@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/f... <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/funct... <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_s... <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_e... <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@gmail.com <mailto:a.velios@gmail.com> <mailto:a.velios@gmail.com <mailto:a.velios@gmail.com>> <mailto:a.velios@gmail.com <mailto:a.velios@gmail.com> <mailto:a.velios@gmail.com <mailto:a.velios@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