Hi!

I have the following files:

application/controllers/CrudController.php (abstract class with methods list, show, edit...)
application/views/scripts/crud/list.phtml (templates for CrudController)
application/views/scripts/crud/show.phtml
...

application/controllers/FooController.php (extends CrudController)
application/modules/a/controllers/FooController.php (extends CrudController) application/modules/b/controllers/BarController.php (extends CrudController)

I want all of these non-abstract controllers to use templates from the abstract one, since I don't want to have 10 copies of the templates for generic item listing, etc.

How can I achieve this?

By default, ViewRenderer will try to render, for example
  application/modules/b/views/scripts/foo/list.html
instead of the "generic"
  application/views/scripts/crud/list.html

I have found 2 approaches so far, but both have problems:

A)
In init() of the abstract CrudController:
$this->_helper->viewRenderer->setViewBasePathSpec(Bootstrap:: $root.'/application/views'); $this->_helper->viewRenderer- >setViewScriptPathSpec('crud/:action.:suffix');
    $this->_helper->viewRenderer->initView();

This will work, but the problem is that when an action is redirected, the ViewRenderer is all messed up. For example, if an error ocurrs, it will try to render crud/error.phtml instead of error/error.phtml.

I could do pre/postDispatch magic here, bit it seems dirty.

B)
Also in init of the abstract CrudController:
    $request = $this->getRequest();
    $request->setModuleName('default');
    $request->setControllerName('crud');
    $this->_helper->viewRenderer->initView();

This will make the view render properly, but will mess up a whole bunch of other things, such as URLs generated with the url helper that don't reset the params.


Any suggestions on how I can achieve this behavior (one set of view scripts for many controllers)?

Best regards,
 Jaka Jancar
 Slovenia

Reply via email to