Mam formularz z przyciskami „Prześlij” i „Anuluj”. W hook_submit(), skąd mam wiedzieć, który przycisk został kliknięty?
Mam formularz z przyciskami „Prześlij” i „Anuluj”. W hook_submit(), skąd mam wiedzieć, który przycisk został kliknięty?
Odpowiedzi:
Musisz użyć triggering_elementz $form_state['triggering_element'].
Najlepszą praktyką jest zdefiniowanie #nameatrybutu dla przycisku, aby można było mieć tę wartość w triggering_element.
Na przykład:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
Jeśli nie zdefiniujesz tego atrybutu, triggering_elementbędzie on zawierał przycisk #value(tekst, który użytkownik może przeczytać), ale jest to odradzane, ponieważ inne moduły mogą zmienić tę wartość lub zmienić lokalizację.
Możesz także użyć $form_state['clicked_button'], ale jest to przestarzałe .
Możesz przeczytać więcej informacji na stronie dokumentacji funkcji drupal_build_form .
$form_state['clicked_button']['#value'] powie Ci, który przycisk został kliknięty w formularzu.
$form_state['clicked_button']['#value']:)
Porównaj te wartości w $form_stateI robiłem w Drupal 6 i będą takie same w Drupal7
if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
//Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
//Process if Cancel is pressed
}
Nazwij przyciski #nameatrybutem, na przykład:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
a następnie użyj:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
Dla tych, którzy wciąż próbują dowiedzieć się, jak uzyskać dostęp do wyzwalanego zdarzenia, oto rozwiązanie Drupal 8.
$form_state->getTriggeringElement()
Zwraca tablicę wyzwalającego elementu wysyłającego. Jeśli dodasz znacznik o nazwie, #nameuzyskasz do niego dostęp w następujący sposób.
$button_clicked = $form_state->getTriggeringElement()['#name']
Powodem tej zmiany jest FormStateInterfaceteraz readOnlyplik, w którym tylko rozszerzające się klasy FormStateInterfacemogą uzyskać dostęp do zmiennych. Musisz więc użyć metod akcesora, takich jak getTriggeringElement()w celu uzyskania dostępu do zmiennej.
W Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];daje ci wartość op. Kiedy szukasz tego klucza w tablicy wartości stanu formularza, dostajesz #valueklucz elementu postaci przycisku - innymi słowy ciąg znaków, który użytkownicy końcowi widzą na przycisku na stronie.
Nie wiem, czy $form_state->getValues()['op']jest uniwersalny dla wszystkich form, ale koduję go na stałe w formie mojego modułu.
Drupal 8.6.7
Utwórz przycisk podobny do poniższego.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
W funkcji wysyłania pobierz nazwę przycisku jak poniżej kodu.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
Porównanie można wykonać jak
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()obsługi formularzy? Procedura obsługi przesyłania formularzy nie jest implementacjąhook_submit().