0

I have a commerce Product content type, which has a field collection field attached to it field_mycollection, which has 4 different fields field1, field2, field3 and field4 dependent on each other. Like field2 will be filled based on field1 selected, field3 will be filled based on field2 selected and field4 is dependent on field3. #ajax is used for this.

My Content |_ field_mycollection |_ field_field1 |_ field_field2 |_ field_field3 |_ field_field4

It is working fine for me for one set of field collection. But I have unlimited option enabled for field collection. It is not working for that.

How could I achieve this goal? I did it using hook_form_FORM_ID_alter().

How to manage edit form ?

My code is :

foreach ($form['field_part_details']['und'] as $key => $fc_mycollection) {
  if (is_numeric($key)) {
    $options_first = custom_get_first_dropdown_options();
    $year = isset($form_state['values']['field_part_details']['und'][$key]['field_year']['und'][$key]['tid']) ? $form_state['values']['field_part_details']['und'][$key]['field_year']['und'][$key]['tid'] : key($options_first);
    $make = isset($form_state['values']['field_part_details']['und'][$key]['field_make']['und'][$key]['tid']) ? $form_state['values']['field_part_details']['und'][$key]['field_make']['und'][$key]['tid'] : '';

    $html_id_first = drupal_html_id('dropdown-first-replace');
    $form['field_part_details']['und'][$key]['field_year']['und']['#ajax'] = array(
      'callback' => 'custom_dependent_dropdown_callback_year',
      'wrapper' => $html_id_first,
    );

    $form['field_part_details']['und'][$key]['field_make']['und']['#options'] = get_second_dropdown_options($year, 'year');
    $form['field_part_details']['und'][$key]['field_model']['und']['#options'] = get_second_dropdown_options($make, 'make');
    $form['field_part_details']['und'][$key]['field_make']['und']['#prefix'] = '<div id="'. $html_id_first .'">';
    $form['field_part_details']['und'][$key]['field_make']['und']['#suffix'] = '</div>';      

  }
}

Callback Code is :

function custom_dependent_dropdown_callback_year($form, $form_state) {
  return $form['field_part_details']['und'][0]['field_make'];
}

Any help is appreciated.

0

Use drupal_html_id() to generate unique ids. That is:

$html_id_first = drupal_html_id('dropdown-first-replace');
$form['field_mycollection']['und'][$key]['field_field1']['und']['#ajax'] = array(
  'callback' => 'custom_dependent_dropdown_callback_year',
  'wrapper' => $html_id_first,
);
...
$form['field_mycollection']['und'][$key]['field_make']['und']['#prefix'] = '<div id="' . $html_id_first . '">';
$form['field_mycollection']['und'][$key]['field_make']['und']['#suffix'] = '</div>';
|improve this answer|||||
  • It's not working properly. It's changing IDs of div so after 1st change it stops working. – Adoshi Jun 23 '14 at 7:42
  • what doesn't work properly? Please update the question with your code based on drupal_html_id(). Add also the code for the callbacks. – jonhattan Jun 23 '14 at 7:46
  • Updated code in Question. Added Callback function's code as well. I think issue is with callback field. Don't know how to return field key $form['field_part_details']['und'][0]['field_make']; – Adoshi Jun 23 '14 at 8:35
  • Thanks for all the help Jon. Your solution helped me to find out a way. – Adoshi Jun 23 '14 at 11:40
0

Below solution is working fine for me.

 foreach ($form['field_part_details']['und'] as $key => $fc_mycollection) {
      if (is_numeric($key)) {
        $options_first = custom_get_first_dropdown_options();
        $year = isset($form_state['values']['field_part_details']['und'][$key]['field_year']['und'][0]['tid']) ? $form_state['values']['field_part_details']['und'][$key]['field_year']['und'][0]['tid'] : key($options_first);
        $make = isset($form_state['values']['field_part_details']['und'][$key]['field_make']['und'][0]['tid']) ? $form_state['values']['field_part_details']['und'][$key]['field_make']['und'][0]['tid'] : '';

       $form['field_part_details']['und'][$key]['field_year']['und']['#ajax'] = array(
          'callback' => 'custom_dependent_dropdown_callback_year',
          'wrapper' =>dropdown-first-replace--' . $key,
        );

        $form['field_part_details']['und'][$key]['field_make']['und']['#options'] = get_second_dropdown_options($year, 'year');
        $form['field_part_details']['und'][$key]['field_model']['und']['#options'] = get_second_dropdown_options($make, 'make');
        $form['field_part_details']['und'][$key]['field_make']['und']['#prefix'] = '<div id="dropdown-first-replace--'. $key .'">';
        $form['field_part_details']['und'][$key]['field_make']['und']['#suffix'] = '</div>';      

      }
    }

Callback function :

function custom_dependent_dropdown_callback_year($form, $form_state) {
  $from_element_name = $form_state['triggering_element']['#name'];
  $exp = explode('[', $from_element_name);
  $str = rtrim($exp[2], "]");
  return $form['field_part_details']['und'][$str]['field_make']['und'];
}
|improve this answer|||||
  • Using above code, I am facing one issue. When I am changing value of 1st dropdown, it is changing values of 2nd dropdown but not of 3rd and 4th. How can I reset all the lower dropdown values when higher level is changed ? – Adoshi Jun 23 '14 at 11:35
  • Can anyone help me here ? – Adoshi Jun 24 '14 at 4:22
  • I resolved the issue using jQuery and it's working fine. – Adoshi Jul 2 '14 at 6:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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