I have not used form values in this way before and am unsure if they will work this way. Typically $form_state['storage'] is where you might place these values that are part the form that may be modified by ajax callback handlers. Have you tried using $form_state['storage'] instead of $form_state['values'] for your $all_categories data? ________________________________ From: support-bounces@drupal.org [mailto:support-bounces@drupal.org] On Behalf Of Kamal Palei Sent: Sunday, September 09, 2012 8:44 PM To: support@drupal.org Subject: [support] Drupal 7 AHAH/AJAX issue Hi List I am trying to learn ajax stuff in Drupal 7. I want to have a simple questionnaire form. Where I will have a single textfield. In that text field one will type a question category, and if he wants to type more question categories, user need to click a button "Add More Categories". Please see link http://www.netcloudsystems.com/?q=questionnaire/form/manage The whole source code is at the end of this email. When ajax callback fires, I want to remember how many textfields I need to add, so that when a section of form is updated in _form() hook, I can according add those many textfields. I am trying to manage that using a variable "$all_categories" and form element $form['all_categories'] (of type value). I tried many options, always I find $all_categories value is 1. So I am unable to add more textfields. My observation is whatever I set in ajax callback, in _form hook api, I find value is lost. Kindly guide me what I am missing. Best Regards Kamal NECS, Bangalore <?php function questionnaire_menu() { $items = array(); $items['questionnaire/form/manage'] = array( 'title' => t('Manage questions'), 'page callback' => 'questionnaire_form', 'access arguments' => array('question manage'), 'type' => MENU_SUGGESTED_ITEM, ); return $items; } function questionnaire_permission() { return array( 'question manage' => array( 'title' => t('Question management'), 'description' => t('Provides question management capability'), ), ); } function questionnaire_form() { return drupal_get_form('questionnaire_my_form'); } function questionnaire_my_form($form, &$form_state) { $form_state['cache'] = TRUE; $all_categories = !empty($form_state['values']['all_categories']) ? $form_state['values']['all_categories'] : 1; $form['all_categories'] = array( '#type' => 'value', '#default_value' => $all_categories, '#value' => $all_categories); // The prefix/suffix provide the div that we're replacing, named by // #ajax['wrapper'] above. $form['category_fieldset'] = array( '#title' => t("Questions Categories"), '#prefix' => '<div id="category-div">', '#suffix' => '</div>', '#type' => 'fieldset', '#description' => t('Please enter the question categories'), ); for ($i=1; $i<= $all_categories ; $i++) { $key = 'ctg' . $i; $form['category_fieldset']['category'][$key] = array( '#type' => 'textfield', '#title' => "Question category $i", ); } $form['category_fieldset']['add_more_category'] = array( '#type' => 'submit', '#value' => t('Add More Categories'), '#ajax' => array( 'callback' => 'questionnaire_category_callback', 'wrapper' => 'category-div', 'method' => 'replace', 'effect' => 'fade', ), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } function questionnaire_category_callback($form, &$form_state) { $form_state['values']['all_categories'] = $form_state['values']['all_categories'] + 1; return $form['category_fieldset']; } ?>