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
__________________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. $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. $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
__________________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;
Iscritto il: 13 Giu 08