Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Logica MVC

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    Logica MVC

    Ciao a tutti, ho scaricato un esempio di griglia in PHP e Zend

    Sto studiando da poco la logica MVC e già questo script mi manda in crisi perchè nella cartella models non trovo nulla mentre nella cartella controllers trovo un unico file (questo che allego , scusate se è lungo ma vorrei un vostro aiuto).

    Sbaglio o il questo file ho sia il model che il controller?? (teoricamente il model dovrebbe contenere le query al DB, perchè sono nel controller??). Come potre renderlo "corretto" per la logica MVC?

    Graaaazie

    Codice PHP:

    <?php


    class SiteController extends Zend_Controller_Action
    {

        
    /**
         * [EN]If a action don't exist, just redirect to the basic
         *
         * @param string $name
         * @param array $var
         */
        
    function __call($name$var)
        {
            
    $this->_redirect 'default/site/basic', array ('exit' => ) );
            return 
    false;
        }


        
    /**
         * [EN] I think this is needed for something. can't remember
         *
         */
        
    function init()
        { 

            
    $this->view->url Zend_Registry::get 'config' )->site->url;
        }


        
    /**
         * Same as __call
         *
         */
        
    function indexAction()
        {

            
    $this->_forward 'basic' );
        }


        
    /**
         * Show the source code for this controller
         *
         */
        
    function codeAction()
        {

            
    $this->render 'code' );
        }


        
    /**
         * [EN] Simplify the datagrid creation process
         * [EN] Instead of having to write "long" lines of code we can simplify this.
         * [EN] In fact if you have a Class that extends the Zend_Controller_Action
         * [EN] It's not a bad idea put this piece o code there. May be very useful
         * 
         *
         * @return $grid
         */
        
    function grid()
        {

            
    $export $this->getRequest ()->getParam 'export' );
            
            
    $db Zend_Registry::get 'db' );
            
            switch (
    $export)
            {
                case 
    'odt' :
                    
    $grid "Bvb_Grid_Deploy_Odt";
                    break;
                case 
    'ods' :
                    
    $grid "Bvb_Grid_Deploy_Ods";
                    break;
                case 
    'xml' :
                    
    $grid "Bvb_Grid_Deploy_Xml";
                    break;
                case 
    'csv' :
                    
    $grid "Bvb_Grid_Deploy_Csv";
                    break;
                case 
    'excel' :
                    
    $grid "Bvb_Grid_Deploy_Excel";
                    break;
                case 
    'word' :
                    
    $grid "Bvb_Grid_Deploy_Word";
                    break;
                case 
    'wordx' :
                    
    $grid "Bvb_Grid_Deploy_Wordx";
                    break;
                case 
    'pdf' :
                    
    $grid "Bvb_Grid_Deploy_Pdf";
                    break;
                case 
    'print' :
                    
    $grid "Bvb_Grid_Deploy_Print";
                    break;
                default :
                    
    $grid "Bvb_Grid_Deploy_Table";
                    break;
            }
            
            
    $grid = new $grid $db'Grid Example''media/temp', array ('download' ) );
            
    $grid->escapeOutput false );
            
    $grid->addTemplateDir 'My/Template/Table''My_Template_Table''table' );
            
    $grid->addElementDir 'My/Validate''My_Validate''validator' );
            
    $grid->addElementDir 'My/Filter''My_Filter''filter' );
            
    $grid->addFormatterDir 'My/Formatter''My_Formatter' );
            
    $grid->imagesUrl $this->getRequest ()->getBaseUrl () . '/public/images/';
            
    $grid->cache = array ('use' => 0'instance' => Zend_Registry::get 'cache' ), 'tag' => 'grid' );
            
            return 
    $grid;
        }

        

        
    /**
         * Performing CRUD operations.
         * 
         * Check how easy it is to set a form.
         *
         */
        
    function crudAction()
        {

            
    $db Zend_Registry::get 'db' );
            

            
    $grid $this->grid 'table' );
            
    $grid->from 'crud' )
            ->
    order 'id DESC ' );
            
            
    $paises $db->fetchCol "SELECT DISTINCT(Name) FROM Country ORDER BY Name ASC " );
            
    $language $db->fetchCol "SELECT DISTINCT(Language) FROM CountryLanguage ORDER BY Language ASC" );
            
            
    $grid->addColumn 'id', array ('title' => 'ID''hide' => ) );
            
    $grid->addColumn 'firstname', array ('title' => 'First Name' ) );
            
    $grid->addColumn 'lastname', array ('title' => 'Last Name' ) );
            
    $grid->addColumn 'email', array ('title' => 'Email' ) );
            
    $grid->addColumn 'age', array ('title' => 'Age' ) );
            
    $grid->addColumn 'language', array ('title' => 'Language' ) );
            
    $grid->addColumn 'date_added', array ('title' => 'Updated''format' => array ('date''en_US' ), 'class' => 'width_150' ) );
            
    $grid->addColumn 'country', array ('title' => 'Country' ) );
            

            
    $form = new Bvb_Grid_Form ( );
            
    $form->add )
            ->
    edit )
            ->
    button )
            ->
    delete )
            ->
    onAddForce ( array ('date_added' => date 'Y-m-d H:i:s' ) ) )
            ->
    onEditForce ( array ('date_added' => date 'Y-m-d H:i:s' ) ) );
            

            
    #->onDeleteCascade(array('table'=>'teste','parentField'=>'age','childField'=>'op','operand'=>'='))
            
            
    $fAdd = new Bvb_Grid_Form_Column 'firstname' );
            
    $fAdd->title 'First name' )
            ->
    validators ( array ('StringLength' => array (310 ) ) )
            ->
    filters ( array ('StripTags''StringTrim''StringToLower' ) )
            ->
    attributes(array('type'=>'password'))
            ->
    description 'Insert your first name. (password type...)' );
            
            
    $lastName = new Bvb_Grid_Form_Column 'lastname' );
            
    $lastName->title 'Last name' )
            ->
    description 'Your last name' )
            ->
    validators ( array ('StringLength' => array (310 ) ) );
            
            
    $country = new Bvb_Grid_Form_Column 'country' );
            
    $country->title 'Country' )
            ->
    description 'Choose your Country' )
            ->
    values array_combine $paises$paises ) );
            
            
    $email = new Bvb_Grid_Form_Column 'email' );
            
    $email->title 'Email Address' )
            ->
    validators ( array ('EmailAddress' ) )
            ->
    filters ( array ('StripTags''StringTrim''StringToLower' ) )
            ->
    description 'Insert you email address' );
            

            
    $lang = new Bvb_Grid_Form_Column 'language' );
            
    $lang->title 'Language' )
            ->
    description 'Your language' )
            ->
    values array_combine $language$language ) );
            

            
    $age = new Bvb_Grid_Form_Column 'age' );
            
    $age->title 'Age' )
            ->
    description 'Choose your age' )
            ->
    values array_combine range 10100 ), range 10100 ) ) );
            
            
    $form->addColumns $fAdd$lastName$email$lang$country$age );
            

            
    $grid->addForm $form );
            

            
    //Add  filters
            
    $filters = new Bvb_Grid_Filters ( );
            
    $filters->addFilter 'firstname' )
            ->
    addFilter 'lastname' )
            ->
    addFilter 'email' )
            ->
    addFilter 'age', array ('distinct' => array ('name' => 'age''field' => 'age' ) ) )
            ->
    addFilter 'country', array ('distinct' => array ('name' => 'country''field' => 'country' ) ) )
            ->
    addFilter 'language', array ('distinct' => array ('name' => 'language''field' => 'language' ) ) );
            
            
    $grid->addFilters $filters );
            

            
    $this->view->pages $grid->deploy ();
            
    $this->render 'index' );
        }


        
    /**
         * The 'most' basic example.
         * 
         * Please check the $pdf array to see how we can configure the templates header and footer. 
         * If you are exporting to PDF you can even choose between  a letter format or A4 format, and set the page orientation
         * landascape or '' (empty) for vertical
         *
         */
        
    function basicAction()
        {

            
    $grid $this->grid 'table' );
            
    $grid->from 'City' );
            

            
    $pdf = array ('logo' => 'public/images/logo.png''baseUrl' => '/grid/''title' => 'DataGrid Zend Framework''subtitle' => 'Easy and powerfull - (Demo document)''footer' => 'Downloaded from: [url]http://www.petala-azul.com[/url] ''size' => 'a4'#letter || a4
    'orientation' => 'landscape'# || ''
    'page' => 'Page N.' );
            

            
    $grid->setTemplate 'print''print'$pdf );
            
    $grid->setTemplate 'pdf''pdf'$pdf );
            
    $grid->setTemplate 'word''word'$pdf );
            
    $grid->setTemplate 'wordx''wordx'$pdf );
            
    $grid->setTemplate 'ods''ods'$pdf );
            
            
    $grid->setPrimary(false);
            
            
    $this->view->pages $grid->deploy ();
            
    $this->render 'index' );
        }

        
    /**
         * If you don't like to work with array when adding columns, you can work by dereferencing objects
         *
         */
        
    function columnAction()
        {

            
    $grid $this->grid 'table' );
            
    $grid->from 'Country as c INNER JOIN City as ct ON c.Capital=ct.ID ' )
            ->
    table ( array ('c' => 'Country''ct' => 'City' ) )
            ->
    order 'c.Continent, c.Name' )
            ->
    setPagination 20 );
            
    #->noFilters(1);
            #->noOrder(1);
            


            
    $cap = new Bvb_Grid_Column 'c.Name AS cap' );
            
    $cap->title 'Country (Capital)' )
            ->
    decorator '{{c.Name}} [i]({{ct.Name}})[/i]' );
            
            
    $name = new Bvb_Grid_Column 'ct.Name' );
            
    $name->title 'Capital' )
            ->
    hide );
            
            
    $continent = new Bvb_Grid_Column 'c.Continent' );
            
    $continent->title 'Continent' );
            
            
    $population = new Bvb_Grid_Column 'c.Population' );
            
    $population->title 'Population' )
            ->
    class 'width_80' );
            
            
    $lifeExpectation = new Bvb_Grid_Column 'c.LifeExpectancy' );
            
    $lifeExpectation->title 'Life E.' )
            ->
    class 'width_50' );
            
            
    $governmentForm = new Bvb_Grid_Column 'c.GovernmentForm' );
            
    $governmentForm->title 'Government Form' );
            
            
    $headState = new Bvb_Grid_Column 'c.HeadOfState' );
            
    $headState->title 'Head Of State' );
            
            
    $grid->addColumns $cap$name$continent$population$lifeExpectation$governmentForm$headState );
            

            
    $filters = new Bvb_Grid_Filters ( );
            
    $filters->addFilter 'c.Name', array ('distinct' => array ('field' => 'c.Name AS cap''name' => 'c.Name AS cap' ) ) )
            ->
    addFilter 'ct.Name', array ('distinct' => array ('field' => 'ct.Name''name' => 'ct.Name' ) ) )
            ->
    addFilter 'c.Continent', array ('distinct' => array ('field' => 'c.Continent''name' => 'c.Continent' ) ) )
            ->
    addFilter 'c.LifeExpectancy', array ('distinct' => array ('field' => 'c.LifeExpectancy''name' => 'c.LifeExpectancy' ) ) )
            ->
    addFilter 'c.GovernmentForm', array ('distinct' => array ('field' => 'c.GovernmentForm''name' => 'c.GovernmentForm' ) ) )
            ->
    addFilter 'c.HeadOfState' )
            ->
    addFilter 'c.Population' );
            
            
    $grid->addFilters $filters );
            
            
    $this->view->pages $grid->deploy ();
            
    $this->render 'index' );
        }


        
    /**
         * @param object $object
         * @return array
         */
        
    function object2array($object)
        {

            
    $return NULL;
            if (
    is_array $object ))
            {
                foreach ( 
    $object as $key => $value )
                    
    $return [$key] = self::object2array $value );
            } else
            {
                
    $var get_object_vars $object );
                if (
    $var)
                {
                    foreach ( 
    $var as $key => $value )
                        
    $return [$key] = self::object2array $value );
                } else
                {
                    return 
    strval $object );
                }
            }
            return 
    $return;
        }
    }

  2. #2
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    quello che hai postato è un controller, gli ho dato una veloce occhiata, come dici tu non sono presenti istanze di modelli, e visto che la directory dei modelli è vuota mi sembra normale

    Nelle actions di questo controller si è preferito eseguire le query utilizzando direttamente l'oggetto $db

    Codice PHP:
    $db Zend_Registry::get 'db' ); 
    inizializzato molto probabilmente nel bootstrap.
    Ii dati vengono presi eseguendo queries direttamente nelle action,
    per esempio così

    Codice PHP:
    $paises $db->fetchCol "SELECT DISTINCT(Name) FROM Country ORDER BY Name ASC " ); 
    Per quanto riguarda le grid che usi non dico nulla in quanto non le ho mai usate, ma in questo sito eventualmente trovi della documantazione se è necessario.

    Per seguire la logica MVC immagino che le queries eseguite nella action dovrebbero essere spostate come metodi all'interno di un modello.

    Codice PHP:
    $modelCountry = new Model_Country();
    $paises $modelCountry->metodoCheRitornaIDati(); // Istanze di Zend_Db_Table_Row 
    Quindi avresti il modello Country all'interno della directory Model.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    grazie per la risposta, effettivamente sembra un po' incasinato!

    scusa la domanda, ma tu non sapresti dirmi dove posso trovare (oppure magari l'hai tu) un semplice esempio, con la struttura corretta Zend delle cartelle che gestisca: visualizzazione in tabella e CRUD??

    vorrei un esempio di questo tipo (corretto!!!) per iniziare a fare le mie prove!

    spero tu possa aiutarmi!

    Grazie

  4. #4
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Con la struttura delle cartelle intendi l'albero dell'applicazione?
    In questo caso ti consiglio di creare un progetto ex-novo con zend tool, ci vanno 10 minuti, ho scritto un tutorial sul mio blog.

    Per quanto riguarda le grid io immagino che la documentazione nel sito che ho segnalato dovrebbe essere sufficiente, o almeno, lo spero per te, purtroppo non avendo mai lavorato con questo componente ( non sapevo nemmeno esistesse.. ) non posso aiutarti.


    Mi pare esistano anche alcuni open source che usano zend framework, uno se non sbaglio è digitalus cms, potresti provare a scaricarlo e vedere com'è fatto.

    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Graaaazie per tutte le risposte


    Originariamente inviato da Razorblade

    Con la struttura delle cartelle intendi l'albero dell'applicazione?
    In questo caso ti consiglio di creare un progetto ex-novo con zend tool, ci vanno 10 minuti, ho scritto un tutorial sul mio blog.
    Zend Tool?? Quando dovrei utilizzarlo ... io ho sempre scritto tutto a manina senza tool....

    Per quanto riguarda le grid io immagino che la documentazione nel sito che ho segnalato dovrebbe essere sufficiente, o almeno, lo spero per te, purtroppo non avendo mai lavorato con questo componente ( non sapevo nemmeno esistesse.. ) non posso aiutarti.
    Si, sto cercando di fare un po' di prove


    Potresti farmi un semplice esempio di come dovrei scindere il controller dal model, partendo da una funzione che ho nel model?

    Thanks

  6. #6
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    Zend Tool è un componente di zend framework, non è un'applicazione esterna, bensì una classe presente all'interno del framework. Zend Tool riesce a generare dal nulla un progetto di base funzionante, e questo progetto contiene l'albero dell'applicazione, che è quello consigliato.

    Ho scritto una piccola guida tempo fa, potrebbe esserti di aiuto leggerla.

    L'esempio del modello te l'avevo già fatto con il Model_Country, il codice potrebbe essere qualcosa di simile

    Codice PHP:
    <?php 

      
    class Model_Countries extends Zend_Db_Table_Abstract
      
    {
        protected 
    $_rowClass 'Model_Country';
        
        
    // grazie a questo metodo possiamo tenere i nomi delle tabelle nel config
        // in alternativa devi specificare il nome tabella così
        // protected $_name = 'countries';
        
    protected function _setupTableName(){ 
          
    $config Zend_Registry::get('config');
          
    $this->_name $config->table->countries;
          
    parent::_setupTableName();
        }
       
        
    // solo un esempio di metodo che restituisce i nomi dei paesi
        
    public function getPaises(){ 
          
    $select $select $this->getAdapter()->select();
          
    $select->from(array( "a" => $this->_name),
            array(
              
    'DISTINCT(a.Name)'
            
    )
          )
          ->
    order('a.Name ASC');
          return 
    $this->getAdapter->fetchAll($select);
        }
      }
    Inoltre come puoi vedere in cima, ho specificato la row level class $_rowClass,
    creala anche vuota.

    Codice PHP:
    <?php

      
    class Model_Country extends Zend_Db_Table_Row_Abstract 
      

      
      }

    Create le classi di qui sopra all'interno della directory Model, nei vari controller potrai istanziarle, riprendendo l'esempio che avevo già fatto ( riveduto e corretto in relazione al nome delle classi create )

    Codice PHP:
    $modelCountries = new Model_Countries(); // Istanza della classe base, non row level
    $paises $modelCountries->getPaises(); // Istanze di Zend_Db_Table_Row 
    Ti avverto solo di una cosa, da qualche mese è stato introdotto anche un sistema di mapping dei campi delle varie tabelle ( o qualcosa del genere ), è una cosa che non ho visto perchè non ne ho avuto la necessità, so solo che per ogni modello viene addirittura creata una directory contenente alcuni files. Lascio a te eventuali ricerche per documentarti di più


    Inoltre, per eventuali dubbi e curiosità su come costruire le select programmaticamente ( anche in join ) ti consiglio di vedere la documentazione ufficiale.
    Spero di esserti stato di aiuto.

    Ciao!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Grazie mille per tutte le info!!

    Ora faccio qualche prova


    Graaaaazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Grazie mille!!! Ho letto il tuo articolo, molto interessante.

    Quindi zend tool predispone la struttura dell'applicazione ma non crea file specifi relativi, ad esempio, ad una tabella presente nel DB collegato all'applicazione??? ... inizialmente pensavo (speravo) questo ;-))

    Tornando all'esempio sulla grigla, oltra al Model/Controller da sistemare, ti sembra che presenti altre soluzioni "obsolete" e non propriamente corrette?

    Thanks

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.