form+tabella, problema con le api

9 contenuti / 0 new
Ultimo contenuto
form+tabella, problema con le api

ciao, dovrei impaginare una form all'interno di una tabella.
dopo tantissime ricerche e prove sembra che sono vicino ad una soluzione +/- pulita ma ho un problema

con il codice che segue creo la tabella e inserisco i campi correttamente all'interno delle celle ma:
1) l'attributo name in tutti i campi è vuoto!
2) la tabella dovrebbe essere contenuta all'interno della form, ma non riesco a stampare la form con le api di drupal.

<?php
function creaFormCitta(){
   
$query    =    "SELECT * FROM all_city ORDER BY name_state";
   
$result    =    db_query($query);
   
$form = array();
    while (
$row = db_fetch_array($result)){
        
$form["{$row['code_city']}"] = array('#tree' => TRUE );
        
$form["{$row['code_city']}"]['code_state'] = array(
         
'#type' => 'hidden',
         
'#value' => $row['code_state'],
         
'#required' => TRUE,
         );
        
$form["{$row['code_city']}"]['code_city'] = array(
         
'#type' => 'hidden',
         
'#value' => $row['code_city'],
         
'#required' => TRUE,
         );
        
$form["{$row['code_city']}"]['peso'] = array(
         
'#type' => 'textfield',
         
'#title' => 'peso',
         
'#value' => $row['peso'],
         
'#size' => 4,
         
'#maxlength' => 4,
         
'#required' => TRUE,
         );
// ...altri campi
   
}
   
$form['submit'] = array(
    
'#type' => 'submit',
    
'#value' => t('SAVE'),
    );
    return
$form;
}
function
creaTabCitta(){
   
$header =     array('State', 'City', 'PESO' /* ...altri... */ );
   
$arr    =    creaFormCitta();
   
$rig    =    array();
    foreach (
element_children($arr) as $v){
       
$col      = array();
        foreach (
element_children($arr[$v]) as $k2=>$v2) {
           
$col[]    =    ($arr[$v][$v2]['#type']=="hidden")
                    ?   
$arr[$v][$v2]['#value'] . drupal_render($arr[$v][$v2] )
                    :   
drupal_render($arr[$v][$v2] ) ;
        }
       
$rig[]    = array( 'data' => $col, 'align' => 'left' );
    }
    return
theme('table', $header, $rig, array('class'=>'tabCITTA') );
}   
print
creaTabCitta();
 
?>

il rusultato è questo:

<table class="tabCITTA sticky-enabled">
<thead><tr><th>State</th><th>City</th><th>PESO</th><!-- altri --> </tr></thead>
<tbody>
  <tr align="left" class="odd"><td>AL<input type="hidden" name="" id="" value="AL"  /></td>
<td>TIRANA<input type="hidden" name="" id="" value="TIRANA"  /></td>
<td>
<div class="form-item">
  <label>peso: <span class="form-required" title="This field is required.">*</span></label>
  <input type="text" maxlength="4" name="" id="" size="4" value="0" class="form-text required" />
</div>
</td>
<td>
<div class="form-item">
  <label>hotel: <span class="form-required" title="This field is required.">*</span></label>
  <input type="text" maxlength="180" name="" id="" size="8" value="" class="form-text required" />
</div>
</td>
  </tr>
<!-- altri -->
<!-- altri -->
</tbody>
</table>

ho cercato di riscrivervi il codice nel modo più leggibile possibile
sono già due giorni che ci sbatto su questa impaginazione della form nella tabella, ...chiedo aiuto :)

La strada più pulita è:

<?php
// ...
$form['#theme'] = 'themize_my_form';
// ...
function theme_themize_my_form($form) {
 
// ...
  // qui generi il tuo form con
  // ...
}
?>

ti rimando allo studio delle api per capire come fare per bene..

Ciao
Marco
--
My blog
Working at @agavee

ciao potresti darmi qulche link più preciso o magari qualche info in più.
Ciao, grazie.

Ciao
Marco
--
My blog
Working at @agavee

