sviluppo form ahah

8 contenuti / 0 new
Ultimo contenuto
sviluppo form ahah
AllegatoDimensione
Image icon 04-10-2012-10-17-53.png11.71 KB

Salve a tutti, avrei davvero bisogno di capire come creare un form in modalità AHAH come da immagine allegata ma al posto del campo data altri due campi.
C'è qualcuno che potrebbe darmi una mano nello sviluppo.
Ho provato a seguire le varie guide online, ma data la mia poca esperienza in programmazione mi risulta molto difficile.
In particolare non riesco a capire come inserire i campi all'interno della stessa riga.
Ho capito che ci sono i campi prefix e suffix che dovrebbero risolvere il caso ma non ho idea di come proseguire.
L'immagine allegata si riferisce ad un form per drupal 7 ma a me interessa svilupparlo in drupal 6.
Spero che qualcuno possa darmi delle linne guida per proseguire.
Grazie

Drupal Version:

"a me interessa svilupparlo in drupal 6." ?? Ma è fantastico, sai quanti ne ho fatti io!!
http://www.danzisiweb.altervista.org/?q=it/input-form-Drupal-ahah-themiz...

Per i field in linea o usi la funzione theme un po complessa che permettere di mettere in linea i campi che vuoi oppure:

<?php
  $form
['basic']['title'] = array(
   
'#type' => 'fieldset',
   
'#title' => t('Description'),
   
'#collapsible' => TRUE,
   
'#collapsed' => FALSE,
  );
$form['basic']['title'] = array(
   
'#type' => 'textfield',
   
'#title' => t('Title'),
   
'#description' => t('Description'),
   
'#maxlength'=> 255,
       
'#required' => TRUE,
   
'#default_value' => !empty($txt_field) ? $txt_field : '',
       
'#prefix' => '<div class="container-inline">',
);
$form['basic']['pass'] = array(
 
'#type' => 'password',
 
'#title' => t('Password'),
 
'#maxlength' => 64,
 
'#size' => 15,
 
'#suffix' => '</div>',
);
$form['basic']['submit'] = array(
   
'#type' => 'submit',
   
'#value' => t('Submit'),
   
'#submit' => array('mymodule_form_submit'),
    );
return
$form;
?>

In questo caso title e pass saranno in linea grazie alla classe di sistema container-inline.
Ciao!

grazie per la risposta danzisi e scusami per il ritardo...avevo dato già un occhiata al tuo link ma cercherò meglio nei dettagli...provo e ti faccio sapere con delgi utleriori aggiornamenti e magari postando un po di codice ..nella speranza che possa essere di aiuto a qualcun'altro.
scusa per il ritardo nella risposta..

OK..cercherò di spiegare meglio il tutto.
Io ho un mio modulo che attraverso del codice php(o per meglio dire librerie) effuano determinate operazioni... Queste operazioni hanno bisogno di specifiche impostazioni che vanno settate, attraverso il form, e inserite sia nella tabella 'variables' del db di drupal($conf) che su un file di configurazione php o puramente txt.
Devo sviluppare quindi un form di amministrazione per il modulo che si occupi delle suddette informazioni.
Le funzioni principali per effettuare il salvataggio delle variabili nella tabella 'variables' sono :
variable_set, variable_get e variable_del che inseriscono i valori nella varibile globale $conf.

Per quanto riguarda il file di configurazione saranno invece necessarie le funzioni fopen,fwrite per inserire i dati nell'apposito file.

