AJAX-Rückruffunktion wurde nie aufgerufen

7

Ich habe Probleme mit etwas unglaublich Einfachem: Wenn ich ein Element in einem Element mit mehreren Auswahlformularen auswähle, soll ein Textfeld aktiviert werden. Das Problem, das ich habe, ist, dass Drupal es nie schafft, in die von mir angegebene Rückruffunktion zu gelangen.

Hier erstelle ich mein Multiselect-Element:

$form['foocat'] = array(
  '#type' => 'fieldset', 
  '#title' => t('Manage subcategories'), 
  '#prefix' => '<div class="fieldset">',
  '#suffix' => '</div>',
);
$form['foocat']['subcategories'] = array(
  '#type' => 'select',
  '#default_value' => '',
  '#title' => $foocategory,
  '#options' => $options,
  '#ajax' => array(
    'callback' => 'edit_displayname_callback', 
    'wrapper' => 'displayname',
  ),
  '#attributes' => array('id' => 'foocats',),
  '#prefix' => '<div class="formselect" id="selectmapcat">',
  '#suffix' => '</div>',
  '#size' => 9,
);

Ein bisschen weiter im Code erstelle ich mein Textfeld:

$form['foocat']['subcat_displayname'] = array(
  '#type' => 'textfield',
  '#title' => t('Name'),
  '#default_value' => $entity->foocategory,
  '#size' => 25,
  '#maxlength' => 31,
  '#prefix' => '<div class="floater" id="displayname">',
  '#suffix' => '</div>',
  '#disabled' => TRUE,
);

if(!empty($form_state['subcategories'])) {
  $form['foocat']['subcat_displayname']['#disabled'] = FALSE; 
  //Code for setting the textfield, dependent on what's been selected in the multiselect
}

Und das ist meine Rückruffunktion:

function edit_displayname_callback($form, &$form_state) {
  watchdog("Test", "Testing callback..", array(), WATCHDOG_ALERT);
  return $form['foocat']['subcat_displayname'];
}

Der Rückruf wird nie angerufen, und ich habe keine Ahnung warum. Ich verwende AJAX in einem anderen Teil des gleichen Formulars, und dort funktioniert es, also denke ich, dass es kein Formularproblem ist.

Kann jemand das Problem erkennen?

RienK
quelle

Antworten:

2

Ich denke, Sie ändern die ID mit '#attributes' => array('id' => 'foocats',), Und jetzt wird der Rückruf nicht ausgeführt, weil die ID geändert wird.

Wenn Sie Ihren Code ändern, wird es funktionieren (getestet in meiner eigenen Installation)

$form['foocat']['subcategories'] = array(
  '#type' => 'select',
  '#default_value' => '',
  '#title' => $foocategory,
  '#options' => $options,
  '#ajax' => array(
    'callback' => 'edit_displayname_callback', 
    'wrapper' => 'displayname',
  ),
  //'#attributes' => array('id' => 'foocats',),
  '#prefix' => '<div class="formselect MY_SPECIAL_JQUERY_SELECTOR" id="selectmapcat">',
  '#suffix' => '</div>',
  '#size' => 9,
);
FLIEGEN
quelle
Das Problem ist, dass ich die ID auf $ form ['foocat'] ['Unterkategorien'] benötige. Ich benutze es, um es in jQuery
RienK
Meine Antwort wurde aktualisiert. Sie können eine zweite Klasse hinzufügen, damit Sie diese für Ihre jQuery verwenden können:$('div.MY_SPECIAL_JQUERY_SELECTOR select')
FLY
Schön, ich werde es mir ansehen, sobald ich wieder bei der Arbeit bin!
RienK