Zend_Navigation questo sconosciuto.

Salve a tutti sono alle prese con la gestione dei menu di un sito internet e non riesco a districarmi fra tutte le funzionalità che zend offre. Ho cercato sulla rete ma non ho trovato grandi risorse su Zend_Navigation.

Qualcuno sa come implementarlo? Avete un esempio semplice per capire il funzionamento della classe?

Grazie mille

inviato 7 anni fa
ulisse
X 0 X

Si ma sono un pò difficili da leggere. Stavo cercando un piccolo tutorial   :'(

risposto 7 anni fa
ulisse
X 0 X

Ciao Ulisse...

anche io sto cercando di imparare il navigation. Come te sto facendo piuttosto fatica con il manuale presente sul sito Zend.

Hai per caso trovato qualche altra risorsa ? Io non ancora.

Magari teniamoci in contatto nel caso uno dei due riesca a fare qualche passo avanti....

Ciao.

risposto 7 anni fa
dacdam
X 0 X

Bingo!

Sono riuscito a produrre un menù usando lo zend navigation.... non sono ancora sicuro di aver utilizzato gli strumenti nel modo migliore, ma comunque ho creato le pagine, il contenitore ed ho renderizzato il menù usando l'helper.

Se hai ancora bisogno, chiedi pure: spero di riuscire a darti una mano.

risposto 7 anni fa
dacdam
X 0 X

Bingo!

Sono riuscito a produrre un menù usando lo zend navigation.... non sono ancora sicuro di aver utilizzato gli strumenti nel modo migliore, ma comunque ho creato le pagine, il contenitore ed ho renderizzato il menù usando l'helper.

Se hai ancora bisogno, chiedi pure: spero di riuscire a darti una mano.

perché non riporti un po' di codice che hai usato?

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Oggi purtroppo sono molto preso col lavoro...

Stasera spero di fare in tempo, comunque appena posso lo faccio volentieri, abbiate un attimo di pazienza.

 :bye:

risposto 7 anni fa
dacdam
X 0 X

Ciao,

io ho risolto in questo modo:

controller:

$container = new Zend_Navigation();

// add page by giving a page instance

$container->addPage(Zend_Navigation_Page::factory(array(

    'uri' => 'http://www.example.com/',

    'label'  => 'Save',

    'action' => 'save'

)));

$this->view->mymenu = $container;

view:

echo $this->navigation($this->mymenu)->menu();

Ciao

risposto 7 anni fa
Razorblade
X 0 X

Allora.... io, cercando anche di creare un pò d'ordine e del codice riutilizzabile, ho fatto così:

------------ 1 -------------

Ho creato una classe per contenere la definizione di tutte le pagine del sito. In questo modo centralizzo la configurazione delle pagine e la posso usare per creare diverse combinazioni in diversi container. Ecco un pezzo del listato:

class PagineSito{

   public static function getChiSiamo(){

      $pagina = new Zend_Navigation_Page_Mvc(array(   'action'      => 'index',

                                          'controller'   => 'Chisiamo',

                                          'label'         => 'Chi siamo'));   

      return $pagina;

   }

   public static function getScopo(){

      $pagina = new Zend_Navigation_Page_Mvc(array(   'action'      => 'index',

                                          'controller'   => 'Scopo',

                                          'label'         => 'Scopo'));   

      return $pagina;

   }

------------ 2 -------------

Ho creato una classe da usare per definire il menù principale. Penso che creerò una classe per ogni diverso menù che dovrò gestire nell'applicazione. Questa classe serve a creare il container nel quale vengono inserite le pagine tornate dai metodi statici della classe descritta al punto 1.

class MenuHome{

   public function creaContainer(){

      //Istanza del continer

      $container = new Zend_Navigation();

      // Aggiunta delle pagine

      $container->addPage(PagineSito::getChisiamo());

      $container->addPage(PagineSito::getScopo());

      $container->addPage(PagineSito::getCategorie());

      $container->addPage(PagineSito::getContattaci());

      return $container;

   }

}

------------ 3 -------------

Visto che il menù principale sarà presente in tutte le pagine, ho inserito il richiamo alla classe che lo crea nel bootstrap dell'applicazione, diversamente l'avrei inserito nel controller della pagina da emettere. Siccome il container viene creato in index.php, lo salvo nel registry dell'applicazione.