Ma andiamo per passi. Comincio con il creare il mio semplice form che mi permetta di aggiungere dinamicamente il tipo di impostazione composta di più campi come su detto. Posto di seguito un'esempio con il campo composto da un testo e da un peso.
Ho trovato vari help online su questo argomento ma, come già detto, non ho molta esperienza di programmazione e quindi ho un po' di difficolta a capire il funzionamento dei codici e in particolare il ruolo della variabile $form_state e delle FAPI. Al tuttoaggiungete che la mia conoscenza dell'inglese è abbastanza scarsa. :-(.
Comunque di santa pazienza nelle settimane precedenti ho cercato di testare le modalità di utilizzo delle funzionalità AHAH per il mio caso seguendo le seguenti guide:

- http://injustfiveminutes.com/2012/10/04/appending-form-elements-using-ah...
- http://joshbenner.me/blog/prevent-ahah-the-right-way-from-breaking-with-...
- http://www.katbailey.net/blog/dual-aspect-drupal-forms-and-what-means-yo...
- https://drupal.org/node/331941
comunque ho cercato di utilizzare uno degli esempi più semplici e cioè quello di inserire i campi dinamicamenti ma non in una tabella grafica per adesso(..ripeto..cerco di andare per passi;-)..nella speranza che possa essere di aiuto anche per altri.
Ecco la prima versione del codice:

function mymodule_menu() {
    $items = array();
    $items['mymodule/form'] = array(
        'title' => t('AHAH ADD QUERY'),
        'description' => t('This is to test using AHAH with Drupal Forms'),
        'page callback' => 'drupal_get_form',
        'page arguments' => array('mymodule_form'),
        'access callback' => TRUE,
        'type' => MENU_NORMAL_ITEM,
    );
    $items['mymodule/js'] = array(
        'title' => 'javascript query API form',
        'page callback' => 'mymodule_callback_js',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    return $items;
}
function mymodule_form(&$form_state, $form = array()) {
//...ci son altri campi del form che qui tralascio e teniamo in considerazione
$form['mymodule_wrapper'] = array(
    '#type' => 'markup',
    '#value' => '',
    '#prefix' => '</pre> <div class="ret-border">', // border wrapper
    '#suffix' => '</div> <pre>',
);
$form['mymodule_wrapper']['box'] = array(
    '#type' => 'markup',
    '#value' => '',
    '#prefix' => '</pre> <div id="box">', //ahah container
    '#suffix' => '</div> <pre>',
);
$form['mymodule_wrapper']['box']['new-query-wrapper-0']['text-query-0']=array(
    '#type' => 'textfield',
    '#title' => t('Testo della ricerca'),
    '#default_value' => variable_get('text-query-0', check_plain($form_state['values']['text-query-0'])),
    '#size' => '30',
    '#prefix' =>'</pre>
                <div class="text-query-wrapper">',
    '#suffix' => '</div>',
);
$form['mymodule_wrapper']['box']['new-query-wrapper-0']['weight-query-0'] = array(
    '#type' => 'weight',
    '#title' => t('Peso'),
    '#default_value' => 0,
    '#prefix' =>'<div class="weight-query-wrapper">',
    '#suffix' => '</div>
                  </div>
                  <pre>',
    );
  $form['mymodule_add_more'] = array(
      '#type' => 'submit',
      '#value' => t('Add new item'),
      // here is the AHAH magic
      '#ahah' => array(
          'path' => 'mymodule/js',
          'wrapper' => 'box',
          'method' => 'append',
          'effect' => 'fade',
          'progress' => array(
              'type' => 'throbber',
              'message' => t('Aggiunta nuova richiesta alle API Twitter'),
              ),
        ),
  );
  $form['num_items'] = array(
    '#type' => 'hidden',
    '#default_value' => 1,
    );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
}
function mymodule_callback_js() {
  $form = mymodule_new_item_form();
  $output = ahah_render($form, 'new-query-wrapper-');
  print drupal_json(array('status' => TRUE, 'data' => $output));
  exit();
}
function mymodule_new_item_form() {
$form = array();
$num_items = $_POST['num_items'];
$form['text-query-' . $num_items]=array(
    '#type' => 'textfield',
    '#title' => t('Testo della ricerca'),
    '#default_value' => variable_get('text-query-' . $num_items , check_plain($form_state['values']['text-query-'.$num_items])),
    '#size' => '30',
    '#prefix' =>'</pre>
        <div class="text-query-wrapper">',
    '#suffix' => '</div>',
);
$form['weight-query-' . $num_items] = array(
    '#type' => 'weight',
    '#title' => t('Peso'),
    '#default_value' => '0',
    '#prefix' => '<div class="weight-query-wrapper">',
    '#suffix' => '</div> </div> <pre>',
);
  // inject JS code to increment the num_items hidden input when the form element is dynamically added
$form['js_voodoo'] = array(
    '#type' => 'markup',
    '#value' => '<script type="text/javascript">// <![CDATA[
                    $(document).ready(function() {$("#edit-num-items").val(parseInt($("#edit-num-items").val()) + 1)});
                // ]]></script>',
);
return $form;
}
function ahah_render($fields, $name) {
  $form_state = array('storage' => NULL, 'submitted' => FALSE);
  $form_build_id = $_POST['form_build_id'];
  $form = form_get_cache($form_build_id, $form_state);
  $number = $_POST['num_items'];
  $form['num_items']['#value'] = intval($number)+1;
  $name .= $number;
  $form['mymodule_wrapper']['box'][$name] = $fields;
  $js_voodoo = $form['mymodule_wrapper']['box'][$name]['js_voodoo'];
  unset($form['mymodule_wrapper']['box'][$name]['js_voodoo']);
  form_set_cache($form_build_id, $form, $form_state);
  $form += array(
      '#post' => $_POST,
      '#programmed' => FALSE,
  );
  $form['mymodulet_wrapper']['box'][$name]['js_voodoo'] = $js_voodoo;
  $form = form_builder($_POST['form_id'], $form, $form_state);
  $new_form = $form['mymodule_wrapper']['box'][$name];
  return drupal_render($new_form);
}
function mymodule_form_validate($form, &$form_state) {
  $number = intval($form_state['values']['num_items']);
  if(empty($number)) {
    form_set_error('num_items', t('Unexpected error"'));
  }
  for($i=0; $i < $number; $i++) {
    $full_query = $form_state['values']['text-query-' . $i];
    if(empty($full_query)) {
      form_set_error('text-query-' . $i, t('Testo di ricerca obbligatorio'));
      return;
    }
  }
}

Ora per salvare il solo campo testo (per adesso), è giusto usare nel campo #default_value la funzione variable_get con form_state come parametro??
ho creato quindi una funzione che gestisca il submit per salvare le variabili come segue:
function mymodule_form_submit(){
$num_query = $form_state['values']['num_items'];
for($i=0; $i < $num_query; $i++){
   variable_set('text-query-' .$i, $form_state['values']['text-query-'.$i]);
   dpm('Form text '.$i.' salvato con valore '. variable_get('text-query-'.$i, ) );
}
}

funziona ma le variabili non vengono salvate in $conf, in quanto non compaionoin "Variable editor" (Devel Module), e in più una volta cliccato su submit ricompare il form con un solo campo con i vaori precedentemente inseriti.
Sbaglio di sicuro qualcosa sulla gestione del form che a quanto ho capito regge molto sulla variabile $form_state e funzioni che sano in grado di cachare i valori in seriti nel form e ricostruiti al momento opportuno ma non riesco a capire qualle sia il corretto flusso di lavoro.
Purtroppo la maggior parte degli esempi si riferiscono a nodi o comunque a dati inseriti in tabella, invece io voglio che i miei dati stiano nella tabella 'variables' e successivamente inserirli anche in un file di configurazione che avraà determinati scopi...ma andiamo per passi.
Quindi la domanda è se non posso passare giustamente &$node in quanto non faccio uso di nodi, cosa devo passare al form?? $conf??..ma è una variabile globale di drupal..si puo'?..in realto ci ho provao ma non è cambiato nulla...
Grazie a tutti eventuali aiuti...so che sto forse chiedendo troppo..ma non so più a chi rivolgermi.

Quote: "so che sto forse chiedendo troppo.."

...appena ho tempo testo il codice, intanto utilizza o form redirect o from rebuild nell'hook submit.
Ciao

ok..ci provo...grazie..

inserendo in mmodule_form_submit il seguente codice prima di tutto

$form_state['redirect'] = FALSE;

dopo aver cliccato 'Submit' mi ritonrn tutti i campi già inseriti ma a quanto pare non vengono memorizzati in $conf.
Questa è la mia prima esperienza con lo sviluppo di un form. In precedenza avevo sviluppato un modulo custom con l'utilizzo di hook_block, e in quel caso per poter passare le variabili al form di configurazione del blocco bastava passare all'hook la variabile $edit, che si occupa appunto della gestione delle variabili salvate in $conf. Come si può fare lo stesso per un modulo custom e la gestione di questi dati attraverso l'hook_form , per me rimane un mistero..:-(
spero di non aver detto troppe idiozie..

Provando il codice, ora funziona salvando il tutto.
Le modifiche effettuate sono la precedente consigliata da danzisi e nell'inserimento dei parametri nella funzione variable_get() in entrambi i casi come segue:

...
'default_value' => variable_get('nome form', FALSE),
...

Ora mi ritrovo dopo l'aggiornamento 'submit' il primo campo aggiunto con i valori salvati e solo lui.
Gli altri campi invece risultano sì salvati nella tabella ma non vengono visualizzati.
A questo punto credo di dover usare la funzione drupal_rebuild_form() per rigenerare i campi inseriti(magari in una tabella grafica).
Se qualcuno ha suggerimenti veloci saranno moooolto apprezzati...grazie comunque..
Mi metto a lavoro nel frattempo nella speranza di aggiornare il tutto al più presto.