2009-07-03 22 views
7

Mi objetivo es si el usuario está enviando este formulario con el valor "Nombre del producto" como "YYY". En la página de envío debería volver a cargarse pero esta vez "Nombre del producto" debería mostrar el valor anterior como predeterminado como en este caso "YYY".Formulario de Drupal: quiere mostrar el valor de formulario anterior como valor_predeterminado en la página

Aquí está mi código ...

function addnewproduct_page() { 
    return drupal_get_form('addnewproduct_form',&$form_state); 
} 

function addnewproduct_form(&$form_state) { 
    $form = array(); 


    $formproductname['productname'] = array (
    '#type' => 'textfield', 
    '#title' => t('Product Name'), 
    '#required' => TRUE, 
     '#size' => '20', 
); 

    if (isset($form_state['values']['productname'])) 
    { 
    $form['productname']['#default_value'] = $form_state['values']['productname']; 
    } 

    //a "submit" button 
    $form['submit'] = array (
    '#type' => 'submit', 
    '#value' => t('Add new Product'), 
); 
    return $form; 
} 

Respuesta

-1

generalmente resuelvo esto poniendo el valor presentado en la variable $ _SESSION en el gancho de presentar. Luego, la próxima vez que se cargue el formulario, verifico la variable $ _SESSION por la clave apropiada, y coloco el valor en la ranura #default_value si hay algo presente.

15

Puede usar $ form_state ['storage'] en su controlador de envío para acumular valores entre pasos. Así que añadir una función de presentar de este modo:

function addnewproduct_form_submit ($form, &$form_state) { 
    // Store values 
    $form_state['storage']['addnewproduct_productname'] = $form_state['values']['productname']; 
    // Rebuild the form 
    $form_state['rebuild'] = TRUE;  
} 

A continuación, la función de su constructor forma se convertiría en:

function addnewproduct_form(&$form_state) { 

$form = array(); 

$form['productname'] = array (
'#type' => 'textfield', 
'#title' => t('Product Name'), 
'#required' => TRUE, 
'#size' => '20', 

); 

if (isset($form_state['storage']['addnewproduct_productname'])) { 
    $form['productname']['#default_value'] = $form_state['storage']['addnewproduct_productname']; 
} 

return $form; 
} 

Sólo recuerde que su forma se mantendrá siendo generado el tiempo que su $ form_state [ 'almacenamiento'] está lleno. Por lo tanto, deberá ajustar su manejador de envío y unset ($ form_state ['storage']) cuando esté listo para guardar valores en la base de datos, etc.

Si su forma es más parecida a un filtro, es decir. se utiliza para mostrar en lugar de almacenar información, entonces usted puede conseguir lejos con sólo

function addnewproduct_form_submit ($form, &$form_state) { 
    // Rebuild the form 
    $form_state['rebuild'] = TRUE;  
} 

Cuando la forma reconstruye tendrán acceso a $ form_state [ ''] los valores de la iteración anterior.

+0

excelente respuesta ¡He estado buscando esto por días! +1 – FLY

+0

+1 para obtener ejemplos detallados. – Nafscript

-1

No estoy seguro si esto funcionaría para usted, pero usted podría intentar añadir la clave #default_value a la forma array

$form['productname'] = array (
'#type' => 'textfield', 
'#title' => t('Product Name'), 
'#required' => TRUE, 
'#size' => '20', 
'#default_value' => variable_get('productname', ''), 
); 

De esta forma si la variable se establece que va a agarrar lo que sea, pero si no se puede usar un valor predeterminado

+0

Es demasiada solución GLOBAL, overkilling –

1

Drupal va a hacer esto por defecto si se incluyen:

$formproductname['#redirect'] = FALSE; 

En la matriz $ formproductname.

0

que prefiere guardar todos los valores en un momento en que estamos hablando de formas complejas:

foreach ($form_state['values'] as $form_state_key => $form_state_value) { 
    $form_state['storage'][$form_state_key] = $form_state['values'][$form_state_value]; 
} 
0

Para aquellos que buscan una respuesta aquí durante el uso de formulario web (que acabo luchado a través), esto es lo que terminé haciendo:

//in hook_form_alter 
$form['#submit'][] = custom_booking_form_submit; 

function custom_booking_form_submit($form, &$form_state) { 
// drupal_set_message("in form submit"); 
// dpm($form_state, 'form_state'); 

    foreach ($form_state['values']['submitted_tree'] as $form_state_key => $form_state_value) { 

     $form_state['storage'][$form_state_key] = $form_state_value; 
    } 
} 

Nota: se ha añadido el 'ya que se perdió

0

simplemente añadiendo reconstruido = true hará el trabajo:

$form_state['rebuild'] = TRUE; 

versión: Drupal 7

0

En mi caso he tenido un par de menús desplegables. Presentar el formulario publicado en la misma página, donde podría filtrar una vista y quería mostrar las opciones seleccionadas anteriormente.En la presentación de la forma he construido una cadena de consulta en el gancho de presentar:

function myform_submit($form, &$form_state) { 

    $CourseCat = $form_state['values']['coursecat']; 

    drupal_goto("courses" , array('query' => 
    array('cat'=>$CourseCat)) 
); 
} 

En el gancho de forma de la estructura, todo lo que hice fue conseguir la cadena de consulta actual y usó esos como valores por defecto, así:

function myform_form($form, &$form_state) { 
    $Params = drupal_get_query_parameters(); 
    $CatTree = taxonomy_get_tree(taxonomy_vocabulary_machine_name_load ('category')->vid); 

    $Options = array(); 
    $Options ['all'] = 'Select Category'; 
    foreach ($CatTree as $term) { 
     $Options [$term->tid] = $term->name; 
    } 
    $form['cat'] = array(
    '#type' => 'select', 
    '#default_value' => $Params['cat'],  
    '#options' => $Options 
); 

    $form['submit'] = array(
    '#type' => 'submit', 
    '#default_value' => 'all', 
    '#value' => t('Filter'), 
); 

    return $form; 
} 
Cuestiones relacionadas