Submit form: $form_values e $_POST

6 contenuti / 0 new
Ultimo contenuto
Submit form: $form_values e $_POST

Salve a tutti.
Uso la versione 5.1 di Drupal. Ho fatto un modulo con relativa form (miomodulo_form()) , ma non riesco a fare funzionare la funzione di submit. Ho messo un campo nella form del tipo

$form['nome] = array(
'#type' => 'textfield',
'#title' => t('Nominativo'),
'#size' => 50,
'#maxlength' => 50,
'#default_value' => $values['nome'],
'#attributes' => array('title' => t('nome')),
);

essendo $values['nome'] il valore letto da DB.
Ho poi creato la funzione miomodulo_form_submit($form_id, $form_values) e la miomodulo_form_validate($form_id, $form_values). Quando faccio il submit della form (method='post') le due funzioni vengono correttamente chiamate. Però il valore $form_values['nome'] contiene il valore letto inizialmente e non quello aggiornato, mentre l'array $_POST['nome'] contiene correttamente il valore aggiornato.
Tutto questo cosa significa? I valori aggiornati non sono copiati da Drupal in $form_values? Sapete se la versione 5.1 ha un bug in questo senso? Sbaglio qualcosa io? Non so più cosa pensare e fare .... qualcuno sa darmi qualche consiglio.
Grazie

Ciao,

Dando per scontato che drupal 5.1 funziona (non conosco problemi a riguardo/ lo uso tutti i giorni) le funzioni devono essere:

miomodulo_form() Main function
miomodulo_form_validate($form_id, $form_values)
miomodulo_form_submit($form_id, $form_values)

Inoltre all'interno delle funzioni puoi prelevare i valori tramite:

check_plain($form_values['bla'])

Mi sembra tutto corretto verifica, se il problema non lo risolvi posta pure il codice intero!

Grazie uccio per la risposta.
Le tre funzioni che hai indicato le ho fatte ed infatti vengono chiamate.
Ho provato con il checkg_plain($form_values['bla']) ma non ha dato esiti migliori.
Il modulo (si chiama phonebook) è lungo per cui ti riporto le funzioni principali (semplificate)

<?php
/* GESTIONE FORM */
function phonebook_form() {
       
$values=array();
       if (
arg(2)>0) {
   
$sql = "SELECT nome FROM {phonebook} WHERE nid=%d";
   
$result = db_query($sql,arg(2));
       
$values = db_fetch_array($result);
}
   
$form['nome'] = array(
       
'#type' => 'textfield',
       
'#title' => t('Nome'),
       
'#size' => 20,
       
'#maxlength' => 30,
       
'#default_value' => $values['nome'],
       
'#attributes' => array('title' => t('Nome')),
    );
   
$form['submit'] = array('#type' => 'submit', '#value' => t('Salva impostazioni'));
        return
$form;
}
function
phonebook_form_validate($form_id, $form_values) {
  
/* nessuna validazione */
}
function
phonebook_form_submit($form_id, $form_values) {
  
/* verifico il valore aggiornato */
  
print $form_values['nome'];      // stampa il valore vecchio , non aggiornato
  
print $_POST['nome'];               // stampa il valore aggiornato
}
/*
VISUALIZZA FORM
Il modulo elenca dei nomi, selezionandone uno ($nid) viene
aperta la form di modifica chiamando la funzione phonebook_edit($id);
*/
function phonebook_edit($id)
{
     return
drupal_get_form('phonebook_form',$form_values);
}
?>

Che ne pensi? grazie ciao.

FORSE L'ERRORE STA NEL NON AVER CAPITO BENE COME SI USA LA FUNZIONE
drupal_get_form('phonebook_form',$form_values);

Sugli esempi delle API di Drupal trovo sempre

<?php
function miomodulo_form() {
  ...
definizione array $form
 
...
  return
$form;
}
?>

Poi per visualizzare la Form in qualche funzione si chiama la drupal_get_form() .. ad esempio
<?php
function test_miomodulo() {
     return 
drupal_get_form('miomodulo_form');
}
?>

In altri casi invece trovo che la funzione drupal_get_form() sta all'interno della funzione
di costruzione della form stessa. Ad esempio ..

<?php
function miomodulo_form() {
  ...
definizione array $form
 
...
 
$output = drupal_get_form('miomodulo_form');
  return
$output;
}
?>

Ma se la drupal_get_form() chiama proprio la funzione miomodulo_form() in cui è contenuta, si dovrebbero
creare tante chiamate ricorsive alla miomodulo_form() senza mai più uscirne!!!!
Siccome non succede, che logica ha questa benedetta drupal_get_form()?
E ancora , quando viene chiamata nella forma drupal_get_form('miomodulo_form',$form), ma la $form chi deve essere?

