2010-08-13 20 views
7

Para algunos requisitos, necesito pasar información adicional para formar el controlador de envío. En forma de API, mientras que la definición de encargo presentar controlador comoManejadores de envío de formulario con argumentos adicionales

$additional_args = array(); 
$form['#submit'][] = 'my_submit_handler' 

espero presentar controlador como

function my_submit_handler($form, &$form_state, $additional_args){ 

Respuesta

14

El manejador de presentar es llamado por el FAPI Drupal, por lo que no puede hacer algo por el estilo. En cambio, lo que puede hacer es agregar lo que necesita, ya sea al $form, o al $form_state. Los enfoques habituales son:

  • Agregó un campo al formulario, escriba value para almacenar el valor. No haga esto si tiene el valor en la definición del formulario.

    $form['store'] = array(
        '#type' => 'value', 
        '#value' => $value 
    ); 
    

    Esto estará disponible en $form_state['values']['store'].

  • Añadir el valor de $form_state['storage'], hecho si las variables en su validación identificador que desea transferir a su manejador presentar:

    // Validation. 
    $form_state['storage']['value'] = $value; 
    
    ... 
    
    // Submit 
    $value = $form_state['storage']['value']; 
    // Need to unset stored values when not used anymore. 
    unset($form_state['storage']['value']); 
    
+0

Tenga en cuenta que a partir de Drupal 6, también puede simplemente almacenar variables arbitrarias en $ form ['# foo'] en su lugar, siempre que '#foo' no entre en conflicto con ninguna otra propiedad interna de la API de formulario. –

4

Como se informó en $form['#submit'] and $form['#validate'] and $form['#process'] no longer support custom parameters, el camino sugerido para pasar parámetros a un controlador de presentación establecido como en el código que se muestra es el uso de un código similar al siguiente:

$form['#first_paramater'] = $value; 
$form['#submit'][] = 'my_submit_handler'; 

el manejador sería recuperar el valor como $form['#first_paramater']. Observar que, en lugar de #first_paramater, el código puede usar una cadena diferente, pero debe comenzar con #.

Normalmente no es necesario establecer un controlador de envío como el código, pero hay algunos casos en los que es necesario modificar un formulario creado por otro módulo o configurar un controlador de envío diferente para cada uno de los envíos botones presentes en una forma.

drupal_retrieve_form() guarda los parámetros pasados ​​al controlador de forma de la estructura en $form['#parameters'] que contiene:

  • $form_id
  • $form_state
  • parámetros pasados ​​al constructor de la forma
9

Drupal 7: argumentos personalizados se propagan automáticamente a troug $ form_state ['build_info'] ['args'] Esto se dice en http://api.drupal.org/api/drupal/includes!form.inc/function/drupal_get_form/7

Ex:

hook_form($form, &$form_state, $myAdditionnalArg) {...} 

Luego, en

hook_form_submit($form, &$form_state) { 

... //$form_state['build_info']['args'] es una matriz que contiene en el índice 0 el valor de argumento $myAdditionnalArg ...

Cuestiones relacionadas