Salvare i dati di un form

13 contenuti / 0 new
Ultimo contenuto
Salvare i dati di un form

Ciao a tutti,
sono un nuovissimo utilizzatore di drupal, ho creato un piccolo portale per la protezione civile del mio paese. Ho bisogno di un consiglio per implementare una piccola operazione.... non so dove mettere le mani -.-'.

Dovrei creare un semplice form formato da 4 campi (Nome - Cognome - AnnoNascita - IndirizzoResidenza)... questo son riuscito a farlo usando il modulo webform.

In pratica vorrei che un utente compili il form e cliccando sul pulsante submit salvi queste informazioni in qualche modo nel db locale... ma non so come far -.-'.

successivamente vorrei creare una paginetta semplice con una box in cui sono presenti gli anni di nascita e selezionando un anno lui mi visualizza Nomi e Cognomi delle persone nate in quell'anno (query sul db).

E' due giorni che saltello di qua e di la tra guide varie ma non so come fare!!! :'(

Help!!

Sei nuovo, e quindi non mi azzardo neppure a proporti di scriverti un modulo da zero......
Al momento ti consiglio la soluzione più semplice (alla portata di tutti):
cck + views

P.S.
Se sei un programmatore, studiati comunque il funzionamento dei moduli di drupal con cui potrai creare anche cose molto più complesse ed estremamente efficenti

Ciao
Gianni

ciao,
conosco php non è un problema buttar giu il codice :)
se mi dai una mano dovrei riuscire a farlo rannare scrivendo un nuovo modulo.
in un modulo dovrei scrivere le funzioni che voglio (visualizzazione form, post dati, query e visualizz risultati) e poi richiamare queste funzioni quando creo le mie pagini in drupal.

Credimi che non è così semplice... prima devi aver chiaro il concetto di hook, i concetti di nodo ed aver ben chiaro alcuni hook fondamentali come hook_menu, perm ecc... poi devi aver chiaro la struttura dei moduli stessi (.install .module .info)
Quando avrai chiaro i concetti, ti renderai conto della semplicità di drupal, ma fino a quel momento, partire con un progetto da zero è da suicidio :-)

Al momento, ti lascio con un piccolissimo esempio da me fatto, di modulo che gestisce l'inserimento/ricerca/cancellazione di una piccolissima agenda composta da nome/via/telefono x drupal 6

<?php
/**
* Display help and module information
* @param section which section of the site we're displaying help
* @return help text for section
*/
function Agenda_help($section='') {
 
$output = '';
  switch (
$section) {
    case
"admin/help#Agenda":
       
$output .= t('aiuto_admin');
      break;
  }
  return
$output;
}
// function Agenda_help
/**
 * Determiniamo gli accessi al modulo
 * (dando poi i giusti permessi nell'amministrazione)
 */
function Agenda_perm() {
    return array(
'accesso Agenda', 'amministra Agenda', 'ricerca Agenda');
}
/**
 * Implementation of hook_theme().
 */
function Agenda_theme() {
  return array(
   
'Agenda_form_inserisci_modifica' => array(
     
'arguments' => array('form' => NULL),
    )
  );
}
/**
 * Determiniamo i menu del modulo
 *
 */
