Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    Zend: helpers per layout

    Sto leggendo il libro Zend Framework in Action e sono bloccato perchè non riesco a visualizzare correttamente il menù nel layout. Di seguito il codice.

    In pratica vorrei capire come sfruttare i placeholders anche nell'utilizzo del layout.


    application.ini
    Codice PHP:
    resources.frontController.plugins.ActionSetup "Intranet_Controller_Plugin_ActionSetup"
    resources.frontController.plugins.ViewSetup "Intranet_Controller_Plugin_ViewSetup" 
    library/Intranet/Controller/Plugin/ViewSetup.php
    Codice PHP:
    class Intranet_Controller_Plugin_ViewSetup extends Zend_Controller_Plugin_Abstract {
        
        protected 
    $_view;
        
        public function 
    dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
            
            
    $viewRenderer Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
            
    $viewRenderer->init();
            
    $view $viewRenderer->view;
            
    $this->_view $view;
            
            
    $view->originalModule $request->getModuleName();
            
    $view->originalController $request->getControllerName();
            
    $view->originalAction $request->getActionName();
            
    $view->doctype('XHTML1_STRICT');
            
    $prefix 'Intranet_View_Helper';
            
    $dir dirname(__FILE__).'/../../View/Helper';
            
    $view->addHelperPath($dir$prefix);

        }

    layouts/scripts/layout.phtml
    Codice PHP:
    ...
                <?php $this->layout()->menu?>
    ...
    application/modules/default/controllers/IndexController.php
    Codice PHP:
    class IndexController extends Zend_Controller_Action
    {

        public function 
    init()
        {
            
    /* Initialize action controller here */
        
    }

        public function 
    indexAction()
        {
            
    // action body
        
    }

        public function 
    menuAction()
        {
            
            
    $mainMenu = array(
                array(
    'title'=>'Home','url'=>$this->view->url(array(), nulltrue)),
                array(
    'title'=>'Places','url'=>$this->view->url(array('controller'=>'place','action'=>'browse'), nulltrue)),
                array(
    'title'=>'Articles','url'=>$this->view->url(array('controller'=>'articles'), nulltrue))
            );
            
            
            
    $this->view->menu $mainMenu;
            
    $this->_helper->viewRenderer->setResponseSegment('menu');
            
        }



    library/Intranet/Controller/Plugin/ActionSetup.php
    Codice PHP:
    class Intranet_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract {
        
        public function 
    dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
            
            
    $front Zend_Controller_Front::getInstance();
            
            if(!
    $front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
                
                
    $actionStack = new Zend_Controller_Plugin_ActionStack();
                
    $front->registerPlugin($actionStack);
            
            } else {
                
                
    $actionStack $front->getPlugin('Zend_Controller_Plugin_ActionStack');
                
            }
            
            
    $menuAction = clone($request);
            
    $menuAction->setActionName('menu')->setControllerName('index');
            
    $actionStack->pushStack($menuAction);
            
        }


  2. #2
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    A meno che non ne esista una versione più aggiornata di quella che conosco, buona parte del libro ZFiA non è più valido.
    In ogni caso ti consiglio di inizializzare nel file di configurazione le tue risorse, per la view

    codice:
    resources.view.encoding = "UTF-8"
    resources.view.basePath = APPLICATION_PATH "/views/"
    resources.view.helperPath.My_View_Helper = "My/View/Helper"
    [...]
    Puoi vedere in Zend/Application/Resource tutte le risorse che è possibile configurare da file di configurazione.
    Volendo, estendendo Zend_Application_Resource_ResourceAbstract è possibile crearsi le proprie risorse configurabili.
    Possibilmente non usare i plugin per la configurazione.

    Come modello di layout ti consiglio di utilizzare qualcosa del genere

    codice:
    <?php echo $this->doctype(''); ?>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
    <head>
    <?php echo $this->headMeta() ?>
    <?php echo $this->headTitle() ?>
    <?php echo $this->headLink() ?>
    <?php echo $this->headStyle() ?>
    <?php echo $this->headScript() ?>
    </head>
    <body>
    	<div id=wrapper">
    		<?php echo $this->render('header.phtml');?>
    		<?php echo $this->layout()->content;?>
    		<?php echo $this->render('footer.phtml');?>
    	</div>
    	<?php echo $this->inlineScript();?>
    </body>
    </html>
    Il metodo render() renderizza la view script passata a parametro senza dover fare assegnazioni nel controller.
    Puoi avere differenti file di layout in base alle tue esigenze, ed impostare quale richiamare per uno specifico Controller o Controller-Action usando setLayout()

    Codice PHP:
    // in una action 
    $this->_helper->layout()->setLayout('nomelayout'); 
    Per la gestione dei menu usa Zend_Navigation, è configurabile da file XML e genera automaticamente un menù o una breadcrumbs.

    Se hai costruito a mano l'albero dell'applicazione ti consiglio di provare anche l'autogenerazione di un progetto 'hello world' utilizzando Zend_Tool.

    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Intanto grazie delle risposte, trovo difficoltà a reperire informazioni valide in quanto sembra che ognuno abbia un approccio diverso e poi in rete si trovano guide e tutorial più che altro per versioni vecchie del framework. Anzi se ha dei consigli su risorse aggiornate ben vengano.

    Veniamo a noi:

    Per il layout ero quasi arrivato ad una cosa simile alla tua leggendo diversi post. Ma nel tuo caso ho ancora un paio di domande:

    1) Con setLayout posso scegliere un layout al volo. Ma per assegnare quello di default immagino basterà configurarlo in application.ini giusto?
    2) Leggo: inlineScript: questa riga se non ricordo male serve a portare dentro il codice javascript?

    In effetti ho molti dubbi anche su javascript. Con headScript carico le librerie (ad es. jQuery) però mi sfugge dove piazzare il codice javascript per le singole pagine.

    Quando scrivo codice procedurale alla fine del file utilizzo il caricamento di un file esterno .js che si trova nella stessa cartella. Ma in un progetto ZF come lo carico? In quale cartella salvo i files .js (nella cartella public ho la cartella js con le librerie ma i singoli files per le singole view dove vengono messi?).

    3) Per i menù in realtà io ho una database dove ho le diverse pagine con id e con le relative autorizzazioni per i diversi utenti. Per cui devo costruirla tramite lettura da db. E' sempre valido l'utilizzo di Zend_Navigation in questo caso? Considera che anche per l'autenticazione ora vorrei imparare ad utilizzare auth e acl di ZF.

    Sì ho utilizzato Zend_tool fino dall'inizio e lo trovo molto comodo.

    Grazie e scusa le mille domande ma sono appena all'inizio.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Per la precisione per quanto riguarda il layout ho seguito questa guida:

    http://survivethedeepend.com/zendfra...erface.library

    che mi sembra abbastanza aggiornata rispetto ad altre.

    Inoltre un'altra cosa che mi sfugge è il motivo per cui conviene mettere in application.ini informazioni come doctype, meta, css e richiamarli dopo con i vari echo $this->rispetto a metterle direttamente nella pagina layout.phtml nel classico modo.

  5. #5
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    cerco di rispondere alle tue domande punto per punto

    1) Esatto, il layout di default lo puoi configurare usando la risorsa layout dell'application.ini

    2) Utilizzo inline script in fondo in modo tale da avere la possibilità di aggiungere file e script js al fondo della pagina, in modo tale da non appesantire il caricamento del DOM.
    Il js puoi salvarlo nella posizione che hai specificato ( public/js ), i files puoi caricarli utilizzando gli appositi viewHelpers, headScripts o InlineScripts http://framework.zend.com/manual/en/...mplementations .

    Il consiglio che ti do sul js è di non scrivere milioni di righe in maniera procedurale che poi sono difficili da mantenere. Meglio scrivere plugin di jQuery o oggetti che si occupino di fare qualcosa di specifico.

    3) Puoi benissimo utilizzare una gestione db che generi un xml ( o anche un array ) che tu possa passare 'in pasto' a Zend_Navigation. Hai fatto bene a tirare fuori il discorso autenticazione e autorizzazione, in quanto ad ogni singolo link del navigation puoi attribuire un nome risorsa a cui puoi assegnare dei permessi specifici in base al gruppo utente.
    Sarà poi Navigation che si occuperà di renderizzare o meno il link nel menù in base all'utente.
    Inoltre Zend_Navigation, come Zend_Form, utilizza internamente Zend_Translator, se configurato, per localizzare i testi in base al locale dell'utente.
    Prima di fare ciò però dovresti vedere come si gestiscono Zend_Locale, Zend_Translate e l'ACL in ZF.

    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    2) Ok, però mi aspettavo un posizionamento più logico associato alle view dei relativi files js. Mi spiego: se ho 50 view avrò allo stesso modo avrò 50 files .js associati e non mi piace molto l'idea di aver tutto in un'unico calderone.
    Non so come fai tu o come si usa però credo che utilizzerò almeno una logica del tipo public/js/controller/nome_view.js

    Per l'InlineScript ero proprio partito dalla pagina da te indicata, che però mi sembra abbia una spiegazione veramente povera sul suo utilizzo. Cercherò comunque esempi in rete

    Inoltre per questa domanda sai darmi una motivazione?
    Inoltre un'altra cosa che mi sfugge è il motivo per cui conviene mettere in application.ini informazioni come doctype, meta, css e richiamarli dopo con i vari echo $this->rispetto a metterle direttamente nella pagina layout.phtml nel classico modo.
    3) Ho già fatto qualcosina (al momento mi interessa capire come sfruttarlo solo per creare il menù partendo dall'xml, poi mi occuperò di auth e acl, mentre translator quasi sicuramente non lo userò) però ovviamente ho già dei dubbi.

    Da quello che ho capito non è possibile fare un rendering particolare (aggiungere icone, ecc.) direttamente con Navigation pertanto devo passare tramite un Partial.
    Inoltre avendo in 2 porzioni diverse di layout.phtml il menù e il submenu lo spezzo in fasi. Questo il codice:

    layout.phtml
    Codice PHP:
        
        <div id="nav"><div class="container_12">
            
            <ul>
                <?php
                $partial 
    = array('menu.phtml''default');
                
    $this->navigation()->menu()->setPartial($partial);
                echo 
    $this->navigation()->menu()->render();
            
    ?>
            [/list]
            
        </div></div>
        
        
        
        <div id="sub-menu"><div class="container_12">

            <ul id="sub-menu" class="float-left">
                <?php 

                $partial 
    = array('submenu.phtml''default');
                
    $this->navigation()->menu()->setPartial($partial);
                echo 
    $this->navigation()->menu()->render();
                
    ?>[/list]
        
        </div></div>
    menu.phtml

    Codice PHP:
    foreach ($this->container as $page) {     echo '[*][url="' $page->href '"]' $page->label '[/url]'PHP_EOL; } 
    submenu.phtml

    Codice PHP:
    $html = array();

    foreach (
    $this->container as $page
    {
        
    //$html[] = "[*]";
        //$html[] = $this->menu()->htmlify($page) . PHP_EOL;

        
    if (!empty($page->pages))
        {
            
    //$html[] = "<ul>";
            
    foreach ($page->pages as $subpage
            {
                
    $html[] = '<li class="float-left margin-right">';
                if (
    $href $subpage->getHref()) $html[] = "<a class=\"button\" href=\"{$href}\">";
                else 
    $html[] = "<span>";
                
    $html[] = "<img src=\"/images/icons/fugue/" .$subpage->icon ."\" alt=\"\"/>";
                
    $html[] = $subpage->getLabel();
                if (
    $href$html[] = "</a>";
                else 
    $html[] = "</span>";            
                
    $html[] = "";
            }
            
    //$html[] = "[/list]";
        
    }

        
    //$html[] = "";
    }

    echo 
    join(PHP_EOL$html); 
    bootstrap.php

    Codice PHP:
        protected function _initNavigation()
        {
            
    $this->bootstrap('layout');
            
    $layout $this->getResource('layout');
            
    $view $layout->getView();
            
    $config = new Zend_Config_Xml(APPLICATION_PATH '/configs/navigation.xml''nav');
            
            
    $navigation = new Zend_Navigation($config);
            
    $view->navigation($navigation);
        
        } 
    Così funziona però:

    - mi rende comunque tutto il sub-menu a prescindere dalla pagina di menu in cui sono (lo dovrebbe fare Navigation oppure in submenu.phtml dovrei aggiungere un controllo per verificare in quale pagina sono? Che poi controllerò con ACL?)

    - allo stesso modo nel menù principale vorrei aggiungere la classe alla pagina selezionata <li class="current"> per evidenziare la sezione e nel submenu <a class="selected"> per evidenziare la pagina corrente

    Non so se l'approccio che ho utilizzato è 'corretto' oppure ho scritto una schifezza...

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Aggiungo ancora una richiesta:

    4) Fino ad ora ho sempre caricato js e css tramite un'app che riduce le richieste e comprime i files, per alleggerire il flusso:

    http://code.google.com/p/minify/

    Ora l'utilizzo di questo sistema riimane valido con ZF e la sua struttura oppure non ha più senso utilizzarlo?

  8. #8
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    punto per punto:

    2) per il javascript puoi usare l'approccio che più ti piace, però non mi pare una buona idea separare il js a quel modo ( controller/view ), in quanto probabilmente parte delle funzionalità saranno condivise, e FORSE ti ritroveresti a scrivere le stesse cose + volte per poi doverle modificare una volta per ogni file.
    Quello che ti consigliavo io era creare degli oggetti che gestissero ognuno una specifica parte, magari come plugin.

    Perchè specificare alcune configurazioni della view come ad esempio il doctype nel file application ini o nel bootstrap e non scriverli direttamente nel layout?
    Perchè in questo modo hai il totale controllo e se necessario, modificare, sostituire o rimuovere del tutto quei valori.
    La configurazione della view che ho nell'application.ini di solito è questa

    codice:
    resources.view.encoding = "UTF-8"
    resources.view.basePath = APPLICATION_PATH "/views/"
    resources.view.doctype = "XHTML1_STRICT"
    resources.view.contentType = "text/html; charset=UTF-8"
    resources.view.enabled = 1
    resources.view.helperPath.My_View_Helper = "My/View/Helper" // view helper path per il namespace 'My', solo per esempio
    3) La questione qui è lunga, ti consiglio di cercare delle guide in giro e di fare molti tentativi, senza usare uno specifico partial la classe "active" per la pagina corrente compare già senza fare nessuna particolare configurazione.

    Ciao

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.