Tengo un formulario con los botones "Enviar" y "Cancelar". En hook_submit()
, ¿cómo sé en qué botón se hizo clic?
Tengo un formulario con los botones "Enviar" y "Cancelar". En hook_submit()
, ¿cómo sé en qué botón se hizo clic?
Respuestas:
Debe usar el triggering_element
de $form_state['triggering_element']
.
La mejor práctica es definir un #name
atributo para su botón, para que pueda tener este valor en el triggering_element
.
Por ejemplo:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
Si no define este atributo, triggering_element
se mantendrá el botón #value
(el texto que el usuario puede leer), pero esto se desaconseja ya que otros módulos pueden cambiar este valor o la localización puede cambiarlo.
También puede usar $form_state['clicked_button']
, pero esto está en desuso .
Puede leer más información en la página de documentación de la función drupal_build_form .
$form_state['clicked_button']['#value']
le dirá en qué botón se hizo clic en el formulario.
$form_state['clicked_button']['#value']
:)
Compare estos valores en lo $form_state
que he estado haciendo en Drupal 6 y sería lo mismo en 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
}
Nombre los botones con el #name
atributo, así:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
y luego usa:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
Para aquellos que todavía intentan descubrir cómo acceder al evento activado, aquí está la solución Drupal 8.
$form_state->getTriggeringElement()
Esto devuelve la matriz del elemento de envío desencadenante. Si agrega un marcado llamado #name
, accedería a él de la siguiente manera.
$button_clicked = $form_state->getTriggeringElement()['#name']
La razón detrás de este cambio es que FormStateInterface
ahora es un readOnly
archivo en el que solo las clases que se extienden FormStateInterface
pueden acceder a las variables. Por lo tanto, debe usar métodos getTriggeringElement()
de acceso como para acceder a la variable.
En Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];
le da el valor de op
. Cuando busca esa clave en la matriz de valores del estado del formulario, obtiene la #value
clave del elemento de formulario del botón; en otras palabras, la cadena que los usuarios finales ven en el botón de la página.
No sé si $form_state->getValues()['op']
es universal para todas las formas, pero lo estoy codificando en la forma de mi módulo.
Drupal 8.6.7
Crear botón algo como a continuación.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
En su función de envío, obtenga el nombre del botón como el código a continuación.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
La comparación se puede hacer como
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()
un controlador de envío de formularios? Un controlador de envío de formularios no es la implementación dehook_submit()
.