Hi Hector,
Thanks for the response. If I'm understanding you correctly, you're
suggesting I do something like this:
class ErrorController extends Zend_Controller_Action
{
/**
* @return void
*/
public function errorAction()
{
// Snipped code...
$this->renderScript( '../error/error.tpl.php' );
}
}
There are two issues with this, though: 1) it requires disabling LFI
protection, and 2) with LFI protection disabled, it works in the case of
modules (e.g. /module-name/foo), but breaks when routing errors occur in the
default module (e.g. /foo).
Thanks again,
Ryan
On Fri, Feb 18, 2011 at 4:27 PM, Hector Virgen <[email protected]> wrote:
> In your error controller, at the end of the errorAction() method, make a
> call to $this->renderScript() and pass in a relative path to your error
> script template -- "relative" as in relative to one of your view script
> paths. I hope this helps!
>
> --
> *Hector Virgen*
> Sr. Web Developer
> http://www.virgentech.com
>
>
>
> On Fri, Feb 18, 2011 at 12:14 PM, Ryan Lange <[email protected]>wrote:
>
>> In an application that I'm creating, I have the need to have all view
>> scripts (including those for modules) in a non-standard directory, as well
>> as change the default extension. The relevant directory structure would
>> look
>> like this:
>>
>> <base path>/
>> application/
>> modules/
>> ModuleName/
>> public/
>> Templates/
>> zf-views/
>> module-name/
>> index/
>> index.tpl.php
>> error/
>> error.tpl.php
>>
>> I've decided to use a controller plugin to do this globally:
>>
>> <?php
>>
>> class Emg_Plugin_View extends Zend_Controller_Plugin_Abstract
>> {
>> /**
>> * @var Zend_Controller_Action_Helper_ViewRenderer
>> */
>> protected $_view_renderer;
>>
>> /**
>> * Sets the view script extension and the base script path before
>> routing
>> * occurs.
>> *
>> * This is done so that, if there's a routing error (e.g. invalid
>> module,
>> * controller, or action), the view script for the error controller can
>> be
>> * found.
>> *
>> * We can't check for the requested module and adjust the path
>> accordingly
>> * because that information hasn't been extracted from the requested
>> URI
>> at
>> * this point.
>> *
>> * @param Zend_Controller_Request_Abstract $request
>> * @return void
>> */
>> public function routeStartup( Zend_Controller_Request_Abstract $request
>> )
>> {
>> $this->_getViewRenderer()->setViewSuffix( 'tpl.php' );
>> $this->_getView()->setScriptPath( PUBLIC_PATH .
>> '/Templates/zf-views' );
>> }
>>
>> /**
>> * Adjusts the script path for modules.
>> *
>> * @param Zend_Controller_Request_Abstract $request
>> * @return void
>> */
>> public function dispatchLoopStartup( Zend_Controller_Request_Abstract
>> $request )
>> {
>> if( 'default' != $request->getModuleName() ) {
>> $this->_getView()->setScriptPath( PUBLIC_PATH .
>> '/Templates/zf-views/' . $request->getModuleName() );
>> }
>> }
>>
>> /**
>> * @return Zend_Controller_Action_Helper_ViewRenderer
>> */
>> protected function _getViewRenderer()
>> {
>> if( null === $this->_view_renderer ) {
>> $this->_view_renderer =
>> Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' );
>> }
>>
>> return $this->_view_renderer;
>> }
>>
>> /**
>> * @return Zend_View_Interface
>> */
>> protected function _getView()
>> {
>> return $this->_getViewRenderer()->view;
>> }
>> }
>>
>> The problem I'm running into is that if a non-existent controller or
>> action
>> is requested in the ModuleName module (let's say /module-name/foo), I get
>> the following exception:
>>
>> Fatal error: Uncaught exception 'Zend_View_Exception' with message 'script
>> 'error/error.tpl.php' not found in path (<base
>> path>/application/views/scripts/:<base
>> path>/htdocs/Templates/zf-views/module-name/)' in <base
>> path>/library/Zend/View/Abstract.php:980
>> Stack trace:
>> #0 <base path>/library/Zend/View/Abstract.php(876):
>> Zend_View_Abstract->_script('error/error.tpl...')
>> #1 <base
>> path>/library/Zend/Controller/Action/Helper/ViewRenderer.php(898):
>> Zend_View_Abstract->render('error/error.tpl...')
>> #2 <base
>> path>/library/Zend/Controller/Action/Helper/ViewRenderer.php(919):
>>
>> Zend_Controller_Action_Helper_ViewRenderer->renderScript('error/error.tpl...',
>> NULL)
>> #3 <base
>> path>/library/Zend/Controller/Action/Helper/ViewRenderer.php(958):
>> Zend_Controller_Action_Helper_ViewRenderer->render()
>> #4 <base path>/library/ in <base path>/library/Zend/View/Abstract.php on
>> line 980
>>
>> Not surprisingly, given the code above, it's trying to look for the error
>> view script in ModuleName's view script path. What I need to do is, in
>> dispatchLoopStartup(), forgo updating the script path with the module name
>> if there's been a routing error. I'm just not sure how to go about that.
>> I've tried both of the following if conditions...
>>
>> if( 'default' != $request->getModuleName() && 'error' !=
>> $request->getControllerName() ) {
>>
>> ...and...
>>
>> if( 'default' != $request->getModuleName() && null === $request->getParam(
>> 'error_handler' ) ) {
>>
>> ...but neither have solved my problem.
>>
>> Any help would be appreciated. Any suggestions on how to handle the
>> situation in general more elegantly would also be appreciated. ;o)
>>
>>
>> Thanks,
>> Ryan Lange
>>
>
>