Aggiornare form dopo invio

9 contenuti / 0 new
Ultimo contenuto
Aggiornare form dopo invio

Ciao ragazzi, sto sviluppando un nuovo modulo come progetto di tesi e ho la necessità di aggiornare un form dopo averlo inviato. Vi posto un estratto del mio codice per non annoiarvi con righe inutili...

function node_save_node_save_form($form_state, $node, $fields, $files) {
  $form['sections'] = array(
    '#type' => 'fieldset',
    '#title' => t('Choose sections to save in your file'),
    '#tree' => true,
    '#collapsible' => true,
    '#collapsed' => false
  ); 
  foreach($fields as $k=>$v){
    $form['sections']['sec'.str_replace(" ", "_", $k)] = array(
      '#type' => 'checkbox',
      '#title' => t($k),
      '#attributes' => array('checked'=>'checked'),
    //  '#default_value' => variable_get('sec'.str_replace(" ", "_", $k), 1),
    );
  }
  $form['refresh'] = array(
    '#type' => 'submit',
    '#value' => t('Refresh preview'),
  );
  //è una variabile che controlla i checkbox selezionati e esegue delle operazioni
  $preview = [...];
  $form['content'] = array(
    '#type' => 'textarea',
    '#title' => t('preview (read only)'),
    '#rows' => 20,
    '#value' => $preview,
  '#attributes' => array('readonly' => 'readonly'),
  );
  return $form;
}
function node_save_node_save_form_submit($form, &$form_state){
  switch($form_state["clicked_button"]["#value"]){
    case "Refresh preview":
      drupal_set_message("refresh preview ");
      break;
  }
}

Il problema è che quando clicco il bottone "Refresh preview" i checkbox ovviamente restano selezionati. Io cerco un sistema che quando il form viene rigenerato, i checkbox siano nella situazione precedente all'invio (ovvero, alcuni selezionati, altri no) in modo da far modificare correttamente la stringa $preview.
Come posso fare?

Prova a impostare nella funzione di submit il rebuild nell'array form_state:

<?php
$form_state
['rebuild'] = TRUE;
?>

niente da fare...mannaggiaaaaaaaaa sono disperato!
allora, ho fatto così per vedere se qualcosa cambia ma non va in ogni caso:

<?php
function node_save_node_save_form($form_state, $node, $fields, $files) {
 
$form['sections'] = array(
   
'#type' => 'fieldset',
   
'#title' => t('Choose sections to save in your file'),
   
'#tree' => true,
   
'#collapsible' => true,
   
'#collapsed' => false
 
); 
  foreach(
$fields as $k=>$v){
   
var_dump(variable_get("sections_sec".$k, 0));
   
$form['sections']['sec'.str_replace(" ", "_", $k)] = array(
     
'#type' => 'checkbox',
     
'#title' => t($k),
    );
  }
  [...]
  return
$form;
}
function
node_save_node_save_form_submit($form, &$form_state){
 
$form_state['rebuild'] = TRUE;
  switch(
$form_state["clicked_button"]["#value"]){
    case
"Refresh preview":
      foreach(
$form_state['values']['sections'] as $k=>$v){
       
variable_set("sections_sec".$k, $v);
      }
      foreach(
$form_state['values']['files'] as $k=>$v){
       
variable_set("files_fil".$k, $v);
      }
     
drupal_set_message("refresh preview ");
      break;
  }
}
?>

ma ciò che ottengo con var_dump è sempre int(0)...non ci credo che drupal non permetta di passare dei valori al form ricaricato

Scusami non ho capito che cosa stai cercando di ottenere.
Ti servono dei valori da ridare alla funzione che crea il form per farli controllare a quella variabile $preview?

In tal caso ti serve l'implementazione della funzione di validazione (funzione_che_crea_il_form_validate($form, &$form_state))

Altrimenti dovresti provare a fare una specie di form multipage utilizzando lo storage bin ($form_state['storage']). Qui ho trovato un breve tutorial.

Provo a spiegarmi perchè il tutorial che mi hai postato, anche se chiarissimo non credo faccia al caso mio dato che pur avendo aggiunto

<?php
$form_state
['storage']['values'] = $form_state['values'];
$form_state['rebuild'] = true;
?>

alla funzione submit, lo stato delle checkbox resta invariato... il tutorial che mi hai allegato serve per memorizzare i due step del form ma il mio è un singolo form. In pratica ho un tot di checkbox tutte checked="checked" che, se selezionate o meno generano un'anteprima di una parte o dell'intero articolo preso in considerazione. Ovviamente quando il form viene caricato la prima volta, essendo tutte cheched l'anteprima generata sarà intera. Ora, mettiamo che l'utente non voglia salvarsi la parteB dell'articolo, quindi deseleziona la checkbox corrispondente alla parte e, cliccando sul bottone "refresh preview", il form viene reinviato e vorrei che la checkbox fosse deselezionata e che quindi, l'anteprima non venga generata. Il mio problema è che inviando il form le checkbox tornano al loro stato di default (cioè tutte checked).
Come posso ovviare? senza usare drupal farei molto semplicemente (in pseudocodice)
<?php
(isset($chec_passata) && !is_checked($chec_passata))? '' : 'checked="checked"'
?>

Ok, finalmente ce l'ho fatta dopo una cinquantina di var_dump LOL metto la soluzione nel caso serva a qualche altra persona ;)

<?php
foreach($fields as $k=>$v){
   
$form['sections']['sec'.str_replace(" ", "_", $k)] = array(
     
'#type' => 'checkbox',
     
'#title' => t($k),
     
'#attributes' => (isset($form_state['storage']['sec'.str_replace(" ", "_", $k)]) && $form_state['storage']['sec'.str_replace(" ", "_", $k)]==0)?'': array('checked'=>'checked'),
    );
  }
foreach(
$files as $k=>$v){
   
$form['files']['fil'.str_replace(" ", "_", $k)] = array(
     
'#type' => 'checkbox',
     
'#title' => t($v['label'].' - '.$v['name'].' ('.round($v['size']/1024, 2).' KB)'),
     
'#attributes' => (isset($form_state['storage']['fil'.str_replace(" ", "_", $k)]) && $form_state['storage']['fil'.str_replace(" ", "_", $k)]==0)? '' : array('checked'=>'checked'),
    );
  }
 
$form['refresh'] = array(
   
'#type' => 'submit',
   
'#value' => t('Refresh preview'),
  );
  return
$form;
}
function
node_save_node_save_form_submit($form, &$form_state){
  switch(
$form_state["clicked_button"]["#value"]){
    case
"Refresh preview":
      foreach(
$form_state['values']['sections'] as $k=>$v){
       
$form_state['storage'][$k] = $v;
      }
      foreach(
$form_state['values']['files'] as $k=>$v){
       
$form_state['storage'][$k] = $v;
      }
     
$form_state['rebuild'] = TRUE;
     
drupal_set_message("refresh preview ");
      break;
  }
}
?>

In ogni caso ti ringrazio per il tempo che mi hai dedicato, in un certo senso mi hai indirizzato sulla giusta strada ^__^
Ciaooooooooooooooooo

e meno male,
.. ero già alla seconda salvata di questo post
Ciauuuuu §:l)

Lavatrice ad ultrasuoni
Sito http://www.ultrasuoni.net > Client service and contacts: [email protected]

cos'è la "salvata"? LOL

La salvata =
La seconda volta che mi risalvo la paginetta nel mio piccì n.4

PS
è un termine "social-urbano", assimilabile a "La birrata" , per citare un esempio.

Lavatrice ad ultrasuoni
Sito http://www.ultrasuoni.net > Client service and contacts: [email protected]