Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    Linee guida manipolazione entita

    Ciao a tutti,

    Volevo porvi una domanda su come voi andate a manipolare le entità e come fate a farle persistere nel db....

    (Premessa)
    Allora io attualmente lavoro proceduralmente.
    Ho iniziato a costruirmi le miei classi per una prossima migrazione.

    (Attuale situazione)
    Facendo un esempio pratico (di cosa intendo per manupolazione dell'entità ) è :
    Filtro (Per avere una visualizzazione delle entità)
    Visualizzazione multiriga (Tabella che mostra le entità in base al filtro)..
    Form di Inserimento/Modifica dell'entità.

    Io purtroppo non ho mai seguito uno standard per la manipolazione delle mie entità dato che ogni volta mi veniva in mente un modo diverso (sopratutto da quando ho integrato ajax... mi sono fregato da solo)...

    Comunque adesso la stragrande maggioranza delle cose vengono gestite in questo modo :

    Pagina1.php
    Integra il filtro, tramite un submit asincrono chiamo la pagina CB_Pagina1.php, passandogli un parametro "funz".
    Questo parametro funz può essere tipo "GetMultipleEntity","GetSingleEntity", "write", "" ecc ecc.

    La pagina CB_Pagina1.php contiene uno switch sul parametro "funz" che richiama l'opportuna
    funzione, esegue tutte le sue operazioni e poi fa un return tipo
    OK||nomefunzione||valori di ritorno
    KO||nomefunzione||valori di ritorno

    nella Pagina1.php, dove gestisco il ritorno della chiamata ajax, splitto la stringa e vedo il relativo risultato, OK KO..

    Se KO solitamente emetto un messaggio o tramite un dialog oppure valorizzo html di un div.
    In caso contrario gestisco il mio valore di ritorno in base alla risposta attesa..

    Per fare degli esempi...
    Solitamente la funzione GetMultipleEntity restituisce una tabella con i valori filtrati.
    Questa integra degli href che richiamano opportune funzioni Es "GetSingleEntity".
    In questo esempio agisco molte volte in modo diverso a seconda della complessità della situazione.
    A volte rimando a una nuova pagina dove mostro la mia form e tutti i miei dati.
    A volte ottengo un valore di ritorno di tipo json e mi valorizzo una form (solitamente contenuta in un div invisibile che mostro)..
    Altre volte, data la complessità della form, restituisco proprio la form stessa, la inserisco in un div, la mostro, bindo la form con la chiamata asincrona... e tutti diventa macchino complesso, disordinato e... non ce la faccio più

    Pensando a come organizzare la situazione con le classi la cosa si complica ancora di più..

    Voi come agite?
    Potete indicarmi, o suggerirmi, dispense o consigli su un approccio (Più standard) e meno complesso?

    Se siete arrivati fino qui a leggere significa che già avete avuto moooolta pazienza e già vi ringrazio..
    Se poi mi date anche qualche consiglio siete dei grandi
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    CIAO ti porto l'esempio della mia classe per le entità.. me la sono scritta per me quindi funziona con la mia logica a a grandi linee i concetti base ci sono..

    interfaccia
    Codice PHP:
    interface entityInterface {
        public function 
    insert();
        public function 
    update();
        public function 
    remove();
    }

    interface 
    encoderInterface {
        public function 
    encode();

    classe
    Codice PHP:
    abstract class entity implements entityInterface {

        protected 
    $pdo;
        protected 
    $table;
        protected 
    $fields = array();
        protected 
    $encoder NULL;
        protected 
    $options '';
        protected 
    $id NULL;
        protected 
    $msg;

        public function 
    __constructPDO $pdo ) {
            
    $this->pdo $pdo;
        }

        public function 
    setEncoderencoderInterface $encoder ) {
            
    $this->encoder $encoder;
        }

        public function 
    getEncoder() {
            return 
    $this->encoder;
        }

        public function 
    __set$name$value ) {
            if ( !
    in_array$name$this->fields ) ) {
                throw new 
    entityException'The field [' $name '] is not allowed "set" for this entity.' );
            }
            
    $mutator 'set' ucfirst$name );
            if ( 
    method_exists$this$mutator ) && is_callable( array( $this$mutator ) ) ) {
                
    $this->$mutator$value );
                } else {
                
    $this->$name $value;
            }
        }

        public function 
    __get$name ) {
            if ( !
    in_array$name$this->fields ) ) {
                throw new 
    entityException'The field [ ' $name ' ] is not allowed "get" for this entity.' );
            }
            
    $accessor 'get' ucfirst$name );
            if ( 
    method_exists$this$accessor ) && is_callable( array( $this$accessor ) ) ) {
                return 
    $this->$accessor();
                } else {
                if ( 
    $this->id ) {
                    
    $selectQuery "SELECT $name FROM $this->table WHERE id = :id";
                    
    $sql $this->pdo->prepare$selectQuery );
                    if ( 
    $sql->execute( array( ':id'=>$this->id ) ) ) {
                        return 
    $sql->fetchColumn();
                    }
                    } else {
                    
    // var_dump( $this );
                    
    throw new entityException__METHOD__ "( $name ), You must set an ID for the selection." );
                }
            }
        }

        public function 
    insert() {
            
    $cols implode", "array_keys$_POST ) );
            
    $values implode", :"array_keys$_POST ) );
            foreach ( 
    $_POST AS $field=>$value ) {
                unset( 
    $_POST[$field] );
                
    $_POST[":" $field] = $value;
            }
            
    $insertQuery "INSERT INTO " $this->table " (" $cols ") VALUES (" $values ")";
            
    $sql $this->pdo->prepare$insertQuery );
            return 
    $sql->execute$_POST );
        }

        public function 
    update() {
            foreach ( 
    $_POST AS $field=>$value ) {
                if ( !
    is_numeric$value ) ) {
                    
    $_POST[$field] = "'" $value "'";
                }
            }
            if ( 
    $this->id ) {
                
    $set '';
                foreach ( 
    $_POST AS $field=>$value ) {
                    
    $set .= $field '=' $value ',';
                }
                
    $set substr$set0, -);
                
    $updateQuery "UPDATE $this->table SET $set WHERE id = :id";
                
    $sql $this->pdo->prepare$updateQuery );
                return 
    $sql->execute( array( ':id'=>$this->id ) );
                } else {
                throw new 
    entityException'Devi impostare un ID di selezione.' );
            }
        }

        public function 
    remove() {
            if ( 
    $this->id ) {
                
    $deleteQuery "DELETE FROM $this->table WHERE id = :id";
                
    $sql $this->pdo->prepare$deleteQuery );
                return 
    $sql->execute( array( ':id'=>$this->id ) );
                } else {
                throw new 
    entityException'Devi impostare un ID di selezione.' );
            }
        }

        public function 
    getMsg() {
            return 
    $this->msg;
        }

        public function 
    toArray() {
            return 
    get_object_vars$this );
        }


    dimmi tu cosa non capisci che ti spiego.. ci sono troppe cose da dire
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    qui sotto una implementazione della classe per gestire un ipotetico campo iva

    Codice PHP:
    class taxcodeModel extends entity {

        protected 
    $table 'taxcodes';
        protected 
    $fields = array( 'id''uid''code''description''amount''fulldescription',
            
    'msg''options''taxcode''taxcodebycode''taxcodes' );

        public function 
    getTaxcode() {
            
    $selectQuery "SELECT * FROM " $this->table " WHERE id = :id LIMIT 0,1";
            if ( 
    $this->id ) {
                
    $sql $this->pdo->prepare$selectQuery );
                if ( 
    $sql->execute( array( ':id'=>$this->id ) ) ) {
                    return 
    $sql->fetchPDO::FETCH_OBJ );
                }
                } else {
                
    $this->msg "Devi impostare un ID di selezione.";
            }
        }

        public function 
    getTaxcodebycode() {
            
    $selectQuery "SELECT * FROM " $this->table " WHERE uid = :uid AND code = :code LIMIT 0,1";
            if ( 
    $this->uid ) {
                if ( 
    $this->code ) {
                    
    $sql $this->pdo->prepare$selectQuery );
                    if ( 
    $sql->execute( array( ':uid'=>$this->uid':code'=>$this->code ) ) ) {
                        return 
    $sql->fetchPDO::FETCH_OBJ );
                    }
                    } else {
                    
    $this->msg "Devi impostare un CODE di selezione!";
                }
                } else {
                
    $this->msg "Devi impostare un UID di selezione!";
            }
        }

        public function 
    getTaxcodes() {
            
    $selectQuery "SELECT * FROM " $this->table;
            if ( 
    $this->options != '' ) {
                
    $selectQuery .= ' ' $this->options;
            }
            
    $sql $this->pdo->prepare$selectQuery );
            if ( 
    $sql->execute$input ) ) {
                
    $rows = array();
                while ( 
    $row $sql->fetchPDO::FETCH_OBJ ) ) {
                    
    $rows[] = $row;
                }
                return 
    $rows;
            }
        }

        public function 
    insert() {
    $insertQuery = <<<QUERY
    INSERT INTO
      
    $this->table
    (id, uid, code, description, amount, fulldescription)
    VALUES
      (:id, :uid, :code, :description, :amount, :fulldescription)
    QUERY;
            if ( 
    $this->uid ) {
                
    $fields = array(
                    
    ':id'=>uniqid(),
                    
    ':uid'=>$this->uid,
                    
    ':code'=>'',
                    
    ':description'=>'',
                    
    ':amount'=>'',
                    
    ':fulldescription'=>''
                
    );
                foreach ( 
    $_POST AS $field=>$value ) {
                    if ( 
    array_key_exists':'.$field$fields ) ) {
                        
    $fields[':'.$field] = $value;
                    }
                }
                
    $sql $this->pdo->prepare$insertQuery );
                if ( 
    $sql->execute$fields ) ) {
                    
    $this->msg['msg'] = "Taxcode creata con successo!";
                    
    $this->msg['err'][] = "...";
                    } else {
                    throw new 
    PDOException__CLASS__ ': Valori di input errati, nessuna riga inserita' );
                }
                } else {
                
    $this->msg "Devi impostare un UID!";
            }
        }

    Questa volta, più che un voto.. è favoreggiamento.

  4. #4
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ok è abbastanza chiaro... questa tua struttura gestisce in todo le cosidette operazioni crud..

    Ma per generare l'html come faresti?

    Intedi creare un metodo taxcodeModel che ti restituisce ad esempio la forma tabellare del tuo oggetto Es :

    taxcode.class.php
    Codice PHP:
    public GetTabletaxcode(){

        
    $html ="<table>";
        
    $html.="<td>id</td>";
        
    $html.="<td>uid</td>";
        
    $html.="<td>code</td>";      
        
    $html.="<td>description</td>";                
        foreach (
    getTaxcodebycode as $taxcode){
            
    $html.="<td>".$taxcode['id']."</td>";
            
    $html.="<td>".$taxcode['uid']."</td>";
            
    $html.="<td>".$taxcode['code']."</td>";
            
    $html.="<td>".$taxcode['description']."</td>";
        }
        
    $html.="</table>";

    taxcode.php
    Codice PHP:
    <?php
    $taxcodeModel  
    taxcodeModel($PDO);
    $taxcodeModel-->GetTabletaxcode();
    ?>
    Supponendo di non aver scritto una grandissima cazzata, come gestiresti la visualizzazione della singola taxcode in una form di modifica?
    Che mestiere difficile.....essere da soli ancora di più

  5. #5
    Originariamente inviato da Fractals87
    Ok è abbastanza chiaro... questa tua struttura gestisce in todo le cosidette operazioni crud..

    Ma per generare l'html come faresti?

    Intedi creare un metodo taxcodeModel che ti restituisce ad esempio la forma tabellare del tuo oggetto Es :

    taxcode.class.php
    Codice PHP:
    public GetTabletaxcode(){

        
    $html ="<table>";
        
    $html.="<td>id</td>";
        
    $html.="<td>uid</td>";
        
    $html.="<td>code</td>";      
        
    $html.="<td>description</td>";                
        foreach (
    getTaxcodebycode as $taxcode){
            
    $html.="<td>".$taxcode['id']."</td>";
            
    $html.="<td>".$taxcode['uid']."</td>";
            
    $html.="<td>".$taxcode['code']."</td>";
            
    $html.="<td>".$taxcode['description']."</td>";
        }
        
    $html.="</table>";

    taxcode.php
    Codice PHP:
    <?php
    $taxcodeModel  
    taxcodeModel($PDO);
    $taxcodeModel-->GetTabletaxcode();
    ?>
    Supponendo di non aver scritto una grandissima cazzata, come gestiresti la visualizzazione della singola taxcode in una form di modifica?
    fermo.. il modello fornisce i dati, la vista li mostra al dispositivo.

    i dati di cui avrai bisogno, a parte qualche rara eccezzione particolare sono:
    1 campo
    1 riga
    N righe

    1 campo io me lo faccio restituire dalla classe madre astratta
    Codice PHP:
        public function __get$name ) {
            if ( !
    in_array$name$this->fields ) ) {
                throw new 
    entityException'The field [ ' $name ' ] is not allowed "get" for this entity.' );
            }
            
    $accessor 'get' ucfirst$name );
            if ( 
    method_exists$this$accessor ) && is_callable( array( $this$accessor ) ) ) {
                return 
    $this->$accessor();
                } else {
                if ( 
    $this->id ) {
                    
    $selectQuery "SELECT $name FROM $this->table WHERE id = :id";
                    
    $sql $this->pdo->prepare$selectQuery );
                    if ( 
    $sql->execute( array( ':id'=>$this->id ) ) ) {
                        return 
    $sql->fetchColumn();
                    }
                    } else {
                    
    // var_dump( $this );
                    
    throw new entityException__METHOD__ "( $name ), You must set an ID for the selection." );
                }
            }
        } 
    se non trovo un "accessor" (quindi se non esiste un metodo particolare da richiamare per selezionare un determinato campo) effettuo la selezione direttamente nel db.
    Quindi ad esempio puoi benissimo fare:
    Codice PHP:
    $taxcodeModel  = new taxcodeModel$PDO );
    $taxcodeModel->id "123456";
    echo 
    $taxcodeModel->code;
    echo 
    $taxcodeModel->description
    gli altri 2 valori (la riga e le righe) le trovi sulla classe estesa.
    Codice PHP:
        public function getTaxcode() {
            
    $selectQuery "SELECT * FROM " $this->table " WHERE id = :id LIMIT 0,1";
            if ( 
    $this->id ) {
                
    $sql $this->pdo->prepare$selectQuery );
                if ( 
    $sql->execute( array( ':id'=>$this->id ) ) ) {
                    return 
    $sql->fetchPDO::FETCH_OBJ );
                }
                } else {
                
    $this->msg "Devi impostare un ID di selezione.";
            }
        }

        public function 
    getTaxcodes() {
            
    $selectQuery "SELECT * FROM " $this->table;
            if ( 
    $this->options != '' ) {
                
    $selectQuery .= ' ' $this->options;
            }
            
    $sql $this->pdo->prepare$selectQuery );
            if ( 
    $sql->execute$input ) ) {
                
    $rows = array();
                while ( 
    $row $sql->fetchPDO::FETCH_OBJ ) ) {
                    
    $rows[] = $row;
                }
                return 
    $rows;
            }
        } 
    io lavoro con gli oggetti quindi PDO::FETCH_OBJ mi restituisce la riga o le righe sotto forma di oggetto...

    Codice PHP:
    $taxcodeModel  = new taxcodeModel$PDO );
    $taxcodeModel->id "123456";
    var_dump$taxcodeModel->taxcode ); 
    questi valori nudi e crudi verranno poi elaborati con il controller e mostrati/iniettati dalla vista.. o tramite decorator o altro a piacimento.
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ok ora ho capito...
    Utilizzando questa struttura di massima però è limitata a semplici select...
    Suppongo che tu abbia serie di "Viste" (Lato db infinite), perchè nel caso di dovere ottenere un record significativo con codici di aggancio diventa un casino fare left join, inner.
    ....
    Oddio adesso che ci penso.... a meno che tu non intenda impostare il metodo getTaxcode
    già in modo opportuno per avere già il tuo oggetto significativo (intendo con tutti i campi compresi quelli provenienti da altre tabelle.)
    .....

    Percui stai perseguendo il pattern MVC (che non ho mai capito a fondo nonostante i numerosi esempi in rete)

    Un volta che tu ottieni il tuo oggetto completo

    Codice PHP:
    $taxcodeModel  = new taxcodeModel$PDO ); 
    $taxcodeModel->id "123456"
    $taxcodeModel->getTaxcode(); 
    Perchè devi passarlo ad un controllore?
    Cioè non è sufficiente fare una cosa del genere.
    Codice PHP:
    $taxcodeView = new taxcodeView ($taxcodeModel);
    $taxcodeView->GetTable() 
    taxcodeView.php
    Codice PHP:
    class taxcodeView{
        private 
    taxcode;

        function 
    __costruct(taxcodeModel taxcode){
            
    $this->taxcode taxcode;
        }
        
        public function 
    GetTable(){

            
    $html ="<table>"
            
    $html.="<td>id</td>"
            
    $html.="<td>uid</td>"
            
    $html.="<td>code</td>";       
            
    $html.="<td>description</td>";                 
            foreach (
    getTaxcodebycode as $taxcode){ 
                
    $html.="<td>".$this->taxcode['id']."</td>"
                
    $html.="<td>".$this->taxcode['uid']."</td>"
                
    $html.="<td>".$this->taxcode['code']."</td>"
                
    $html.="<td>".$this->taxcode['description']."</td>"
            } 
            
    $html.="</table>";         
        }

    Che mestiere difficile.....essere da soli ancora di più

  7. #7
    Originariamente inviato da Fractals87

    Oddio adesso che ci penso.... a meno che tu non intenda impostare il metodo getTaxcode
    già in modo opportuno per avere già il tuo oggetto significativo (intendo con tutti i campi compresi quelli provenienti da altre tabelle.)
    .....
    bravissimo hai capito giusto..

    uno spezzone di un'altra classe che però rapresenta i "partners" di un'azienda:
    Codice PHP:
    class partnerModel extends entity {

        protected 
    $table 'partners';
        protected 
    $fields = array( 'id''uid''name''address''country''town''district''cap',
            
    'phone''fax''taxcode''iso''vat''pricelist''accounttype''account''partner',
            
    'partnerbyvat''partners''options''encoder''msg' );

        public function 
    getPartner() {
    $selectQuery = <<<QUERY
    SELECT
      P.*,
      CO.name AS countryname,
      PAY.description AS paymentdescription,
      PL.description AS pricelistdescription
    FROM
      
    $this->table P
    LEFT JOIN
      countries CO
      ON P.country = CO.id
    LEFT JOIN
      payments PAY
      ON P.payment = PAY.id
    LEFT JOIN
      pricelists PL
      ON P.pricelist = PL.id
    WHERE
      P.id = :id
    LIMIT
      0,1
    QUERY;
            if ( 
    $this->id ) {
                
    $sql $this->pdo->prepare$selectQuery );
                if ( 
    $sql->execute( array( ':id'=>$this->id ) ) ) {
                    if ( 
    $this->encoder ) {
                        
    $row $sql->fetchPDO::FETCH_ASSOC );
                        return 
    $this->encoder->setData$row )->encode();
                        } else {
                        return 
    $sql->fetchPDO::FETCH_OBJ );
                    }
                }
                } else {
                
    $this->msg "Devi impostare un ID per la selezione.";
            }
        } 
    come puoi notare la query effettua già le join necessarie per recuperare i dati che mi servono

    Perchè devi passarlo ad un controllore?
    il controllore serve per verificare i dati in "input" se necessario..
    tornando alla classe taxcode, il metodo per l'inserimento di un nuovo taxcode passando dal controller è:
    Codice PHP:
        public function add() {
            if ( isset( 
    $_POST['taxcode-add-form-submit'] ) ) {
                
    $fv = new formValidator();
                
    $fv->validateEmpty'code''You must insert a value for the field [code]' );
                
    $fv->validateEmpty'description''You must insert a value for the field [description]' );
                
    $fv->validateEmpty'amount''You must insert a value for the field [amount]' );
                
    $fv->validateEmpty'fulldescription''You must insert a value for the field [fulldescription]' );
                ( !empty( 
    $_POST['code'] ) ) ? $fv->validateRange'code''The field [code] has a max length of 32'32 ) : NULL;
                ( !empty( 
    $_POST['description'] ) ) ? $fv->validateRange'description''The field [description] has a max length of 32'32 ) : NULL;
                ( !empty( 
    $_POST['amount'] ) ) ? $fv->validateNumber'amount''The field [amount] is not a number.' ) : NULL;
                ( !empty( 
    $_POST['fulldescription'] ) ) ? $fv->validateRange'fulldescription''The field [fulldescription] has a max length of 254'254 ) : NULL;

                
    $content = new partial'form-message' );
                if ( 
    $fv->checkErrors() ) {
                    
    $content->content $fv->displayErrors();
                    } else {
                    
    $this->model->uid $this->user->id;
                    
    $this->model->code $_POST['code'];
                    if ( 
    $taxcode $this->model->taxcodebycode ) {
                        
    $content->content "The selected CODE is already in use by another taxcode: '$taxcode->description'";
                        } else {
                        
    $this->model->insert();
                        
    $content->content $this->model->msg;
                    }
                }
                } else {
                
    $content = new partial'taxcode-add-form' );
            }

            
    $this->view->title 'Taxcode - Add';
            
    $this->view->addView$content );
        } 
    come vedi prima vengono "controllati" i dati in input e poi successivamente viene fatto l'inserimento nel db e visualizzato il messaggio tramite la vista.. Qui è un po' piu complesso visto che c'è tutto un pattern che fa le operazioni..

    Nessuno ti vieta di fare diversamente dipende dalle esigenze del progetto
    Questa volta, più che un voto.. è favoreggiamento.

  8. #8
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    guarda con tutta franchezza riesco a capire le cose solo a mano mano che mi posti il codice...
    Nel senso ok per l'inserimento è chiaro tu hai una classe formvalidator che in base a determinati parametri va i dovuti controlli ed emette o meno errori..

    Da quanto posso capire e intuire il metodo add è bivalente, nel senso che verifica se c'è un submit della form..
    se c'è fa l'insert..
    altrimenti
    $content = new partial( 'taxcode-add-form' );
    $this->view->title = 'Taxcode - Add';
    $this->view->addView( $content );

    (Non ho idea di cosa sia il metodo partial) ma presumo che in base al valore passato 'taxcode-add-form', 'form-message' restituisce o la form vuota oppure solo il messaggio
    Il metodo addview presumo che faccia proprio la echo..


    Percui dalla tua pagina.. tu non richiamerai mai l'oggetto view...
    ma sempre e solo il controllore, che passerai al modello, il quale infine richiama l'opportuno metodo della view e lo stampa.

    Questa ultima frase è motivata dalla famosa domanda come ottenere il multiriga???

    Si è veramente molto complesso, non riuscirei a fare un codice mvc efficiente.

    Ma le tue pagine "entrypoint" come sono?
    Nel senso come fai a sapere cosa fare?
    Esempio parner :

    partner.php

    partner.model.php
    partnet.controller.php
    partner.view.php

    partner.php?funz=insert
    partner.php?funz=mod&id=12345
    partnet.php?funz=delete&id=123456
    partnet.php?funz=view
    partnet.php?funz=view + ($_POST[] per discriminare se molti o uno)
    Che mestiere difficile.....essere da soli ancora di più

  9. #9
    allora partiamo dal metodo del controllore:

    Codice PHP:
    public function add() { 
    questo metodo viene richiamato ogni volta che l'utente raggiunge il percorso:

    http://www.sito.it/partner/add

    partner -> rappresenta il modulo
    add -> rappresenta la funzione da richiamare

    sel l'utente raggiunge l'indirizzo e non ha ancora inviato dati al server
    quindi:
    Codice PHP:
                } else {
                
    $content = new partial'taxcode-add-form' );
            } 
    il contenuto da mostrare all'utente è formato da uno "spezzone" (partial), una parte di pagina, che si chiama "taxcode-add-form". Questa parte di pagina è un file php chiamato taxcode-form-add.php che contiene il template del form html

    l'utente visualizzerà il form di inserimento dati per creare un nuovo taxcode
    l'utente compila il form
    l'utente invia i dati al server

    il form di inserimento dati ha come action di nuovo http://www.sito.it/partner/add
    in questo modo richiamo il metodo add() con dati POST del form
    ora che ho i dati:
    Codice PHP:
            if ( isset( $_POST['taxcode-add-form-submit'] ) ) { 
    verifico che il form sia effettivamente il form di inserimento del taxcode

    Codice PHP:
                $fv = new formValidator();
                
    $fv->validateEmpty'code''You must insert a value for the field [code]' );
                
    $fv->validateEmpty'description''You must insert a value for the field [description]' );
                
    $fv->validateEmpty'amount''You must insert a value for the field [amount]' );
                
    $fv->validateEmpty'fulldescription''You must insert a value for the field [fulldescription]' );
                ( !empty( 
    $_POST['code'] ) ) ? $fv->validateRange'code''The field [code] has a max length of 32'32 ) : NULL;
                ( !empty( 
    $_POST['description'] ) ) ? $fv->validateRange'description''The field [description] has a max length of 32'32 ) : NULL;
                ( !empty( 
    $_POST['amount'] ) ) ? $fv->validateNumber'amount''The field [amount] is not a number.' ) : NULL;
                ( !empty( 
    $_POST['fulldescription'] ) ) ? $fv->validateRange'fulldescription''The field [fulldescription] has a max length of 254'254 ) : NULL
    effettuo la validazione dei dati come vedi i nomi dei campi del form sono uguali ai nomi dei campi sulla tabella...
    la mia classe formValidator() mi permette di verificare i POST in base a vari tipi di controlli, campo vuoto, campo numerico, campo di testo, range di valori, date, latitudini ect ect
    se ci sono errori mi da un array altrimenti non mi da niente..

    ora le opzioni sono:
    o i dati sono validi
    o i dati non sono validi

    Codice PHP:
                $content = new partial'form-message' ); 
    mi creo lo spezzone me mostrare il messaggio

    se ci sono errori
    Codice PHP:
                if ( $fv->checkErrors() ) {
                    
    $content->content $fv->displayErrors(); 
    il contenuto del messaggio sara la lista di errori che bisogna sistemare

    se non ci sono errori
    Codice PHP:
                    } else {
                    
    $this->model->uid $this->user->id;
                    
    $this->model->code $_POST['code'];
                    if ( 
    $taxcode $this->model->taxcodebycode ) { 
    verifico che non esista già una riga con lo stesso codice quindi devo provare a richiamare un taxcode con il codice inserito dall'utente
    Codice PHP:
                        $content->content "The selected CODE is already in use by another taxcode: '$taxcode->description'"
    se il codice esiste nel database il contenuto del messaggio sarà "il codice selezionato è già in uso da un altro taxcode"
    Codice PHP:
                        } else {
                        
    $this->model->insert();
                        
    $content->content $this->model->msg;
                    }
                } 
    altrimenti posso inserire il nuovo taxcode e mostrare il messaggio di conferma

    manca ancora un pezzo che è la vista
    Codice PHP:
            $this->view->title 'Taxcode - Add';
            
    $this->view->addView$content ); 
    forse per capire meglio:
    Codice PHP:
    class taxcodeController extends abstractController {

        protected 
    $model NULL;
        protected 
    $user;
        protected 
    $view;

        public function 
    __constructPDO $pdouser $userview $view ) {
            
    $this->model = new taxcodeModel$pdo );
            
    $this->user $user;
            
    $this->view $view;
        }

        public function 
    index() {
        }

        public function 
    add() {
            
    $this->view->title 'Taxcode - Add';
            
    $this->view->addView$content );
        } 
    l'oggetto view è passato come parametro del costruttore (inheritance) ed è disponibile all'interno di tutta la classe.

    l'oggetto view è la "vista di base" la struttura principale della pagina (che di solito non cambia mai).
    l'oggetto view si compone a sua volta di N*view piu piccole che sono i "partial" che hai letto prima.

    Codice PHP:
            $this->view->title 'Taxcode - Add';
            
    $this->view->addView$content ); 
    Assegno un titolo alla pagina e poi basta aggiungere i frammenti alla view-madre e si compone la pagina intera

    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    ma percui il tuo entry point è solo uno presumo :
    index.php
    poi in base all'url carichi modello, controllore e vista richiamando infine la giusta funzione del controllore modello.

    Per una ipotetica visualizzazione multiriga i compiti associati ad ognuno sarebbero :
    Per il modello ovviamente fare l'estrapolazione dei dati, il controllore andrebbe a trattarmi i campi, (trasmormazione delle date ENG-ITA, manipolazione float punto o virgola, gestione caratteri speciali).
    Infine l'array trattato verrà inviato alla vista che lo ciclerà stampando i result

    Dal tuo codice vedo che il controllore richiama la vista...
    Ipotizzando di avere più viste per un determinato metodo del modello come fai a caricare la vista?

    Nel senso la stessa entity, visualizzata da due utenti con privilegi diversi, potrebbe avere 2 viste diverse, ma il metodo del controller dovrebbe essere lo stesso...

    E' scorretto richiamare dal tuo entry point la vista?

    A meno che, se come discriminante propaghi la classe user, nel controller, nella vista e a seconda dell'utente gli vai a stampare la vista corretta.

    Dando per buono il discorso dell'entry point...
    Presumo che in testata avrai una routine che ti carica il modello, controller e vista..
    ma se avessi necessità di richiamare in modo asincrono il modello?
    Prendiamo per esempio nel caso che a fronte di una select option selezionata vai a popolarne un'altra...
    Avresti la necessità di richiamare il modello per la selelzione dei dati, passarlo al controller per la manipolazione e infine richiamare la vista che potrebbe restituirti o una select che vai a sostituire brutalmente o se vuoi fare le cose cool, restituire un formato json (che però implica una ulteriore manipolazione la js per il ripopolamento della select)
    Che mestiere difficile.....essere da soli ancora di più

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.