function Agenda_menu() {
 
$items['Agenda'] = array(
   
'title' => 'Agenda',
   
'page callback' => 'Agenda_aiuto',
   
'access arguments' => array('accesso Agenda'),
   
'type' => MENU_NORMAL_ITEM,
  );
 
$items['Agenda/aggiungi'] = array(
   
'title' => 'Inserimento',
       
'page callback' => 'drupal_get_form',
       
'page arguments' => array('Agenda_form_inserisci_modifica'),
   
'access arguments' => array('amministra Agenda'),
   
'type' => MENU_NORMAL_ITEM,
  );
 
$items['Agenda/ricerca'] = array(
   
'title' => 'Ricerca',
       
'page callback' => 'drupal_get_form',
       
'page arguments' => array('Agenda_form_ricerca'),
   
'access arguments' => array('ricerca Agenda'),
   
'type' => MENU_NORMAL_ITEM,
  );
 
$items['Agenda/lista'] = array(
   
'title' => 'Risultato ricerca',
   
'page callback' => 'Agenda_lista',
   
'access arguments' => array('ricerca Agenda'),
   
'type' => MENU_NORMAL_ITEM,
  );     
 
// Modifica (non visibile nei menu)
 
$items['Agenda/%Agenda/modifica'] = array(
   
'title' => t('Modifica dati'),
       
'page callback' => 'drupal_get_form',
       
'page arguments' => array('Agenda_form_inserisci_modifica'),
   
'access arguments' => array('amministra Agenda'),
   
'type' => MENU_CALLBACK,
  );     
 
// Cancella (non visibile nei menu)
 
$items['Agenda/%Agenda/cancella'] = array(
   
'title' => 'Cancella',
   
'page callback' => 'Agenda_cancella',
   
'access arguments' => array('amministra Agenda'),
   
'type' => MENU_CALLBACK,
  ); 
  return
$items;

/**
 * Help del modulo
 *
 */
function Agenda_aiuto() {
   
$output .= t('Agenda_AIUTO');
    return
$output;
}
/**
* Menu callback; Verifica gli url
*/
function bodules_Agenda_load($pid) {
  if (!
is_numeric($pid)) {
    return
FALSE;
  }
  return
TRUE;
}
/**
 * Funzione principale di cancellazione
 * Da quì vengono lanciati i form di cancellazione dati
 */
function Agenda_cancella() {
   
$output = drupal_get_form('Agenda_form_cancella');
    return
$output;
}
/**
 * Form di cancellazione
 *
 */
function Agenda_form_cancella() {
  return
confirm_form(
                         
$form,
                       
t('Confermi la cancellazione?'),
                       
'Agenda/ricerca',
                       
t('Questa azione è IRREVERSIBILE'),
                       
t('Elimina'),
                       
t('Annulla')
                        );
}
/**
 * Conferma Cancellazione
 *
 */
function Agenda_form_cancella_submit($form, &$form_state) {
   
db_query("DELETE
       FROM {Agenda}
       WHERE
             {Agenda}.aid = %d
        "
,
       
arg(1)
        );
   
drupal_set_message(t('I dati sono stati cancellati'),'error');       
$form_state['redirect'] = 'Agenda/lista';
}
/**
 * Prepara e restituisce la lista
 *
 */
function Agenda_lista() {
   
// Prepara i titoli della tabella
   
$header = array(
    
t('Nome'),
    
t('Indirizzo'),
    
t('Telefono'),
    
t('Cancella'),
    
t('Vedi'),
    );
    if (
$_GET['Peso'] != '') {
       
$Condizione .= ' AND {Agenda}.peso = \''.$_GET['Peso'].'\' ';
        }
    if (
$_GET['nome'] != '') {
     if (
$Condizione == '' ) $Condizione .= ' WHERE ';
      else
$Condizione .= ' AND ';
     
$Condizione .= ' {Agenda}.nome like \'%'.$_GET['nome'].'%\' ';
    }
    if (
$_GET['telefono'] != '') {
     if (
$Condizione == '' ) $Condizione .= ' WHERE ';
      else
$Condizione .= ' AND ';
     
$Condizione .= ' {Agenda}.telefono like \'%'.$_GET['telefono'].'%\' ';
    }
   
// Seleziona i dati da mostrare in lista
   
$sql = 'SELECT
               {Agenda}.aid ,
               {Agenda}.nome ,
               {Agenda}.via ,
               {Agenda}.telefono
       FROM {Agenda}
                        '
.$Condizione.
           
tablesort_sql($header);
   
// Imposta la query per il count delle righe
   
$sqlcount = "SELECT
                COUNT(*)
       FROM {Agenda}
                        "
.$Condizione;   
   
$result = pager_query($sql, 50, 0, $sqlcount);
   
// Prepara la lista da dinserire nella tabella
   
while ($dati = db_fetch_object($result)) {   
        
$rows[] = array(
           
'data' => array(
    
$dati->nome,
    
$dati->via,
    
$dati->telefono,
            array (
'data' => l(theme_image(drupal_get_path('module', 'Agenda').'/images/delete.png', '', t('Elimina')), 'Agenda/'.$dati->vid.'/cancella', array('html'=>'TRUE')), 'align' => 'center'),
            array (
'data' => l(theme_image(drupal_get_path('module', 'Agenda').'/images/view.png', '', t('Visualizza')), 'Agenda/'.$dati->vid.'/modifica', array('html'=>'TRUE')), 'align' => 'center'),
            ));
    }
   
// Temizzazione della tabella e titoli
   
$output .= theme('table', $header, $rows);
   
// Temizzazione della pagina
   
$output .= theme('pager', NULL, 50);
 
// Ritorna la tabella temizzata e paginata
 
return $output;
}
/**
 * Caratteristiche del form (campi del form).
 * Notare che la temizzazione dello stesso avviene tramite l funzione theme_....
 */
function Agenda_form_inserisci_modifica() {
   
// Se è impostato un id, seleziona i dati da modificare
   
if (is_numeric(arg(1))) {
     
$result = db_query('SELECT
               {Agenda}.aid ,
               {Agenda}.nome ,
               {Agenda}.via ,
               {Agenda}.telefono
       FROM {Agenda}
       WHERE
             {Agenda}.aid = %d
                                  '
,
                                 
arg(1)
                          );
     
$value = db_fetch_array($result);
  }
$form['aid'] = array(
  
'#type' => 'hidden',
  
'#title' => t(''),
  
'#default_value' => $value['aid'],
  
'#description' => t(''),
);
$form['nome'] = array(
  
'#type' => 'textfield',
  
'#title' => t('Nome'),
  
'#default_value' => $value['nome'],
  
'#description' => t('Nome e Cognome'),
  
'#maxlength' => '51',
  
'#size' => '51',
);
$form['via'] = array(
  
'#type' => 'textfield',
  
'#title' => t('Indirizzo'),
  
'#default_value' => $value['via'],
  
'#description' => t('Indirizzo completo di numero civico'),
  
'#maxlength' => '80',
  
'#size' => '80',
);
$form['telefono'] = array(
  
'#type' => 'textfield',
  
'#title' => t('Telefono'),
  
'#default_value' => $value['telefono'],
  
'#description' => t('Num.Telefonico'),
  
'#maxlength' => '51',
  
'#size' => '30',
);
    
$form['submit'] = array(
         
'#type' => 'submit',
         
'#value' => t('Conferma'),
    );
    return
$form;

/**
 * Temizzazione del form "Agenda_form"
 * Il form viene costruito su una tabella (orizzontale)
 */
function theme_Agenda_form_inserisci_modifica($form) {
 
/*******************************************************************************
      Modificando il codice sotto, è possibile mettere il form in orizzontale
      VEDI ESEMPIO:
            $rows[] = array(
                array('data' => drupal_render($form['title']), 'colspan' => 3),
                drupal_render($form['peso']),
            drupal_render($form['pager']),
             );
            $rows[] = array(
                drupal_render($form['durata']),
                drupal_render($form['datavali']),
                drupal_render($form['datafine']),
                drupal_render($form['npassagg']),
                drupal_render($form['tempotot'])
             );
            $rows[] = array(
                array('data' => drupal_render($form['submit']), 'colspan' => 5)
             );
  *******************************************************************************/
   
$output .= drupal_render($form);   
   
$output .= theme('table', array(), $rows);
    return
$output;
}
/**
 * Validazione dei dati di inserimento/modifica
 * (verifica date e verifica che ci sia almeno un campo selezionato)
 */
function Agenda_form_inserisci_modifica_validate($form, &$form_state) {
   
// Imposta l'array dei dati
   
$errors = array();
 
/*******************************************************************************
             MODIFICARE SOTTO PER FARE UNA VALIDAZIONE MIGLIORE
   *******************************************************************************/ 
  
if ($form_state['values']['nome'] == '') {
    
$errors[nome] = t('Inserire i dati (Nome)');
   }
   if (
$form_state['values']['telefono'] == '') {
    
$errors[telefono] = t('Inserire i dati (Telefono)');
   }    
   
// Imposta l'array degli errori trovati
 
foreach ($errors as $name => $message) {
     
form_set_error($name, $message);
    }
   
// Ritorna il numero degli errori trovati
   
return count($errors) == 0;
}
/**
 * Inserimento o modifica dei dati
 * (se è presente il campo id, sian di fronte ad una modifica)
 */
function Agenda_form_inserisci_modifica_submit($form, &$form_state) {
   
// Imposta i valori da modificare/inserire
  
$row->nome  = $form_state['values']['nome'];
  
$row->via  = $form_state['values']['via'];
  
$row->telefono  = $form_state['values']['telefono'];
   
// Modifica
   
if (arg(1) > 0) {
   
// Definisci e valorizza la chiave primaria
    
$PrimaryKey = 'aid';
  
$row->aid = arg(1);        
   
// Aggiorna la Agenda
   
drupal_write_record('Agenda', $row, $PrimaryKey); 
       
drupal_set_message(t('I dati son stati modificati'));
    }
   
// Caso di inserimento
   
else {
       
// INSERISCI using drupal_write_record():
   
drupal_write_record('Agenda', $row);
       
drupal_set_message(t('I dati son stati inseriti'));
    }
   
// Vai al form di modifica
$form_state['redirect'] = 'Agenda/'.arg(1).'/modifica'
}
/**
 * Caratteristiche del form di ricerca.
 * Notare che la temizzazione dello stesso avviene tramite l funzione theme_....
 */
function Agenda_form_ricerca() {
$form['nome'] = array(
  
'#type' => 'textfield',
  
'#title' => t('Nome'),
  
'#default_value' => $value['nome'],
  
'#description' => t('Nome e Cognome'),
  
'#maxlength' => '51',
  
'#size' => '51',
);
$form['telefono'] = array(
  
'#type' => 'textfield',
  
'#title' => t('Telefono'),
  
'#default_value' => $value['telefono'],
  
'#description' => t('Num.Telefonico'),
  
'#maxlength' => '51',
  
'#size' => '30',
);
    
$form['submit'] = array(
         
'#type' => 'submit',
         
'#value' => t('Conferma'),
    );
    return
$form;
}
/**
 * Temizzazione del form
 * Il form viene costruito su una tabella (orizzontale)
 */
function theme_Agenda_form_ricerca($form) {
 
/*******************************************************************************
      Modificando il codice sotto, è possibile mettere il form in orizzontale
      VEDI ESEMPIO:
            $rows[] = array(
                array('data' => drupal_render($form['title']), 'colspan' => 3),
                drupal_render($form['peso']),
            drupal_render($form['pager']),
             );
            $rows[] = array(
                drupal_render($form['durata']),
                drupal_render($form['datavali']),
                drupal_render($form['datafine']),
                drupal_render($form['npassagg']),
                drupal_render($form['tempotot'])
             );
            $rows[] = array(
                array('data' => drupal_render($form['submit']), 'colspan' => 5)
             );
  *******************************************************************************/
   
$output = theme('table', array(), $rows);
   
$output .= drupal_render($form);
    return
$output;
}
/**
 * Validazione dei dati di ricerca
 * (verifica date e verifica che ci sia almeno un campo selezionato)
 */
function Agenda_form_ricerca_validate($form, &$form_state) {
   
// Imposta l'array dei dati
   
$errors = array();
   
// Imposta l'array degli errori trovati
   
foreach ($errors as $name => $message) {
     
form_set_error($name, $message);
    }
   
// Ritorna il numero degli errori trovati
   
return count($errors) == 0;
}
/**
 * Imposta le variabili da passare all'url per la ricerca. Fatto ciò, passa l'esecuzione alla lista
 *
 */
function Agenda_form_ricerca_submit($form, &$form_state) {
   
// Costruisce url
   
$Variabili_url = '';
 
$Variabili_url .= 'nome='.$form_state['values']['nome'];
 
$Variabili_url .= '&telefono='.$form_state['values']['telefono'];       
   
// Vai alla lista
   
drupal_goto('Agenda/lista', $Variabili_url);
}
?>

Ciao
Gianni

Perfetto grazie Gianni :)
Guardando bene questo codice penso di capire le caratteristiche base di costruzione di un modulo.
Un utlima cosa mi dici come validare questo esempio??
Io l'ho salvato in un file "Agenda.module" e l'ho aggiunto alla cartella module di drupal ma non riesco ad aggiungerlo cioè non lo vedo nell'elenco Administer-->Site building--->modulese... come faccio ad abilitarlo???
Grazie ancora
Ciao

ti mancano i file info e install

Ciao
Marco
--
My blog
Working at @agavee

ok dove li trovo o come li creo?? hai il linka qualche guida in proposito??
Grazie
Diego

Semplicemente, prendi un modulo qualunque e guarda come sono fatti quei due file. Potrei postarteli, ma se procedi guardando, capisci ed impari.
Anche perchè quelle sono l'ABC per chi vuol iniziare a farsi dei moduli.
Comunque, su drupal.org, sotto la documentazione è spiegato tutto

Ciao
Gianni

ok :)
son riuscito a farlo partire ora mi metto a guardare bene il codice e a modificarlo per capire come creare il mio.
Ho un problema con l'Agenda, io ho aggiunto una persona dal nome "pres" e numtel "02" ma quando provo a ricercarlo trovo questo errore :

