Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 43

Discussione: OOP e html

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    555

    OOP e html

    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

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    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.

  3. #3
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    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
    codice:
    <?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 CHIEDINOME.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>
          <form action="index.php"  method="post">
              Nome: <input type="text" name="nome">
              <input type="submit" value="Invia">
          </form>
      </body>
    </html>
    File SALUTA.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>

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Perdonami ma sono particolarmente impedito nell'uso del forum ed in particolare dei messaggi privati.

    Ti ho modificato un po' tanto il 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.

    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]";
        }
    
    }
    ?>
    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.

    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

  5. #5
    Originariamente inviato da Grino
    Il model a sua volta in base a come vanno le cose invoca una notifica del controller
    questa proprio non l'ho mai sentita... mai visto un model che notifica al controller qualcosa.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Originariamente inviato da Santino83_02
    questa proprio non l'ho mai sentita... mai visto un model che notifica al controller qualcosa.
    Beh, tramite return

  7. #7
    Originariamente inviato da k.b
    Beh, tramite return
    quello non è notificare 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

  8. #8
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Originariamente inviato da Santino83_02
    quello non è notificare 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
    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 confermato
    Lo schema è questo:

    Spero che si veda bene

    Aggiorna
    utente ------>Controller ----------
    ^S|^|
    |e|||
    |l|||
    |e|||
    |z||NoificaV
    |i|------------Model
    |o||
    |n||
    |a||
    |VLeggi|
    -------------Viewer<-------------

  9. #9
    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.

  10. #10
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    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.
    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.

    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.