Sie können Ajax verwenden, um dies zu erreichen. Drupal 7 hat jetzt gute Ajax-Unterstützung. In Ihrer ersten Auswahlliste (Stadt) müssen Sie Ajax-Informationen hinzufügen. Dann kann die zweite Auswahlliste basierend auf den Informationen in der ersten gefüllt werden. Sie können die zweite Auswahlliste auch ausblenden, bis eine Option in der ersten ausgewählt ist, und ich werde erklären, wie Sie das in Kürze tun. Zunächst richten Sie die Grundform ein:
$form['city'] = array(
'#type' => 'select',
'#title' => t('City'),
'#options' => $options,
'#ajax' => array(
'event' => 'change',
'wrapper' => 'squadron-wrapper',
'callback' => 'mymodule_ajax_callback',
'method' => 'replace',
),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
Dies ist nur die Grundeinstellung der Elemente. Jetzt müssen Sie einen Weg finden, um zu bestimmen, welche Optionen im Geschwader verfügbar sein sollen. Zuerst müssen Sie Ihren Ajax-Rückruf in der Auswahlliste "Stadt" angeben. In den meisten Fällen können Sie nur das Element zurückgeben, das das Ajax-Element umschließt, in diesem Fall $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Wenn sich die Auswahlliste "Stadt" ändert, wird der Staffelumbruch-Teil des Formulars neu erstellt. Ihr 'Stadt'-Wert wird jetzt in $ form_state [' Werte '] angegeben. Wenn also das Formular neu erstellt wird, müssen wir anhand des Werts von "Stadt" festlegen, welche Optionen der Auswahlliste zugewiesen werden sollen.
// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
case 'default':
// Set default options.
break;
case 'losangeles':
// Set up $squadron_options for los angeles.
break;
}
// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
}
Vielen Dank an jordojuice oben. Mit seiner Hilfe gelang es mir, eine Lösung zu finden. Ich habe auch auf das Beispiel unter http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission verwiesen . Ich habe schließlich den folgenden Code verwendet, der in einem benutzerdefinierten Modul funktioniert. Aus irgendeinem Grund konnte ich keinen meiner Werte in den $ form_state-Werten finden, konnte sie aber in $ form finden. Schließlich erhielt ich beim Testen eine Fehlermeldung, dass Drupal eine unzulässige Auswahl in der Dropdown-Liste festgestellt hatte. Ich habe das umgangen, indem ich Zeile 1290 in form.inc auskommentiert habe:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
Der endgültige Code, den ich verwendet habe, war:
quelle
Setzen Sie die Codezeile dh
$nodes[''] = '- None -';
nachin ur
sappers_squadron_squadrons function
und das wird deinen Fehler lösenform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
quelle
Die Hauptursache für "Es wurde eine illegale Auswahl festgestellt. Wenden Sie sich an den Site-Administrator." ist, dass die leere Zeichenfolge mit dem Wert 0 von hinzugefügt
$nodes[]="";
wird, für das Feld field_squadron ungültig ist.Siehe Erweiterte PHP-Programmierung und -Entwicklung. Beachten Sie jedoch, dass die Flags DANGEROUS_SKIP_CHECK und validated in D7 veraltet sind .
Nachdem ich diese Zeile entfernt hatte, war der Fehler verschwunden.
quelle
Verwenden Sie das Referenzfeld Option Limit Modul
quelle