user warning: Table 'drupal.agenda' doesn't exist query: SELECT COUNT(*) FROM Agenda in C:\xampp\htdocs\drupal\modules\Agenda\Agenda.module on line 208.
user warning: Table 'drupal.agenda' doesn't exist query: SELECT Agenda.aid , Agenda.nome , Agenda.via , Agenda.telefono FROM Agenda LIMIT 0, 50 in C:\xampp\htdocs\drupal\modules\Agenda\Agenda.module on line 208.

Nel file Agenda.module ho questo alla riga 208 :
$result = pager_query($sql, 50, 0, $sqlcount);

ok :)
son riuscito a farlo partire ora mi metto a guardare bene il codice e a modificarlo per capire come creare il mio.
Ho un problema con l'Agenda, io ho aggiunto una persona dal nome "pres" e numtel "02" ma quando provo a ricercarlo trovo questo errore :

user warning: Table 'drupal.agenda' doesn't exist query: SELECT COUNT(*) FROM Agenda in C:\xampp\htdocs\drupal\modules\Agenda\Agenda.module on line 208.
user warning: Table 'drupal.agenda' doesn't exist query: SELECT Agenda.aid , Agenda.nome , Agenda.via , Agenda.telefono FROM Agenda LIMIT 0, 50 in C:\xampp\htdocs\drupal\modules\Agenda\Agenda.module on line 208.

Nel file Agenda.module ho questo alla riga 208 :
$result = pager_query($sql, 50, 0, $sqlcount);

nel file install devi andare ad inserire le istruzioni per la creazione della tabella usata come agenda, e ovviamente le istruzioni per la rimozione della tabella nel processo di disinstallazione. Per maggiori info ti rimando alla consultazione di qualche modulo già pronto o nella documentazione di drupal.org. Se hai intenzione di dedicarti allo sviluppo con drupal ti consiglio caldamente la lettura del libro che trovi in drupal.org

Ciao
Marco
--
My blog
Working at @agavee

Crea una tabella così fatta, all'interno del DB di drupal:

Nome tabella: Agenda
aid int 11
nome varchar(30)
via varchar(50)
telefono varchar (20)

Ciao
Gianni

Ho installato il tutto su drupal 6....pero' non riesco a fare l'insert...
mi dice inserimento effettuato ma nulla...la tabella ha questa struttura.

--
-- Struttura della tabella `agenda`
--
CREATE TABLE `agenda` (
  `aid` int(11) unsigned NOT NULL,
  `nome` varchar(30) NOT NULL default '',
  `via` varchar(50) NOT NULL default '',
  `telefono` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;