'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; //if it is already set, like on user/1/edit page if(isset($form['field_category'][0]['#default_value']['value']) && $form['field_category'][0]['#default_value']['value']!="") $category_default_value =$form['field_category'][0]['#default_value']['value']; else $category_default_value = 1; //my first item in vocabulary $options1 = array(); $category_array = taxonomy_get_tree(1, 0, -1, 1); // 1= my vocabulary ID, 0=parent, -1=depth, 1=max_dept foreach($category_array as $value) $options1[$value->tid] = ($value->description?$value->description:$value->name); //first dummy field that collect value for cck filed filed_category $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', ), ); //if it is already set, like on user/1/edit page if(isset($form['field_subcategory'][0]['#default_value']['value']) && $form['field_subcategory'][0]['#default_value']['value']!="") $subcategory_default_value =$form['field_subcategory'][0]['#default_value']['value']; else $subcategory_default_value = 7; //my first item under the item with id 1 ,in vocabulary $options2 = array(); $subcategory_array = taxonomy_get_tree(1, $category_default_value, 0, 2); // 1=vocabulary ID, =parent, 0=depth, 2=max_dept foreach($subcategory_array as $value) $options2[$value->tid] = ($value->description?$value->description:$value->name); //second dummy field that collect value for cck filed filed_subcategory $form['subcategory'] = array( '#type' => 'select', '#title' => t('Subcategory'), '#options' => $options2, '#default_value' => $subcategory_default_value, '#required' => 1, ); //this is needed for javascript to enter values in real cck fields $form['buttons']['submit']['#attributes'] = array('class' => 'submit-insert'); 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_id = $_POST['category']; $subcategory_array = taxonomy_get_tree(1, $category_id, 0, 2); // 1=vocabulary ID, =parent , 0=depth, 2=max_dept foreach($subcategory_array as $value) $options3[$value->tid] = ($value->description?$value->description:$value->name); $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)); } ?>