I have just created a new content type called pieza_musical. What I just want to do is update one select element via Ajax depending on another select choice, a dependant select.

I'm altering the form_node_add using hook_form_alter to inject the #ajax element and replace in the wrapper the previous select rendered by default in the content type.

Everything is working except when it comes to save. I think, due I'm replacing the select via $ajax['method'] = replace, maybe some token is missing and the content type can't be saved.

It show these error messages:

An illegal choice has been detected. Please contact the site administrator.
Género: illegal value.

This is my simple code:

function seven_form_pieza_musical_node_form_alter(&$form, &$form_state, $form_id) {
  $generos = taxonomy_get_tree(2,0,1);
  $values_generos = array();
  foreach ($generos as $genero) {
    $values_generos[$genero->tid] = $genero->name;

  $form['field_genero']['und']['#options'] = $values_generos;
  // adds ajax 
  $form['field_genero']['und']['#ajax'] =  array(
     'event' => 'change',
     'wrapper' => 'edit-field-subgenero-und',
     'callback' => 'subgenero_ajax_callback',

function subgenero_ajax_callback($form, &$form_state) {
  $generoId = $form_state['values']['field_genero']['und'][0]['value'];

  $cat = taxonomy_term_load($generoId);
  $vid = $cat->vid;

  $generos = taxonomy_get_tree($vid,$generoId,1);

  $options = array();
  foreach ($generos as $genero) {
    $options[$genero->tid] = $genero->name;
  $form['field_subgenero_ajax'] = array(
    '#type' => 'select',
    '#id' => 'edit-field-subgenero-und',
    '#required' => TRUE,
    '#name' => 'field_subgenero[und]',
    '#options' => $options,
  return $form['field_subgenero_ajax'];
  • Is it possible to make this is a content type?
  • Should I create a new entity just for this little purpose?
  • Should I create a custom field?
  • Are you trying to replace the whole field_genero field with the field_subgenero_ajax? Apr 3, 2015 at 15:10
  • No, I'm just trying to replace all field_subgenero with field_subgenero_ajax .... do I have another choice with #ajax? I understand that always we have to replace all contained in the wrapper.
    – andres
    Apr 3, 2015 at 21:29
  • #ajax is alright but I'm quite confused why your changing the same selectbox when it changes, what will happen if a user wants to go back to the previous term listed on the selectbox? That aside, can you provide the structure of the terms and vocabularies you are using here so that I can replicate it on my end if it's no trouble? Apr 4, 2015 at 2:13
  • Ok, this is my vocabulary and terms: (vocabulary) Musica: -Rock (alternative, indie, 80's) -Jazz (Big Band, Free Jazz, Dixie) -Classic (concerto, symphony, sonata) What I'm trying to do is load the parent terms (Rock, Jazz, Classic) in the main select defined in the content type structure and then the second select should load via ajax the children terms of each parent. Im not changing the whole first dripdown but the second contained in the wrapper. Any idea? Thx!
    – andres
    Apr 4, 2015 at 18:24
  • Thanks for the additional information of your Taxonomy structure. I edited my Answer and added a link to a module that you could check out. Apr 5, 2015 at 7:48

1 Answer 1


Since you're dealing with fields created in by Drupal admin, You may want to check the option values you replaced in the fields that it matches in the field settings.


Try the Hierarchical Select module. In the page, it also supports Taxonomies.

  • Yes it matches....look in field_subgenero_index I'm giving the same name as before bue when it saves it crashes... :(
    – andres
    Apr 3, 2015 at 21:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.