Aby to zrobić, możesz użyć Ajax. Drupal 7 ma teraz dobrą obsługę Ajax. Na pierwszej wybranej liście (mieście) musisz dodać informacje Ajax. Następnie drugą listę wyboru można wypełnić na podstawie informacji z pierwszej. Możesz także ukryć drugą listę wyboru, dopóki nie zostanie wybrana opcja z pierwszej, a ja wyjaśnię, jak to zrobić za chwilę. Najpierw skonfiguruj podstawową formę:
$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,
);
To tylko podstawowa konfiguracja elementów. Teraz potrzebujesz sposobu, aby określić, jakie opcje powinny iść w eskadrze. Najpierw musisz zidentyfikować połączenie zwrotne Ajax na liście wyboru „miasto”. W większości przypadków możesz po prostu zwrócić element otaczający element ajax, w tym przypadku $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Teraz, gdy zmieni się lista wyboru „miasto”, odbuduje część formularza zawierającą eskadrę. Twoja wartość „miasto” będzie teraz mieć wartość $ form_state [„wartości”]. Kiedy więc formularz zostanie przebudowany, musimy ustalić, jakie opcje dać wybranej liście na podstawie wartości „miasto”.
// 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,
);
}
Wielkie podziękowania dla jordojuice powyżej. Z jego pomocą udało mi się znaleźć rozwiązanie. Odniosłem się również do przykładu pod adresem http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . W końcu użyłem kodu, który działał w module niestandardowym. Z jakiegoś powodu nie mogłem znaleźć żadnej z moich wartości w wartości $ form_state, ale byłem w stanie znaleźć je w $ postaci. W końcu, kiedy testowałem, otrzymywałem komunikat o błędzie, że Drupal wykrył nieprawidłowy wybór w menu rozwijanym. Obejrzałem to, komentując linię 1290 w form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
Ostateczny kod, którego użyłem to:
źródło
wstaw wiersz kodu, tj.
$nodes[''] = '- None -';
pow
sappers_squadron_squadrons function
twoim, a to rozwiąże twój błądform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
źródło
Główna przyczyna „Wykryto nielegalny wybór. Skontaktuj się z administratorem witryny”. jest to, że pusty ciąg o wartości 0 dodanej przez
$nodes[]="";
jest niepoprawny dla pola field_squadron.Zobacz Zaawansowane programowanie i programowanie PHP , ale pamiętaj, że DANGEROUS_SKIP_CHECK i sprawdzone flagi są przestarzałe w D7 .
Po usunięciu tej linii błąd zniknął.
źródło
Użyj modułu ograniczenia opcji Pole referencyjne
źródło