Realizzazione Modulo

La discussione sul CMS Made Simple in italiano.

Moderator: magallo

Post Reply
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Realizzazione Modulo

Post by nervino »

Ciao a tutti, rieccomi.
(Purtoppo per voi sono fermamente deciso ad imparare questo CMS  :))

Scusate se stavolta mi permetto un post così lungo, ma mi sembrava l'unico modo per spiegare i problemi che incontro.

Sto cercando di imparare a realizzare un modulo.
Ho copiato Skeleton, ne sto modificando i file, ed ho aggiunto delle tabelle al database.

L'idea è quella di permettere ad un visitatore del sito di scegliere il modello e la versione della propria auto e visualizzare quindi l'elenco dei controlli previsti dalla casa costruttrice.

In pratica ho creato 3 tabelle nel DB:

1) cms_module_tagliandi

2) cms_module_tagliandi_modelli

3) cms_module_tagliandi_versioni

(in realtà le tabelle sono 6 perché di ognuna ho creato anche la corrispettiva con suffisso "_seq". Non so ancora a che serve ma ho seguito Skeleton).


DUMP delle tabelle:

Code: Select all

-- Struttura della tabella `cms_module_tagliandi`
-- 

CREATE TABLE `cms_module_tagliandi` (
  `id_tagliando` int(11) NOT NULL auto_increment,
  `id_versione` int(11) default '0',
  `KM` char(50) default NULL,
  `olio_motore` tinyint(1) default NULL,
  `filtro_olio` tinyint(1) default NULL,
  `filtro_aria` tinyint(1) default NULL,
  `filtro_abitacolo` tinyint(1) default NULL,
  `filtro_carburante` tinyint(1) default NULL,
  `sost_olio_freni` tinyint(1) default NULL,
  `candela_accensione` tinyint(1) default NULL,
  `guarnizione_tenuta` tinyint(1) default NULL,
  `sost_olio_cambio` tinyint(1) default NULL,
  `paraflu` tinyint(1) default NULL,
  `cinghia_trasmissione` tinyint(1) default NULL,
  `candela_preriscaldamento` tinyint(1) default NULL,
  PRIMARY KEY  (`id_tagliando`),
  KEY `id_tagliando` (`id_tagliando`),
  KEY `id_versione` (`id_versione`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=207 ;




-- Struttura della tabella `cms_module_tagliandi_modelli`
-- 

CREATE TABLE `cms_module_tagliandi_modelli` (
  `id_modello` int(11) NOT NULL auto_increment,
  `nome_modello` char(50) default NULL,
  PRIMARY KEY  (`id_modello`),
  KEY `id_modello` (`id_modello`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;



-- Struttura della tabella `cms_module_tagliandi_versioni`
-- 

CREATE TABLE `cms_module_tagliandi_versioni` (
  `id_versione` int(11) NOT NULL auto_increment,
  `id_modello` int(11) default '0',
  `cilindrata` char(50) default NULL,
  `carburante` char(50) default NULL,
  PRIMARY KEY  (`id_versione`),
  KEY `id_modello` (`id_modello`),
  KEY `id_versione` (`id_versione`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=53 ;


Nella pagina action.default.php sono riuscito ad effettuare una query che valorizza degli array. Creo anche un FORM con pulsante SUBMIT che "dovrebbe" passare la scelta del modello/versione auto ad una pagina che effettua una SELECT sulla tabella dei Tagliandi.


CODICE pagina action.default.php:

Code: Select all

<?php 
if (!isset($gCms)) exit;

// get our records from the database
$db = &$gCms->GetDb();

if (isset($params['id_versione']))
   {
   		if ($params['id_versione']=="")
   		{
   		$params['id_versione']=1;
   		}
	  
	  $query = 'SELECT *
				FROM '.cms_db_prefix().'module_tagliandi
				WHERE id_versione = ?';
	  
	  
   $result = $db->Execute($query,array($params['id_versione']));

 
	  while ($result !== false && $row=$result->FetchRow())
  		 {
   // create a new object for every record that we retrieve
  $rec = new stdClass();
   
	$rec->KM = $row['KM'];
	$rec->olio_motore = $row['olio_motore'];
	$rec->filtro_olio = $row['filtro_olio'];
	$rec->filtro_aria = $row['filtro_aria'];
	$rec->filtro_abitacolo = $row['filtro_abitacolo'];
	$rec->filtro_carburante = $row['filtro_carburante'];
	$rec->sost_olio_freni = $row['sost_olio_freni'];
	$rec->candela_accensione = $row['candela_accensione'];
	$rec->guarnizione_tenuta = $row['guarnizione_tenuta'];
	$rec->sost_olio_cambio = $row['sost_olio_cambio'];
	$rec->paraflu = $row['paraflu'];
	$rec->cinghia_trasmissione = $row['cinghia_trasmissione'];
	$rec->candela_preriscaldamento = $row['candela_preriscaldamento'];
   array_push($records,$rec);
  		 }
   
	   $sid = $row['id_versione']; // stupid -- we're passing the param, and then using the database version.
   }
else
   {
$list = array();

$query = "SELECT ".cms_db_prefix()."module_tagliandi_modelli.id_modello, ".cms_db_prefix()."module_tagliandi_modelli.nome_modello, cilindrata, carburante, ".cms_db_prefix()."module_tagliandi_versioni.id_versione
FROM ".cms_db_prefix()."module_tagliandi_modelli
INNER JOIN ".cms_db_prefix()."module_tagliandi_versioni ON ".cms_db_prefix()."module_tagliandi_modelli.id_modello = ".cms_db_prefix()."module_tagliandi_versioni.id_modello
ORDER BY ".cms_db_prefix()."module_tagliandi_modelli.nome_modello, ".cms_db_prefix()."module_tagliandi_versioni.carburante, ".cms_db_prefix()."module_tagliandi_versioni.cilindrata";
$result = $db->Execute($query);

$records = array();
while ($result !== false && $row=$result->FetchRow())
   {
   // create a new object for every record that we retrieve
   $rec = new stdClass();
   $rec->id = $row['id_versione'];
   $rec->modello = $row['nome_modello'];
   $rec->cilindrata = $row['cilindrata'];
   $rec->carburante = $row['carburante'];
   
   // create attributes for rendering "view" links for the object.
   // $id and $returnid are predefined for us by the module API
   $rec->view = $this->CreateFrontendLink($id, $returnid, 'default', $this->Lang('link_view'),
      array('id_modello'=>$rec->id));
   $rec->edit = $this->CreateFrontendLink($id, $returnid, 'add_edit', $this->Lang('edit'),
      array('id_modello'=>$rec->id));
   array_push($records,$rec);
   }
$sid = $row['id_versione']; // stupid -- we're passing the param, and then using the database version.
   }


$smarty->assign('start_form', $this->CreateFormStart($id, 'form_modelli', $returnid));
// Expose the list to smarty. Use "by_ref" to save memory.
$this->smarty->assign_by_ref('records',$records);

// and a count of records
$this->smarty->assign('title_num_records',$this->Lang('title_num_records',array(count($records))));

// pass a hidden key value along with the submit button
$smarty->assign('submit', $this->CreateInputHidden($id,'id_versione',$sid).$this->CreateInputSubmit($id, 'submit', $this->Lang('submit')));


$smarty->assign('end_form', $this->CreateFormEnd());

// Display the populated template
echo $this->ProcessTemplate('tagliandi_list.tpl');
?>


Nel template "tagliandi_list.tpl" popolo un dropdown menu con i valori generati in action.default.php.

TEMPLATE:

Code: Select all

{if isset($module_message)}<h2>{$module_message|escape}</h2>{/if}
<h3>{$title_num_records}</h3>
{$start_form} {**** scrive l'inizio del FORM, assegnato a Smarty in action.default.php, riga 54 ****} 

{assign var="my_modello" value=""}

<select name="modelli" id="modelli">
{foreach from=$records item=entry}


<h1>{$entry->KM}</h1> {* --- TEST  --- *}


{if $entry->modello neq $my_modello}
<option value="" style=" background-color:#FFFFCC; border:1px solid gray; text-align:center;">{$entry->modello}</option>
{/if}
<option value="{$entry->id}" {if $entry->carburante eq "diesel"} style="color:#666;"{/if}>{$entry->cilindrata} - 

{$entry->carburante}
   </option>
{assign var="my_modello" value=$entry->modello}
{/foreach}   
  </select>
  {$submit}
 {$end_form}
 ({$entry->view}|{$entry->edit})
{ get_template_vars }


RISULTATO:

Quando nel front-end scelgo una modello/versione di auto dal menu a discesa e clicco su INVIA, ottengo una pagina vuota con un errore:

Code: Select all

Warning: Parameter submit is not known... dropped in /var/www/siti/test/lib/misc.functions.php on line 1347

Quello che non riesco a capire, è (tra le molte cose..):

1) come vengono passate le variabili tra le "pagine"; ovvero come faccio a passare l'id_versione, che mi serve nella query di selezione dei Tagliandi.

2) cosa sono e come vengono valorizzate le variabili: $id, $sid, $returnid

3) action.default.php è la pagina in cui ho messo il codice, seguendo Skeleton. Ma perché viene utilizzata questa? Le altre (action.add_edit.php, action.defaultadmin.php ecc.) hanno tutte dei nomi convenzionali che il CMS già conosce?


Grazie e Buona domenica
Last edited by nervino on Sun Apr 05, 2009 11:40 am, edited 1 time in total.
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

Credo di aver capito che, quando si crea il Form con Smarty

Code: Select all

$smarty->assign('start_form', $this->CreateFormStart($id, 'show_tagliandi', $returnid));
il secondo parametro della funzione CreateFormStart() indica il nome della pagina (dopo "action.") alla quale vengono
inviati i dati (in questo esempio: action.show_tagliandi.php).

Ho quindi creato la pagina action.show_tagliandi.php ma non riesco a passarle l'id_versione della OPTION selezionata nel Menu della pagina precedente, che sto provando a passare così da action.default.php:

Code: Select all

$smarty->assign('submit', $this->CreateInputHidden($id,'id_versione',$sid).$this->CreateInputSubmit($id, 'submit', 

$this->Lang('submit')));
ricevendo così in action.show_tagliandi.php:

Code: Select all

if ($params['id_versione']=="")
   		{
   		$params['id_versione']=0;
   		}
	  $query = 'SELECT *
				FROM '.cms_db_prefix().'module_tagliandi
				WHERE id_versione = ?';
Cosa sbaglio?
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote: Credo di aver capito che, quando si crea il Form con Smarty

Code: Select all

$smarty->assign('start_form', $this->CreateFormStart($id, 'show_tagliandi', $returnid));
second param è l'"action" e CMSMS cerca se c'è un file action.$action.php e se c'è lo esegue

nervino wrote: Ho quindi creato la pagina action.show_tagliandi.php ma non riesco a passarle l'id_versione della OPTION selezionata nel Menu della pagina precedente, che sto provando a passare così da action.default.php:

Code: Select all

$smarty->assign('submit', $this->CreateInputHidden($id,'id_versione',$sid).$this->CreateInputSubmit($id, 'submit', 
$this->Lang('submit')));
Scusa ma se fuori strada (o io non ho capito)
Se vuoi una "id_versione" che è il valore della option della select modelli dovrai cercare il valore di $params['modelli']
Se metti id_versione in una hidden con $params['id_versione'] avrai il valore di $sid (che non ho capito che cosa è)

$id e $returnid sono variabili RISERVATE di CMSMS da NON usare

Alby
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

alby wrote: Scusa ma se fuori strada (o io non ho capito)
Se vuoi una "id_versione" che è il valore della option della select modelli dovrai cercare il valore di $params['modelli']
Se metti id_versione in una hidden con $params['id_versione'] avrai il valore di $sid (che non ho capito che cosa è)
Esatto. Vorrei una "id_versione" da utilizzare nel WHERE di una SELECT.

Ho fatto delle prove cercando di seguire i tuoi suggerimenti ma non ottengo risultati. È ovvio che sono io che non ho capito  ;D

Allora, nella pagina action.default.php ho provato ad inserire:

Code: Select all

//$smarty->assign('submit', $this->CreateInputHidden($id,'id_versione',$sid).$this->CreateInputSubmit($id, 'submit', $this->Lang('submit')));
In action.show_tagliandi.php ho:

Code: Select all

if ($params['id_versione']=="")
   		{
   		$params['id_versione']=0;
   		}
	  $query = 'SELECT *
				FROM '.cms_db_prefix().'module_tagliandi
				WHERE id_versione = ?';
	  
	  
   $result = $db->Execute($query,array($params['id_versione']));
$records = array();
(Ho provato anche a ricevere $sid):

Code: Select all

if ($sid=="")
   		{
   		$params['id_versione']=0;
   		}
Il Menu Select nel template tagliandi_list.tpl:

Code: Select all

<select name="id_versione" id="id_versione">
In questo modo mi sembra che non ricevo l'id_versione.
Non ho capito nenache cosa si aspetta il punto interrogativo nella query parametrizzata: un nome uguale all'id del WHERE, "id_versione"..?


Ho provato anche a non mettere il campo hidden in action.default.php, così:

Code: Select all

$smarty->assign('submit', $this->CreateInputSubmit($id, 'submit', $this->Lang('submit')));
ma ricevo un errore (Notice: Undefined index: id_versione).
Credevo che inviando il form automaticamente Smarty passasse l'id_versione scelto nella OPTION come $params['id_versione'], ma evidentemente non è così..
Last edited by nervino on Mon Apr 06, 2009 2:33 pm, edited 1 time in total.
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote: Credevo che inviando il form automaticamente Smarty passasse l'id_versione scelto nella OPTION come $params['id_versione'], ma evidentemente non è così..
posso dire che non ho capito niente  ???
Allora ricapitoliano: vuoi la scelta selezionata (OPTION) nella select (tag e no query) con name="id_versione"?
Se sì:
1. NESSUNA HIDDEN con id_versione (se no sovrascrivi sempre quello che scegli nella select)
2. Devi costruire la select tag con le API di CMSMS se no NON hai quel valore (se guardi l'html avrai una cosa del tipo m1_xxxx e non xxxx) in caso contrario avrai il risultato con $POST e non con $params (che toglie automaticamente m1_)
3. il ? nella query verrà sostituito (e ripulito da codice pericoloso) con quello che metti nell'array: $db->Execute($query,array(YYY))

Alby
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

alby wrote: Allora ricapitoliano: vuoi la scelta selezionata (OPTION) nella select (tag e no query) con name="id_versione"?
Sissignore
alby wrote: 1. NESSUNA HIDDEN con id_versione (se no sovrascrivi sempre quello che scegli nella select)
Ok, tolta.
alby wrote: 2. Devi costruire la select tag con le API di CMSMS se no NON hai quel valore (se guardi l'html avrai una cosa del tipo m1_xxxx e non xxxx) in caso contrario avrai il risultato con $POST e non con $params (che toglie automaticamente m1_)
Olè! Ho usato $_POST e catturo la variabile!

All'inizio avevo provato a costruire la Select (tag) con la funzione CreateInputDropdown() ma non ero riuscito a fargli caricare tutti i valori, quindi avevo ripiegato sul template.
Purtroppo non capisco come usare le info in http://www.cmsmadesimple.org/apidoc/..

Grazie 1000!
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote: All'inizio avevo provato a costruire la Select (tag) con la funzione CreateInputDropdown() ma non ero riuscito a fargli caricare tutti i valori, quindi avevo ripiegato sul template.
$arr_options = array(
'valore1'=>'opzione1',
'valore2'=>'opzione2',
'valore3'=>'opzione3',
);

$smarty->assign('id_versione', $this->CreateInputDropdown($id, 'id_versione', $arr_options, -1));

Alby
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

alby wrote: $arr_options = array(
'valore1'=>'opzione1',
'valore2'=>'opzione2',
'valore3'=>'opzione3',
);

$smarty->assign('id_versione', $this->CreateInputDropdown($id, 'id_versione', $arr_options, -1));

Alby
Grazie Alby.
Ho provato il tuo codice e, ovviamente, funziona.
Poi ho provato a riempire l'array con i dati del mio recordset da DB, ma non va:

Code: Select all

$result = $db->Execute($query);
$records = array();
while ($result !== false && $row=$result->FetchRow())
   {
   // create a new object for every record that we retrieve
   $rec = new stdClass();
   $rec->id_versione = $row['id_versione'];
   $rec->modello = $row['nome_modello'];
   $rec->cilindrata = $row['cilindrata'];
   $rec->carburante = $row['carburante'];
   
   $arr_options = array_push($records,$rec);
   }
$smarty->assign('id_versione', $this->CreateInputDropdown($id, 'id_versione', $arr_options, -1));
Poi nel template richiamo il dropdown in questo modo: {$id_versione} È corretto?
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote:

Code: Select all

   $rec = new stdClass();
Non mi pare che sia proprio uguale  ::)

nervino wrote: Poi nel template richiamo il dropdown in questo modo: {$id_versione} È corretto?
Certo, è la tua variabile smarty

Alby
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

alby wrote:
nervino wrote:

Code: Select all

   $rec = new stdClass();
Non mi pare che sia proprio uguale  ::)
Bhè certo...

Allora non posso usare un oggetto..

Ok, ho cercato di fare un array del tipo chiave=>valore, solo che non riesco proprio a caricare i dati dal recordset.
Ho pure studiato quello che fa la funzione CreateInputDropdown ed è abbastanza chiaro. Il problema per me rimane la valorizzazione ciclica dell'array.

Ho fatto così (ed altre innumerevoli prove):

Code: Select all

while ($result !== false && $row=$result->FetchRow())
   {
   $arr_options = array( $row['nome_modello']. ' - ' .$row['cilindrata'].' - ' .$row['carburante']=>$row['id_versione'] );
   //array_push($arr_options,$campi);
   }
In questo modo memorizza ovviamente solo l'ultimo record; ma non capisco come fare. Ho provato con array_push() ma non ci riesco proprio.. :-\
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote: In questo modo memorizza ovviamente solo l'ultimo record; ma non capisco come fare. Ho provato con array_push() ma non ci riesco proprio.. :-\
humm... forse è meglio che studi prima un pò di array loop  :o

prova con:
while ($result !== false && $row=$result->FetchRow())
  {
  $arr_options[$row['id_versione']] = $row['nome_modello']. ' - ' .$row['cilindrata'].' - ' .$row['carburante'];
  }
Alby
nervino
Power Poster
Power Poster
Posts: 448
Joined: Sun Dec 28, 2008 12:15 pm

Re: Realizzazione Modulo

Post by nervino »

Hai ragione; ho sempre usato poco gli array e non mi ci ritrovo molto. Farò un po' di esercizi.
Ho modificato il tuo codice, così nel value dell'OPTION ho l'id_versione:

Code: Select all

$arr_options[$row['nome_modello']. ' - ' .$row['cilindrata'].' - ' .$row['carburante']] = $row['id_versione'];
Grazie di tutto. Sei stato molto gentile nel darmi anche suggerimenti che esulano dal cmsms.
alby

Re: Realizzazione Modulo

Post by alby »

nervino wrote:

Code: Select all

$arr_options[$row['nome_modello']. ' - ' .$row['cilindrata'].' - ' .$row['carburante']] = $row['id_versione'];
Hai ragione, non avevo controllato che è $arr[valore] = chiave

Alby
Post Reply

Return to “Italian - Italiano”