Problema molto banale con form

7 contenuti / 0 new
Ultimo contenuto
Problema molto banale con form

Salve a tutti!

E' la prima volta che mi trovo a sviluppare un modulo per Drupal (7) e, dopo un'inizio abbastanza "liscio" mi sono bloccato su una cosa probabilmente molto banle ma che proprio non riesco a risolvere:

devo realizzare un form con un elenco a discesa del tipo:

function prova($form, &$form_state) {
  $form['xxx'] = array(
    '#type' => 'select',
    /* ecc */
  );
   $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Aggiorna',
  );

Il form è visualizzato correttamente e contiene (nella sua lista) tutto ciò che deve contenere...ma come faccio a recuperare il valore scelto dall'utente una volta che ha schiacciato il tasto "Aggiorna"?

Io avevo pensato di usare una cosa del tipo:

<?php
 $valore
= $_POST['xxx']
?>

ma non mi pare che funzioni!

Grazie!

Devi continuare a leggere la guida e gli esempi della Form API… :) Crei una funzione di _submit e lì ricevi i valori.

Pinolo wrote:
Devi continuare a leggere la guida e gli esempi della Form API… :) Crei una funzione di _submit e lì ricevi i valori.

Ti ringrazio tanto per il consiglio!

Comunque...sarà che non sono abituato a pagine e pagine di documentazione in inglese (dopo la prima mezz'ora di lettura ho bisogno du una pausa di pari tempo almeno :-) ma non sono riuscito a trovare nella documentazione uffuciale una spiegazione chiara, ma, ripeto, credo sia colpa mia.

Ad ogni modo ho creato la funzione [FORM_ID]_submit e piano piano sto ottendendo ciò che voglio.

Ci sono ancora degli aspetti che mi sfuggono...ad esempio, con l'attributo #default_value ho visto che si può impostare il valore default che compare già selezionato nell'elenco. Vorrei però che questo valore restasse quello scelto dall'utente dopo aver schiacciato il tasto di submit.

Per far ciò avevo pensato di usare una cosa del tipo:

'#default_value' => !empty($form_state['values']['FORM_ID']) ? $form_state['values']['FORM_ID'] : 'VALORE DI DEFAULT',

ma viene impostato sempre il valore di default....

Cosa deve succedere dopo il submit? Se il form è inviato, viene resettato al suo stato iniziale. A tutti gli effetti stai vedendo un form "nuovo". Se invece vuoi intercettare i valori prima del submit, ti conviene lavorare su una funzione _validate.

Tutte queste cose (compresa una sezione "understanding the flow") sono spiegate molto chiaramente e senza dilungarsi troppo nella pagina "quickstart" della form API.

Dunque....la mia situazione è questa: devo creare un modulo che generi una pagina con una form di tipo select.

Questa form presenta un elenco leggendolo da un file xml generato da un'altro sito.

Quando l'utente fa la sua scelta il resto del contenuto della pagina deve cambiare in funzione di questa...puo esserci il caso di visualizzare un'immagine, o del testo ec...

Una sorta di soluzione che ho abbozzato è questa:

function contenutoAjax($form, &$form_state) {
  $form['select'] = array(
    '#title' => t('Fai la tua scelta'),
    '#type' => 'select',
    '#options' => creaContenuto('list'),
    '#default_value' => 'Nulla',
    '#attributes' => array('style' => 'width:100%'),
    '#ajax' => array(
      'callback' => 'contenutoAjax_callback',
      'wrapper' => 'contenuto-div',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );
  $form['contenuto'] = array(
    '#title' => t("Hai scelto"),
    '#prefix' => '<div id="contenuto-div">',
    '#suffix' => '</div>',
    '#type' => 'fieldset',
    '#description' => generaContenuto((!empty($form_state['values']['select']) ? $form_state['values']['select'] : 'Nulla'),
  );
  return $form;
}
function contenutoAjax_callback($form, $form_state) {
  return $form['forecast'];
}

Solo che...non credo sia una soluzione corretta...in particolare l'uso che faccio di '#description' (praticamente lo uso per visualizzare ciò che dovrei visualizzare nel resto della pagina)

Forse meglio così:

function contenutoAjax($form, &$form_state) {
  $form['select'] = array(
    '#title' => t('Fai la tua scelta'),
    '#type' => 'select',
    '#options' => creaContenuto('list'),
    '#default_value' => 'Nulla',
    '#attributes' => array('style' => 'width:100%'),
    '#ajax' => array(
      'callback' => 'contenutoAjax_callback',
      'wrapper' => 'contenuto-div',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );
  $form['contenuto'] = array(
    '#title' => t("Hai scelto"),
    '#prefix' => '<div id="contenuto-div">',
    '#suffix' => '</div>',
    '#type' => 'fieldset',
    '#description' => 'Ecco cos'hai scelto,
  );
  $form['contenuto']['output'] = array(
          '#markup' =>generaContenuto((!empty($form_state['values']['select']) ? $form_state['values']['select'] : 'Nulla',
          '#weight' => 1,
  );
  return $form;
}
function contenutoAjax_callback($form, $form_state) {
  return $form['forecast'];
}

Guarda qui: http://drupal.org/project/examples
C'è un modulo con un esempio di implementazione di AJAX.