-- Martin Carpentier <[EMAIL PROTECTED]> wrote
(on Thursday, 29 March 2007, 05:09 PM +0200):
> That's exactly the kind of elegant solution I was looking for.
> Thanks for your fast reply.
> 
> I still have a little problem though.
> Unless I misundersood something, when I put
> 
>     // rendering /application/default/views/scripts/_menu.phtml
>     $this->render('_menu', null, true);
> 
> in /application/default/views/scripts/index/index.phtml
> 
> I get a fatal error:
> 
> Fatal error: Uncaught exception 'Zend_View_Exception' with message 'script
> '_menu' not found in path' in 
> C:\Eclipse\e-workspaces\mcarpentier\SIMON\library
> \Zend\View\Abstract.php:595 Stack trace: #0

It appears that render() didn't append the script suffix (by default,
.phtml). Did you override the render() method, by any chance?

Also, can you verify that _menu.phtml exists somewhere in the view
script path you specified? (just want to rule out all possibilities).

> (After looking the documentation, I found out $noController need to be set to
> true in order to get the behavior you described)

Oops! My bad! Yes, it needs to be set to true -- i.e., $noController ==
true. 

> Can you see what's wrong in what I try to do ?
> 
> 
> Also, on a side note regarding my other inquiry, where would be good place to
> put the siteView scripts (as "best practice") ?
> 
> I can see some options:
> 
> 1) placing them in the default module views/scripts folder. This feels a bit
> awkward since the script are not specific to the module

My site architecture usually looks like this:

    application/
        controllers/
        models/
        views/
            scripts/
            helpers/
            filters/
        modules/
            ...

and I set the 'default' module to point to application/controllers. To
my mind, the 'default' module is for general purpose site functionality
-- user login, static content, etc. -- so having sitewide scripts in
that folder makes sense to me. More below, though...

> 2) placing them in /application/views. Seems like a good idea to me but I find
> annoying to mix module folders with other folder like config, views, etc.

However, I have also done this, and think it's perfectly appropriate.
The top level application directory implies that these are items that
will be used site-wide -- configuration files, general purpose view
scripts (and sitewide templates) and helpers, etc. One layout I did this
way looked like:

    application/
        config/
        data/
        lib/
        modules/
            default/
                controllers/
                models/
                views/
            .../
        views/

which presented a very nice layout.

I know Gavin is working on a tutorial that addresses some of these
issues -- don't have the URLs off-hand, but he posted them in the past
day or two to either the fw-mvc or fw-general list.

> On 3/29/07, Matthew Weier O'Phinney <[EMAIL PROTECTED]> wrote:
> 
>     -- Martin Carpentier <[EMAIL PROTECTED] > wrote
>     (on Thursday, 29 March 2007, 02:48 PM +0200):
>     > I'm currently in the process of upgrading our application to ZF 0.9.1
>     from 0.8
>     > . So far it's going smoothly and I took the oportunity to convert to a
>     > Conventional Modular for convenience and because since the application 
> is
>     an
>     > intranet, it will eventually includes a lot of different modules.
>     >
>     > So I based the directory structure on what's described here Conventional
>     > Modular Layout to have something that looks like this:
>     >
> 
>     <snip -- directory layout>
> 
>     > In the bootstrap I correctly set the controller directories with:
>     >
>     > $controller = Zend_Controller_Front::getInstance();
>     > $controller->throwExceptions(true)
>     >                ->setControllerDirectory(array(
>     >                    'default' => '../application/default/controllers',
>     >                    '(module x)' => '../application/(module x)/
>     controllers'))
>     >                ->setParam('config', $config);
>     >
>     >
>     > With that setup I can simply use this in the default controller:
>     >
>     >     function init()
>     >     {
>     >         $this->initView();
>     >         $this->view->config = $this->getInvokeArg('config');
>     >         $this->view->baseUrl = $this->_request->getBaseUrl();
>     >     }
>     >
>     >     function indexAction()
>     >     {
>     >         $this->view->title = 'title';
>     >
>     >         $this->view->actionTemplate = '_menu.phtml';
>     >         $this->render();
>     >     }
>     >
>     > Which will render the view script in /application/default/views/scripts/
>     > index.phtml in wich the file _menu.phtml is called with <?php echo
>     $this->
>     > render($this->actionTemplate); ?> .
>     >
>     > What I'm wondering is where would be a good place to put the site wide
>     view
>     > scripts such as _menu.phtml (also think header/footer scripts) and what
>     would
>     > be the best way to use them inside the modules controller ?
> 
>     initView() uses setScriptPath() to set the view script path. I'd suggest
>     that in your init() method, you also add one or more additional script
>     paths -- one for templates common to your entire site:
> 
>         function init()
>         {
>             $this->initView();
>             $this->view->config = $this->getInvokeArg('config');
>             $this->view->baseUrl = $this->_request->getBaseUrl();
>             $this->view->addScriptPath($this->getInvokeArg('siteViewPath'));
>         }
> 
>     Additionally, assuming you have this structure in your modules:
> 
>         moduleName/
>             views/
>                 scripts/
>                     <controller>/
>                     <controller>/
> 
>     Then you could also put module-wide templates directly under the
>     scripts/ subdirectory; these can be called using render and passing
>     false to the third argument ($noController):
> 
>         // render _menu.phtml in moduleName/views/scripts/
>         $this->render('_menu', null, false);
> 
>     Two notes:
> 
>         * Passing in false for $noController would also allow specifying
>           subdirectories: $this->render('shared/_menu', null, false)
>         * If you register additional script paths with the view object, it
>           will search through them until it finds (or doesn't find) the
>           requested view script. So, the above examples could also look in
>           the siteViewPath as registered in the init() example above

-- 
Matthew Weier O'Phinney
PHP Developer            | [EMAIL PROTECTED]
Zend - The PHP Company   | http://www.zend.com/

Reply via email to