-- 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/