'mymodule_change_opstina', 'access callback' => TRUE, 'type' => MENU_CALLBACK, 'access arguments' => array('access content'), ); return $items; } /** * Implementation of hook_form_alter(). */ function mymodule_form_alter(&$form, $form_state, $form_id) { switch ($form_id) { case 'my_content_type_node_form': $form['#cache'] = TRUE; $category_default_value = 'category1'; $options1 = array('category1' => 'category1', 'category2' => 'category2', 'category3' => 'category3'); $form['category'] = array( '#type' => 'select', '#title' => t('Category'), '#options' => $options1, '#default_value' => $category_default_value, '#required' => 1, '#ahah' => array( 'event' => 'change', 'path' => 'mymodule-change-opstina', 'wrapper' => 'edit-subcategory-wrapper', //here enter id of a wrapper that contains your field 'method' => 'replace', ), ); $subcategory_default_value = 'subcategory1'; $options2 = array('subcategory11' => 'subcategory11', 'subcategory12' => 'subcategory12', 'subcategory13' => 'subcategory13'); $form['subcategory'] = array( '#type' => 'select', '#title' => t('Subcategory'), '#options' => $options2, '#default_value' => $subcategory_default_value, '#required' => 1, ); break; } } function mymodule_change_opstina() { // The form is generated in an include file which we need to include manually. include_once 'modules/node/node.pages.inc'; // We're starting in step #3, preparing for #4. $form_state = array('storage' => NULL, 'submitted' => FALSE); $form_build_id = $_POST['form_build_id']; // Step #4. $form = form_get_cache($form_build_id, $form_state); // Preparing for #5. $args = $form['#parameters']; $form_id = array_shift($args); $form_id = $args; $form_state['post'] = $form['#post'] = $_POST; $form['#programmed'] = $form['#redirect'] = FALSE; // Step #5. //drupal_process_form($form_id, $form, $form_state); // Step #6 and #7 and #8. // $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id); //change your element here //here we are changing list of opstions for subcategory, considering the choosen value for category $options3 = array(); $category_value = $_POST['category']; if ($category_value == 'category2') $options3 = array('subcategory21' => 'subcategory21', 'subcategory22' => 'subcategory22', 'subcategory23' => 'subcategory23'); if ($category_value == 'category3') $options3 = array('subcategory31' => 'subcategory31', 'subcategory32' => 'subcategory32', 'subcategory33' => 'subcategory33'); if ($category_value == 'category1') $options3 = array('subcategory11' => 'subcategory11', 'subcategory12' => 'subcategory12', 'subcategory13' => 'subcategory13'); $form['subcategory']['#options'] = $options3; form_set_cache($form_build_id, $form, $form_state); $form += array( '#post' => $_POST, '#programmed' => FALSE, ); $form = form_builder('my_content_type_node_form', $form, $form_state); // Step #9. $subform = $form['subcategory']; unset($subform['#prefix'], $subform['#suffix']); $output = theme('status_messages') . drupal_render($subform); // Final rendering callback. drupal_json(array('status' => TRUE, 'data' => $output)); } ?>