Ich habe Code wie unten geschrieben und alles funktioniert einwandfrei, aber beim Absenden des Formulars wird der folgende Fehler angezeigt. Ich versuche, das zweite Dropdown basierend auf der ersten Dropdown-Auswahl zu filtern.
Eine illegale Auswahl wurde festgestellt. Bitte wenden Sie sich an den Site-Administrator.
Wie überwinde ich diesen Fehler?
function dynamic_location_dropdown_form_alter(&$form, $form_state, $form_id) {
if($form_id == 'product_node_form') {
$location_options = array();
if(isset($form['field_destination']['und']['#default_value'][0])) {
$destination = $form['field_destination']['und']['#default_value'][0];
}
else {
$destination = 0;
}
$location_options = dynamic_location_dropdown_locations($destination);
$form['field_destination']['und']['#ajax'] = array(
'event' => 'change',
'wrapper' => 'squadron-wrapper',
'callback' => 'dynamic_location_dropdown_ajax_callback',
'method' => 'replace',
);
$form['field_product_location']['#validated'] = true;
$form['field_product_location']['und']['#prefix'] = '<div id="squadron-wrapper">';
$form['field_product_location']['und']['#suffix'] = '</div>';
$form['field_product_location']['und']['#options'] = $location_options;
}
}
function dynamic_location_dropdown_ajax_callback($form, $form_state) {
$country_id = $form['field_destination']['und']['#value'];
$form['field_product_location']['#validated'] = true;
$form['field_product_location']['und']['#options'] = dynamic_location_dropdown_locations($country_id);
return $form['field_product_location'];
}
function dynamic_location_dropdown_locations($destination_id) {
$nodes = array();
$nodes[''] = '- None -';
if($destination_id != '') {
$select = db_query("
SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM {node} node
LEFT JOIN {field_data_field_location_country} field_data_field_location_country
ON node.nid = field_data_field_location_country.entity_id
AND (field_data_field_location_country.entity_type = 'node'
AND field_data_field_location_country.deleted = '0')
WHERE (( (node.status = '1')
AND (node.type IN ('location'))
AND (field_data_field_location_country.field_location_country_nid = $destination_id)))
ORDER BY node_title ASC
");
$nodes[''] = '- None -';
foreach ($select as $node) {
$nodes[$node->nid] = $node->node_title;
}
}
return $nodes;
}
'#validated' => TRUE
was sich darum kümmern sollte. Ich vermute also, dass Sie in einigen Eigenschaften den Schlüssel 'und' haben und nicht in dem Formulararray, in dem Sie den Schlüssel '#validated' verwenden ...?Antworten:
Das Problem ist höchstwahrscheinlich auf eine Anforderung für FAPI AJAX zurückzuführen, die in AJAX Forms in Drupal 7 dokumentiert ist, jedoch leicht übersehen werden kann.
Die Tatsache, dass Sie das Formularelement
[#options]
im AJAX-Rückruf festlegen, ist definitiv ein Problem. Der AJAX-Rückruf sollte nur das zu druckende Array oder HTML zurückgeben, nicht das Formular ändern. Dieser Rückruf sollte nur diereturn
Anweisung enthalten .Die Änderungen an Ihrem Formular sollten im form_alter vorgenommen werden. Außerdem sollten Sie das Array form_state verwenden, um zu überprüfen, ob für Ihre erste Dropdown-Liste ein Wert ausgewählt wurde. Dies wird während einer AJAX-Anfrage aktualisiert.
Ich empfehle, das Beispielmodul sowie diese Seiten zu lesen, um weitere Informationen zu AJAX in FAPI zu erhalten. Es kann definitiv schwierig sein.
quelle
return $form['squadron_wrapper']
", um die AJAX-Antwort zu verkleinern).Die folgende Methode kann verwendet werden, um Fehler nur für die Felder zu vernachlässigen, in die durch Ajax ein Wert hinzugefügt wurde. Gemäß
dem unten angegebenen Code können Sie das Feldelement eingeben, das einen Fehler ausgibt, sodass sich der Wert in der zweiten Dropdown-Liste aufgrund einer Änderung in ändert Das erste Dropdown-Menü aufgrund der Verwendung von Ajax zeigt keinen Fehler an.
quelle
Dies scheint ein Kernfehler zu sein https://www.drupal.org/node/153774 und die hier erwähnten Lösungen verursachen tatsächlich mehr Probleme.
Wenn #ajax für ein Auswahlelement verwendet wird und mehr als eine Option ausgewählt ist, wird ein "unzulässiger Auswahlfehler" generiert. Aber warum? Nach einigem Nachforschen stellte sich heraus, dass das aktivierte Element bei Aktivierung von #ajax Werte wie Array (200.250) anstelle von Array (200 => 200, 250 => 250) übermittelt. Dies führt also zu Problemen mit dem darin enthaltenen Optionsvalidierungscode _form_validate Funktion und es kann ausgewählte Optionen nicht mehr mit verfügbaren Optionen vergleichen. Hier ist der Code: Dies geschieht nur, wenn mehr als eine Option ausgewählt ist und #ajax verwendet wird. Der Fix besteht darin, den übermittelten Wert vor der Validierung zu korrigieren
Ich habe ein Modul geschrieben, um diesen Fehler automatisch zu umgehen. Es funktioniert möglicherweise nicht in allen Fällen, aber es ist eine klare Problemumgehung, die Sie als Ausgangspunkt verwenden können.
https://www.drupal.org/sandbox/sinasalek/2312751
quelle