« Return to Thread: Controller and View Question

Re: Controller and View Question

by fred wolf :: Rate this Message:

Reply to Author | View in Thread

Matthew Weier O'Phinney a écrit :

> -- Ralph Schindler <ralph@...> wrote
> (on Sunday, 25 March 2007, 09:37 AM -0500):
>  
>>   I am curious how everyone implements common headers and footers
>> within a given application.  As I see it there are two methods:
>>
>> a) include the header and footer in each view script via the
>> $this->render(..) routine.
>>
>> b) use Zend_Controller Plugins to write to the view a standard header
>> and footer to the view body at preDispatch() postDispatch() /
>> preRouteStartup / postRouteStartup times.
>>
>> Both methods have their pros and cons..
>>
>> In method a) you are required to handle it in every script, which can be
>> tedious.  But it allows you flexibility to not include the common header
>> and footer blanketly on all requests when it makes sense not to include it.
>>
>> Method b) writes headers and footers on all requests, unless I am
>> missing something.  The benefit is that you can write specific
>> controller/action scripts and they can be completely autonomous from the
>> rest of the application.
>>
>> I like method b), but I wonder:  Are there ways to inject (or callback)
>> to write specific controller/action needed headers to the common header,
>> for example, adding a page specific JS script to a pages <head>.  Are
>> there ways that a specific controller/action can choose not to use a
>> header/footer dispatched previously?
>>    
>
> I throw a Zend_View object in the registry, and then access this from my
> controllers and plugins. The benefit of doing this is that the
> controllers can set values in the view that are unused in their
> individual view, but used later in the sitewide template.
>
> Then, I use a dispatchLoopShutdown() plugin to inject any generated
> content into a sitwide template:
>
>
>     class SiteTemplatePlugin extends Zend_Controller_Plugin_Abstract
>     {
>         public function dispatchLoopShutdown()
>         {
>             $response = Zend_Controller_Front:;getInstance()->getResponse();
>             $view = Zend_Registry::get('view');
>             $view->content = $response->getBody();
>             $response->setBody($view->render('site.phtml'));
>         }
>     }
>
> Any other variables you've set in your template object to this point are
> also available, not just $content. As a result, you could in your action
> controllers specify additional values:
>
>     public function formAction()
>     {
>         // Set the sitewide template's $pageTitle element
>         $this->view->pageTitle = 'Login Form';
>
>         $this->render();
>     }
>
> By doing the sitewide template at the end, instead of doing a header in
> the preDispatch() and footer in the postDispatch(), you can affect the
> entire layout of the page, and also chain together several actions to
> build the final page.
>
>  
Is it possible to imagine to throw a Zend_View object in the Response
object instead of the registry. The view object would still available in
the controllers.
What do you think ?
I don't even know why I would like to not throw the view object in the
registry, :) but may be it could be easier to combine data content,
vairaibles  and templates if  the view object and  the  response one
are  tied together.

 « Return to Thread: Controller and View Question