   //MENU HOME

   $menuHome = new MenuHome();

   //memorizzazione nel registro zend del menu home

   Zend_Registry::set('MenuHome',$menuHome->creaContainer());

------------ 4 -------------

Nel sorgente del layout prima reperisco il container dal registry e poi renderizzo il menù.

<?php

   //Reperimento del container del Menu

   $menuPrincipale = Zend_Registry::get('MenuHome');

?>

<div id="menu_principale">

   <?php

      echo $this->navigation($menuPrincipale)->menu()->render();

   ?>

</div> 

Tutto qua... mi piacerebbe sapere cosa ne pensate:

- Vi sembra una complicazione inutile ?

- C'è qualcosa che si poteva fare diversamente ?

- C'è qualche utilizzo impropio dello Zend o qualche contravvenzione al pattern MVC ?

 :bye:

risposto 7 anni fa
dacdam
X 0 X

Credo che sia una buona implementazione.

Attualmente sto sviluppando un cms usando Zend Framework, e credo che inserirò la possibilità di gestione dei menù tramite pannello di controllo, recuperando i dati della loro configurazione da database.

Pensavo quindi ad una tabella dei containers ed una tabella delle categorie per container ( ho già una tabella gerarchica per la gestione delle categorie ).

Quindi creerò dei metodi nei modelli che recuperino i dati di cui ho bisogno per la creazione dei menù.

L'unico mio dubbio è come gestire la renderizzazione, forse un action helper fa a caso mio, il risultato finale credo sarà qualcosa del tipo:

controller:

$this->view->mymenu = $this->_helper->myMenuHelper('Home'); // ritorna container on pagine per 'Home' menu

view:

echo $this->navigation($this->mymenu)->menu();

Sarà quindi compito di myMenuHelper creare container ed aggiungere pagine al suo interno.

Che ne dite, fattibile?

 

risposto 7 anni fa
Razorblade
X 0 X

Io non ho ancora avuto modo di vedere gli action helper, anche se credo che alla fine siano comunque delle classi.

Premesso questo ed ammesso che siano effettivamente delle classi, credo che vada bene.... alla fine è la stessa soluzione che ho utilizzato io.

Col tuo "action helper" mi fai venire un dubbio: dovrei usare anche io degli helper invece delle classi PagineSito e MenuHome del mio esempio ? In effetti per usare le classi che ho creato ho dovuto sistemare il class_path di php....

risposto 7 anni fa
dacdam
X 0 X

Le tue classi le puoi inserire all'interno della tua libreria, ad esempio My_Navigation_Page, quindi salvata fisicamente in library/My/Navigation/Page.php, dove 'My' puoi sostituirlo con quello che ti pare, e library è la stessa directory dove sono salvate le librerie di Zend Framework.

Se hai settato il loader nel bootstrap che si vada a leggere anche il contenuto della tua libreria non avrai problemi ad istanziare le classi.

Non so però se sia la soluzione migliore, in quanto in quelle posizioni solitamente salvi delle classi che estendano una classe di zend e non classi a se stanti.

Ti consiglio di leggere questi 2 articoli, il primo riguarda gli action helpers, il secondo i controllers plugin:

http://devzone.zend.com/article/3350

http://devzone.zend.com/article/3372

Può darsi che ti aprano la via a nuove soluzioni.

Fammi sapere se trovi problemi.

Ciao

risposto 7 anni fa
Razorblade
X 0 X

In effetti le mie classi le ho inserite all'interno di una libreria apposita. Solo che, non avendo approfondito l'utilizzo del loader, ho dovuto modificare l'include path di php e fare il require delle classi....

Devi sapere che è da poco che studio lo zend, da poco che affronto la programmazione ad oggetti, da poco che provo a sviluppare siti e sto affrontando ora la mia prima applicazione web.... quindi grazie mille degli spunti: approfondisco il loader e vado a leggere gli articoli che mi consigli!

A presto  :bye:

risposto 7 anni fa
dacdam
X 0 X

Credo che sia una buona implementazione.

Attualmente sto sviluppando un cms usando Zend Framework, e credo che inserirò la possibilità di gestione dei menù tramite pannello di controllo, recuperando i dati della loro configurazione da database.

Pensavo quindi ad una tabella dei containers ed una tabella delle categorie per container ( ho già una tabella gerarchica per la gestione delle categorie ).

Quindi creerò dei metodi nei modelli che recuperino i dati di cui ho bisogno per la creazione dei menù.

L'unico mio dubbio è come gestire la renderizzazione, forse un action helper fa a caso mio, il risultato finale credo sarà qualcosa del tipo:

controller:

$this->view->mymenu = $this->_helper->myMenuHelper('Home'); // ritorna container on pagine per 'Home' menu

view:

echo $this->navigation($this->mymenu)->menu();

Sarà quindi compito di myMenuHelper creare container ed aggiungere pagine al suo interno.

Che ne dite, fattibile?

 

E' proprio quello che vorrei fare io!!!  8)

Sono alle prime armi con ZF, mi potresti passare un po di codice che mi illumini la via??? :P

Grazie

risposto 6 anni fa
JellyBelly
X 0 X

Prova a vedere qui:

http://www.zendcasts.com/zend_navigation-dynamically-creating-a-menu-a-sitemap-and-breadcrumbs/2009/06/

è un video tutorial ma mette a disposizione il codice usato.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Prova a vedere qui:

http://www.zendcasts.com/zend_navigation-dynamically-creating-a-menu-a-sitemap-and-breadcrumbs/2009/06/

è un video tutorial ma mette a disposizione il codice usato.

Ciao

Già fatto e non mi ha fatto impazzire come implementazione, visto che io vorrei prendere le informazioni sui diversi moduli dal database e quindi non posso scrivere l'xml! :(

risposto 6 anni fa
JellyBelly
X 0 X

Non ho capito cosa ti manca allora...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Mi ricollego a questo thread poichè anche io sto avendo a che fare con il componente navigation.

Vorrei creare un menù a blocchi i quali siano accessibili in base al permesso. La questione dei permessi la affronterò dopo, adesso mi preme realizzare una struttura di questo tipo:

Home

Amministrazione

-> Eventi

-> Titoli

Gestione

-> Locali

Cassa

-> Acquisto

Dove gli elementi in neretto NON devono essere dei link, ma solo delle descrizioni di questi blocchi. Partendo da questa configurazione con un solo array di pagine (messa in una funzione del bootstrap) ...

(non fate caso ai link sbagliati per alcuni controller)

$pages = array(
                array(
                        'label'         => 'Home',
                        'controller'    => 'index',
                        'action'        => 'index',
                        'order'         => -100 // first page
                ),
                array(
                        'label'         => 'Amministrazione',
                        'controller'    => 'posts',
                        'action'        => 'index',
                        'visible'       => true,
                        'pages'         => array(
                                array(
                                        'label'         => 'Eventi',                                        
                                        'controller'    => 'evento',
                                        'action'        => 'index'
                                ),
                                array(
                                        'label'         => 'Titoli',
                                        'controller'    => 'titolo',
                                        'action'        => 'index'
                                )
                        )
                ),
                array(
                        'label'      => 'Cassa',                     
                        'controller' => 'index',
                        'action'     => 'index',
                        'order'         => -90,
                'pages'         => array(
                                array(
                                        'label'         => 'Acquisto',
                                        'controller'    => 'acquisto',
                                        'action'        => 'index'
                                )
                        ) 
                )
[...]
        );
 
        
        // create container from array
        $navigation = new Zend_Navigation($pages);
        Zend_Registry::set('Zend_Navigation', $navigation);
        $view->navigation($navigation);

..ho provato poi a dividere l'array in più array in base al blocco, istanziando tre oggetti Zend_Navigation e restituendoli alla view, ma così facendo viene visualizzato solo l'ultimo.

Dov'è che sbaglio?

risposto 6 anni fa
uastasi
X 0 X

Credo che la lettura di zend_navigation_container possa aiutarti ad impostare meglio il tuo "navigatore":

http://framework.zend.com/manual/en/zend.navigation.containers.html

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda