Qualcuno che mi faccia un esempio breve su come separare html e php?
Voi nei metodi utilizzate anche print per stampare a video, oppure la stampa a video la lasciate solo nella pagina e non nella classe?
grazie
ciao
Qualcuno che mi faccia un esempio breve su come separare html e php?
Voi nei metodi utilizzate anche print per stampare a video, oppure la stampa a video la lasciate solo nella pagina e non nella classe?
grazie
ciao
Il modello per la separazione di codice html e php che io utilizzo è MCV.
Model
Controller
Viewer
Applicato anche nella programmazione classica (diciamo).
Per model si intendono tutte quelle attività che coinvolgono il DB, per controller tutte quelle attività di controllo e coordinamento degli altri due elementi (logiche di business), nel viewer si ha la creazione della pagina
Applicare il modello significa suddividere il tuo codice fra i tre elementi per cui, in un ambiente asincrono come il web, le richieste dell'utente vengono intercettate da una funzione del Controller che esegue delle verifiche. In seguito il controller può invocare un metodo del model per richiedere un aggiornamento del DB. Il model a sua volta in base a come vanno le cose invoca una notifica del controller, che fatti i suoi controlli decide come procedere e tipicamente seleziona una view ovvero la pagina da visualizzare. La view a sua volta può invocare un accesso ai dati da parte del model in modo da caricare i dati a lei necessari e quindi procede alla visualizzazione.
Se fai attenzione potrai notare all'interno della tua pagina che questi tre elementi sono presenti, magari si tratta di organizzare un po' il codice. Se poi vuoi li puoi separare in più file, se ti vuoi sbizzarrire li puoi inncapsulare in clasi, se vuoi esagerare ti costruisci un framework completo.
Ti posto un esempio tra qualche minuto con gli elementi in una pagina sola. Comunque MCV non è lunico modello esistente, ce ne sono altri, ma io uso questo.
Il codice che avevo promesso... sono tre file, un index.php, un chiedinome.html e un saluta.html. Il famoso "Ciao tuo nome" riproposto in uno scadente modello mcv. Dovrebbe comunque rendere un po' l'idea di cosa si parla. Come puoi vedere il codice PHP è tutto in un file ed in più distingui l'accesso ai dati, dalla visualizzazione dalla logica del programma. I file di presentazione (HTML) sono totalmente separati. Utilizzo dei segnaposti per le sostituzioni. Questo comunque è solo un esempio didattico, mai lo userei nella realtà.
Per brevità non ho commentato, ma se occorre chiedi e ti sarà dato!![]()
Ciao!
File INDEX.PHP
File CHIEDINOME.HTMLcodice:<?php session_start(); class controller{ private $model; private $viewer; public function Inizializza(){ $this->model=new model(); $this->viewer=new viewer(); if(isset ($_POST['nome'])) $this->model->Aggiorna($this,"SalvaNome"); else $this->viewer->Seleziona ($this->model,"ChiediNome"); } public function Notifica($value){ switch ($value) { case "SalvatoNome": $this->viewer->Seleziona($this->model,"Saluta"); break; default: break; } } } class model{ public function Aggiorna($controller,$cosa){ switch ($cosa) { case "SalvaNome": $_SESSION['nome']=htmlspecialchars(trim($_POST['nome'])); $controller->Notifica("SalvatoNome"); break; default: die('Operazione non gestita'); break; } } public function Leggi($cosa){ return $_SESSION[$cosa]; } } class viewer{ private $model; public function Seleziona($model,$cosa){ $this->model=$model; $this->$cosa(); } private function Saluta(){ $str=file_get_contents("saluta.html"); echo str_replace("$1$", $this->model->Leggi('nome'), $str); } private function ChiediNome(){ echo file_get_contents("chiedinome.html"); } } $controller=new controller(); $controller->Inizializza(); ?>
File SALUTA.HTMLcodice:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form action="index.php" method="post"> Nome: <input type="text" name="nome"> <input type="submit" value="Invia"> </form> </body> </html>
codice:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> Ciao $1$ </body> </html>
Perdonami ma sono particolarmente impedito nell'uso del forum ed in particolare dei messaggi privati.
Ti ho modificato un po' tantoil codice per capire un po' anche io, renderlo più leggibile ecc.
Ho cercato dove possibile di conservare il nome della funzione ed ho lasciato i commenti per permetterti di orientarti.
Quello che hai è una classe di supporto per interfacciarti a mysql, una piccola classe che aspira ad essere il model che è visualizza_menu, ed infine una specie di viewer che è la classe stampa_calendario.codice:<?php class db_con { private $connessione; private $sql; private $risultatosql; private $numerorighe; /* connetti */ public function __construct($host="localhost", $user="root", $password="root", $dbnome="giuseppe") { if (($this->connessione = mysql_connect($host, $user, $password)) === false) die("Verifica dati di connessione"); $this->SelezionaDB($dbnome); } public function SelezionaDB($nomeDB) { if (mysql_select_db($dbnome, $this->connessione)===false) die("Impossibile selezionare $nomeDB"); } /* chiusura connetti /*esecuzione query */ public function eseguisql($sql) { $this->sql = $sql; if (($risultatosql = mysql_query($this->sql, $this->connessione)) !== false) { if (strpos(strtolower($sql), "select") === 0) $this->numerorighe = mysql_num_rows($result); else $this->numerorighe = mysql_affected_rows($this->connessione); return $this->risultatosql; }else die('Errore nella query: ' . mysql_error($this->connessione)); } /* chiusura metodo query */ /* esecuzione query per numero righe */ public function numerorighesql($sql) { return $this->numerorighe; } /* chiusura metodo numerorighe */ public static function datait($param){ $datait = substr($param,-2,2); $datait .= substr($param,-3,1); $datait .= substr($param,-5,2); $datait .= substr($param,-6,1); $datait .= substr($param,0,4); return $datait ; } /* Disconnessione */ public function __destruct() { @mysql_close($this->connessione); } /* chiusura metodo disconnessione */ public function dammiDati(){ $dati=array(); while ($dato = mysql_fetch_array($this->risultatosql))$dati[]=$dato; return $dati; } } /* chiusura classe */ /*classe che serve per menu a destra nelle classi estese passo tre variabili sui link inserisci e modifica che servono per le pagine modifica e inserisci, così utilizzo solo una pagina e in base alle variabili apro la classe che mi serve, vedere variabili passate nei link modifica */ //require_once("class_db.php") ; sta sopra class visualizza_menu{ protected $dati; function __construct($sql){ $db = new db_con(); $res = $db->eseguisql($sql) ; $dati= $db->dammi_dati(); } } /*INIZIO CLASSE PER STAMPA MENU CALENDARIO A DESTRA NEI LINK MODIFICA E NUOVO VERIFICO SESSIONI PER STABILIRE SE FARLI VEDERE O NO LE SESSIONI LE FACCIO PARTIRE NELLE PAGINE INCLUDE_MENU*/ class stampa_calendario extends visualizza_menu { function get_lista() { print "<ul>"; /* punto su inserisci passando le tre variabili che serviranno per aprire la classe giusta e il metodo e la tabella variabile tab serve anche per aprire il menu a destra in maniera dinamica nelle pagine incluse deve corrispondere una pagina uguale in questo caso ci deve essere calendario.php */ foreach ($this->dati as $r) { if ($_SESSION['w'] == 1) print "[*]<a href=\"../modifica/inserisci.php?tab=calendario&cl=inserisci_calendario&metodo=formins_calendario\">Nuovo</a>"; $datait = db_con::datait($r['data_calendario']); print "[*]<a href=\"../concerti/dettaglio_calendario.php?id={$r['id_calendario']}\">$datait {$r['luogo_calendario']}</a>"; if ($_SESSION['w'] == 1) { print "<a href=\"../modifica/index.php?id={$r['id_calendario']}&tab=calendario&cl=modifica_calendario&metodo=sel_calendario\">Modifica</a>"; } print ""; } print "[/list]"; } } ?>
In realtà qui non c'è MCV ne separazione tra codice PHP e HTML, ma spero che il codice modificato ti possa essere di aiuto.
Dimenticavo... non ho avuto modo di provarlo ma dovrebbe essere corretto!
Ciao
questa proprio non l'ho mai sentita... mai visto un model che notifica al controller qualcosa.Originariamente inviato da Grino
Il model a sua volta in base a come vanno le cose invoca una notifica del controller
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
Beh, tramite returnOriginariamente inviato da Santino83_02
questa proprio non l'ho mai sentita... mai visto un model che notifica al controller qualcosa.![]()
quello non è notificareOriginariamente inviato da k.b
Beh, tramite return![]()
e non tutti i pattern ritornano valori quando si eseguono operazioni con i model
![]()
vabbeh cmq... era solo per dire che detta risulta sbagliata, poi pure io so che si riferiva ai return![]()
![]()
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
Non return niente, MCV è un modello, la realizzazzione del modello è a discrezione di chi programma. Quando realizzi un framwork decidi come implementare il modello e diventano specifiche dello stesso. Ce la notifica sia un return o un metodo del controller invocato dal model (secondo me più corretto) il modello resta confermatoOriginariamente inviato da Santino83_02
quello non è notificaree non tutti i pattern ritornano valori quando si eseguono operazioni con i model
![]()
vabbeh cmq... era solo per dire che detta risulta sbagliata, poi pure io so che si riferiva ai return![]()
![]()
Lo schema è questo:
Spero che si veda bene
Aggiorna
utente ------>Controller ----------
^S|^|
|e|||
|l|||
|e|||
|z||NoificaV
|i|------------Model
|o||
|n||
|a||
|VLeggi|
-------------Viewer<-------------
Ma perche' un model dovrebbe chiamare un metodo di un controller? Anzi, perche' mai un model dovrebbe istanziare un controller? Non mi viene in mente neanche un esempio in cui una cosa del genere avrebbe senso.
Il model non istanzia un controller, ma nell'esempio, che è implemetazione di MCV, lo richiede come parametro. Il controller da parte sua, essendo titolare delle logiche di funzionamento è l'unico che può e deve intraprendere una scelta qualora qualcosa non vada a buon fine o anche se le cose vanno bene o anche per casi imprevisti. Non può essere il model a sparar fuori output. Lui deve solo accedere al DB e ralzionarsi con questi. Quindi riferire al controllore che decide.Originariamente inviato da k.b
Ma perche' un model dovrebbe chiamare un metodo di un controller? Anzi, perche' mai un model dovrebbe istanziare un controller? Non mi viene in mente neanche un esempio in cui una cosa del genere avrebbe senso.
Lo schem non deve cambiare.
Il model si occupa dei dati
Il controller delle logiche di funzionamento
Il viewer di visualizzare le pagine
ed è proprio quello che succede nell'esempio (terzo post).
in più il model prescinde dal controller che lo ha invocato, è per questo che deve notificare e non a caso, ma al controller chiamante.