ciao grazie per la pazienza....
sono 2 giorni che studio quelle funzioni, sarà un mio limite ma ho bisogno di qualche input in più

http://drupal.org/node/112358#comment-841653
seguendo la discussione dellink sopra, ho adattato il mio caso

<?php
function formCitta() {
  return
drupal_get_form('formCitta_overview');
}
function
formCitta_overview() {
 
$r = db_query('SELECT code_city,code_state,peso FROM all_city ORDER BY name_state');
  while (
$row = db_fetch_object($r)) $rows[] = $row;
  foreach (
$rows as $v) {
    
$form[$v->code_city] = array('#tree' => TRUE );
    
$form[$v->code_city]['code_state'] = array(
     
'#type' => 'hidden',
     
'#value' => $row['code_state'],
     
'#required' => TRUE,
     );
    
$form[$v->code_city]['code_city'] = array(
     
'#type' => 'hidden',
     
'#value' => $row['code_city'],
     
'#required' => TRUE,
     );
    
$form[$v->code_city]['peso'] = array(
     
'#type' => 'textfield',
     
'#value' => $row['peso'],
     
'#size' => 4,
     
'#maxlength' => 4,
     
'#required' => TRUE,
     );
  }
  return
$form;
}
function
theme_formCitta_overview($form) {
  foreach (
element_children($form) as $v) {
   
$row = array();
   
$row[] = drupal_render($form[$v]['code_state']);
   
$row[] = drupal_render($form[$v]['code_city']);
   
$row[] = drupal_render($form[$v]['peso']);
   
$rows[] = $row;
  }
 
$output = theme('table', array(), $rows);
 
$output .= drupal_render($form);
  return
$output;
}
print
theme_formCitta_overview(formCitta_overview());
exit();
?>

risultato identico, mi stampa l'html della form correttamente nella tabella ma con l'attributo name sempre vuoto
unica cosa positiva il problema al secondo punto del primo post è risolto.

mi manca qualcosa, effettivamente con quel
foreach (element_children($form) as $v)
drupal non riesce a leggere il valore dell'attributo name poichè lo dovrebbe prendere dalla chiave dell'array che struttura la form

idee? grazie 1000

allora faccio un po di ordine dopo aver letto un po di documentazione
(potrebbe servire a qualcuno, almeno gli evito il mio sbattimento)
così come ho scritto l'ultimo codice non è una soluzione ^^ortodossa^^, standard...per temizzare una form
il codice funzione a metà ,nel senso che forza il theming della form, inserendo correttamente nella tabella ma come scritto prima gli attributi dei campi della form risultano vuoti (per il motivo detto nel precedente post)

qui:
http://api.drupal.org/api/file/developer/topics/forms_api.html/6
sono indicate due procedure
Theming Forms
1) << Including any markup directly as an element in the $form array: >>...cioè con '#prefix' e '#suffix'
complicata per form complesse
2) quella che cercavo di fare io: è separare la funzione per temizzare la form: << Break out any markup into a separate theme function. This is the preferred method if the markup has any degree of complication.... >>

dunque il codice scritto nel precedente post va comunque bene basterebbe richiamare la funzione: formCitta()
ovvero: drupal_get_form('formCitta_overview');
dove: formCitta_overview rappresenta l'id della form e allo stesso tempo la funzione che drupal chiama per avere l'array della form.

la funzione: theme_formCitta_overview($form) è corretta , va bene e temizza la form, così comescritto nel link che ho scritto prima
<< it is accomplished by creating a theme function with theme_ prepended to the name of the form ID that is to be themed. >>

se solo venisse richiamata da Drupal!
allora ,da quello che ho capito... creando un modulo tutto dovrebbe funzionare

ma devo creare una sola pagina con questa form e a quanto pare, inserendo questo codice in una comune pagina o story (in modalità php, ovvio) la form viene creata ok, ma la funzione che dovrebbe temizzarla, drupal non la prende in considerazione...

ho provato a metterla nel file template.php (del tema in uso) ma nulla...