Forse chiedo troppo scusate, comunque grazie

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

Dunque ho capito quanto segue, ma devo necessariamente postare un po' di codice:
VISUALIZZA LA FORM

<?php
function phonebook_edit($id)
{
     return
drupal_get_form('phonebook_form',$form_values);
}
?>

FUNZIONE COSTRUTTORE FORM
<?php
function phonebook_form() {
   
// DEFINIZIONE DELLA FORM
   
$values=array();
   
$form = array();
    if (
arg(2)>0) {
       
$sql = "SELECT * FROM {phonebook} WHERE nid=%d";
       
$result = db_query($sql,$id);
           
$values = db_fetch_array($result);
       }
   
$form['#method'] = 'post';
   
$form['cognome_ragsoc'] = array(
       
'#type' => 'textfield',
       
'#title' => t('Nominativo'),
       
'#size' => 50,
       
'#maxlength' => 50,
       
'#default_value' => $values['cognome_ragsoc'],
       
'#attributes' => array('title' => t('Cognome/Ragione sociale')),
    );   
   
$form['nome'] = array(
       
'#type' => 'textfield',
       
'#title' => t('Nome'),
       
'#size' => 20,
       
'#maxlength' => 30,
       
'#value' => $values['nome'],
       
'#attributes' => array('title' => t('Nome')),
    );
   
$form['submit'] = array('#type' => 'submit', '#value' => t('Salva impostazioni'));
    return
$form;
}
?>

ATTENZIONE QUI!!! FUNZIONE THEMATIZZATA PER LA COSTRUZIONE DELLA FORM
Mette in forma tabellare i campi della form
<?php
function theme_phonebook_form($form) {
   
$output = "";
   
$rows[] = array(
       
drupal_render($form['cognome_ragsoc']),
              
drupal_render($form['nome']),
     );
   
$rows[] = array(
        array(
'data' => drupal_render($form['submit']), 'colspan' => 2)
     );    
   
$output .= theme('table', array(), $rows);
    return
$output;
}
?>

ED INFINE LA SUBMIT!!
<?php
function phonebook_form_submit($form_id, $form_values) {
  
/* verifico il valore aggiornato */
  
print $form_values['nome'];        // leggo da array $form_values
  
print $_POSTg['nome'];               // leggo da array $_POST
 
exit();
}
?>

Allora ho scoperto che se non uso la funzione thematizzata trovo i valori aggiornati
nell'array $form_values mentre se la uso ... con il cavolo che li trovo aggiornati!!!!
Ora la theme('table', array(), $rows) genera una tabella e nelle celle (<TD>) c'è il tag HTML <INPUT> e quindii su invio dei dati l'array $_POST viene riempita.
Perchè non succede anche per la $form_values?
Chi riempie e come riempie la $form_values passata alla funzione di submit?
QUESTO LO DEVO ANCORA CAPIRE!!! Se qualcuno lo sa ...
Ciao

P.S.
Resta sempre da capire perchè in alcuni casi ho trovato la funzione drupal_get_form() all'interno del costruttore della form stessa!!

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

Bene ho scoperto un'altra cosa.
Chiaramente ho scoperto l'effetto ma non la causa!!!
Dunque alla funzione thematizzata deve essere aggiunta la seguente riga:
$output .= drupal_render($form);
E quindi la funzione diventa:

<?php
 
function theme_phonebook_form($form) {
   
$output = "";
   
$rows[] = array(
       
drupal_render($form['cognome_ragsoc']),
       
drupal_render($form['nome']),
     );
   
$rows[] = array(
        array(
'data' => drupal_render($form['submit']), 'colspan' => 2)
     );   
  
//AGGIUNGERE QUESTA RIGA!!!!
  //#########################
    
$output .= drupal_render($form);
 
//#########################
  
$output .= theme('table', array(), $rows);
    return
$output;
}
?>

Perchè? .... per il momento così funziona, perchè funziona bisogna ancora capirlo.
Ciao

P.S.
Resta sempre da capire perchè in alcuni casi ho trovato la funzione drupal_get_form() all'interno del costruttore della form stessa!!

________________________________________________________________________________________
Quando risolverai il problema, scrivi come hai fatto, e se puoi scrivi [RISOLTO]
Sarà utile ad altri. Grazie
enzoazzolini.it

Ciao,

Come puoi vedere anche qui: http://www.drupalitalia.org/node/2537
la cosa che fai è corretta, non ho molta dimestichezza con la funzione Theme ma penso che guardando bene il diagramma di flusso di render delle pagine si possa capire il perchè (lo trovi nell' handbooka da qualche parte!)

alla prossima uccio