What I do is to treat the HEAD as a separate View in it's self, so you can
use either a common template for site wide, or a more specific template for
any given request.

Thus, I can add Javascript, Meta Tags etc on demand, without effecting the
rest of the system. On another note, I think it's a bad idea,
architecturally, to be dependent on using plugins to aid in your output
generation.

The functionality and facilities should already be there, available in a
lower layer.


Matthew Weier O'Phinney-3 wrote:
> 
> -- Dale McNeill <[EMAIL PROTECTED]> wrote
> (on Tuesday, 27 March 2007, 09:19 AM -0500):
>> I've got some CSS and javascript that I would like to dynamically add to 
>> the HTML header depending on the controller/action.  I would like to be 
>> able to append information like appending to the response body.  Then 
>> use this information in a site wide template.  The only solution that 
>> comes to mind is using a view variable and having each controller/action 
>> get the variable, append it, and write it back to the view.  Is there 
>> some functionality that I might be overlooking? - Thanks
>> 
>> Site wide template:
>> <html>
>> <head>
>> <title> <?php echo $this->title; ?> </title>
>> <?php echo $this->dynamic_header; ?>
> 
> Define $dynamic_header as an array in the view object. When you first
> initialize the view object, do something like this:
> 
>     $view = new Zend_View();
>     $view->dynamic_header = array();
> 
> Then, whenever you want to add to it, just add a new element to the
> array:
> 
>     $view->dynamic_header[] = '<meta name="keywords" value="zend framework
> zend_view" /> ';
> 
> Then, in the view script, iterate over the array:
> 
>     <?php foreach ($this->dynamic_header as $header): 
>             echo $header, "\n";
>     endforeach; ?>
> 
> Finally, use a Two Step View as I've outlined previously in this thread
> -- use a dispatchLoopShutdown() plugin to throw the response body into a
> sitewide template (which it looks like you're doing here).
> 
>> </head>
>> <body>
>> ...common header...
>> <?php echo $this->content; ?>
>> ...common footer...
>> </body>
>> </html>
>> 
>> Matthew Weier O'Phinney wrote:
>> > -- Arnaud Limbourg <[EMAIL PROTECTED]> wrote
>> > (on Monday, 26 March 2007, 07:04 AM +0200):
>> >  
>> > > Matthew Weier O'Phinney wrote:
>> > >    
>> > > > 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'));
>> > > >       }
>> > > >   }
>> > > >      
>> > > Which poses a problem when you want to send back json (or whatever)
>> and 
>> > > you don't want a site wide template :)
>> > >    
>> >
>> > This was a simple example. But it's actually really easy to return
>> JSON:
>> >
>> >    public function dispatchLoopShutdown()
>> >    {
>> >        // assume that we've already determined the request is ajax
>> >        $request  = $this->getRequest();
>> >        $response = $this->getResponse();
>> >        $view     = Zend_Registry::get('view');
>> >
>> >        if ($request->getParam('isAjax', false)) {
>> >            // Ajax request detected
>> >            // Get any variables set in the view
>> >            $vars = get_object_vars($view);
>> >
>> >            // Merge with named path segments in response
>> >            $vars = array_merge($vars, $response->getBody(true));
>> >
>> >            // Create a header and set the response body to a JSON value
>> >            $resposne->setHeader('Content-Type', 'text/x-json');
>> >            $response->setBody(Zend_Json::encode($vars));
>> >            return;
>> >        }
>> >
>> >        // Otherwise, process as normal
>> >        $view->content = $response->getBody();
>> >        $response->setBody($view->render('site.phtml'));
>> >    }
> -- 
> Matthew Weier O'Phinney
> PHP Developer            | [EMAIL PROTECTED]
> Zend - The PHP Company   | http://www.zend.com/
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Controller-and-View-Question-tf3462561s16154.html#a11596858
Sent from the Zend Framework mailing list archive at Nabble.com.

Reply via email to