soluzioni? se non quella di creare un nuovo modulo per una sola pagina?

hemm... scusa ma hai messo da qualche parte:

<?php
$form
['#theme'] = 'formCitta_overview';
?>

no, perchè non lo leggo da nessuna parte, ovvio che non viene richiamato ;)

Ciao
Marco
--
My blog
Working at @agavee

ciao mavimo, questo è tutto il codice ( inserito in una 'story' con input format: Php Code)

<?php
function formCitta_overview() {
 
$r = db_query('SELECT code_city,code_state,peso FROM all_city ORDER BY name_state LIMIT 5');
  while (
$row = db_fetch_object($r)) $rows[] = $row;
  foreach (
$rows as $v) {
    
$form[$v->code_city] = array('#tree' => TRUE, '#theme' => 'formCitta_overview');
    
$form[$v->code_city]['code_state'] = array(
     
'#type' => 'hidden',
     
'#value' => $v->code_state,
     
'#required' => TRUE,
     );
    
$form[$v->code_city]['code_city'] = array(
     
'#type' => 'hidden',
     
'#value' => $v->code_city,
     
'#required' => TRUE,
     );
    
$form[$v->code_city]['peso'] = array(
     
'#type' => 'textfield',
     
'#value' => $v->peso,
     
'#size' => 4,
     
'#maxlength' => 4,
     
'#required' => TRUE,
     );
 }
  return
$form;
}
function
theme_formCitta_overview($form) {
  foreach (
element_children($form) as $v) {
   
$row = array();
   
$row[] = drupal_render($form[$v]['code_state']);
   
$row[] = drupal_render($form[$v]['code_city']);
   
$row[] = drupal_render($form[$v]['peso']);
   
$rows[] = $row;
  }
 
$output = theme('table', array(), $rows);
 
$output .= drupal_render($form);
  return
$output;
}
function
formCitta() {
  return
drupal_get_form('formCitta_overview');
}
print
formCitta();
?>

mi stampa solo la form, senza inserla nella tabella....

ho letto anche che bisogna 'registrare' la funzione theme_formCitta_overview($form) ma come?

[edit]
ovviamente ho provato anche con :

<?php
  $form
['#theme'] = 'formCitta_overview');
?>

invece che:
<?php
  $form
[$v->code_city] = array('#tree' => TRUE, '#theme' => 'formCitta_overview');
?>

ciao, ho risolto! e credo di averci capito anche qualcosina, ma ho ancora una domanda
in questo articolo:
http://www.lullabot.com/articles/modifying-forms-5-and-6
viene spiegato come fare sia nel caso di un modulo che non (ovvero il mio caso)

bisognava 'registrare' la funzione che temizza la form.

ho fatto varie prove ed ho notato che per registrare la funzione: function theme_formCitta_overview($form) si possono seguire più strade:
1. se la form che si vuole temizzare sta all'interno di un modulo, allora con l'hook_theme la si registra (come spiegato nell'articolo)
2. anche se la form non è generata da un modulo, si può registrare la funzione che serve per temizzarlo in qualsiasi modulo aggiungendola alle altre eventuali già presenti nell'hook_theme di quel modulo.
anche se questa non è pratica consigliabile, ma l'ho fatto giusto per capirci di più
3. terza soluzione se la form la genero all'interno di un nodo, e non in un modulo si può registrare la funzione per temizzarla all'interno del file: template.php del tema in uso.

registrando la funzione theme_formCitta_overview la form viene temizzata anche senza aggiungere :
$form['#theme'] = 'formCitta_overview'); infatti se lo aggiungo mi crea due tabelle!

domanda :
ne deduco che come mi consigliava mavimo e cioè aggiungendo: $form['#theme'] = 'formCitta_overview'); drupal dovrebbe capire che la funzione da utilizzare per temizzare la form è quella! e quindi senza registrarla con l'hook_theme dovrebbe richiamarla
ho capito bene? ma se è così dove cavolo sbagliavo io prima? come mai non funzionava...boh.