yAnTar
yAnTar

Reputation: 4610

View helper is accessible in one controller, but not accessible from another

I have a little strange situation. I have view, from this view I execute my view helper "convertingText". This view helper (FR_View_Helper_ConvertingText.php) are locate in folder FR/View/Helper

No problem, helper works.

I created 404 page. This is not simple html page. This page are similar to main page - we output some items from database. I copied part of view in new view and I have problem convertingText view helper aren't loaded.

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'ConvertingText' in /var/www/framework/zend/library/Zend/Controller/Plugin/Broker.php on line 336

Zend_Loader_PluginLoader_Exception: Plugin by name 'ConvertingText' was not found in the registry; used paths:
Zend_View_Helper_: Zend/View/Helper/:../application/views/helpers/:/var/www/current/application/modules/default/views/helpers/ in /var/www/framework/zend/library/Zend/Loader/PluginLoader.php on line 422

On Bootstrap.php we have lines with adding folder for loading helper

$view->addHelperPath("FR/View/Helper", "FR_View_Helper");

I debugged and output paths from method load class Zend_Loader_PluginLoader And on main page I have different paths (for loading plugins) from paths on 404 page.

On main page I have these paths

/var/www/current/modules/movies/views/helpers/ConvertingText.php
FR/View/Helper/ConvertingText.php

On 404 page I have these paths

/var/www/current/application/modules/movies/views/helpers/ConvertingText.php
/var/www/current/application/modules/default/views/helpers/ConvertingText.php
../application/views/helpers/ConvertingText.php
Zend/View/Helper/ConvertingText.php

And one strange issue, if I add line

$view->convertingText('', '');

after line

$view->addHelperPath("FR/View/Helper", "FR_View_Helper");

in Bootstrap.php - view helper convertingText works on 404 page.

Why is so behaviour ?

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath("DR/View/Helper", "DR_View_Helper");
    $view->addHelperPath("FR/View/Helper", "FR_View_Helper");

    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));

    Zend_Registry::set('view', $view);

    return $view;
}

Upvotes: 1

Views: 288

Answers (3)

yAnTar
yAnTar

Reputation: 4610

I found the problem, why view helper was unaccesible.

Paths to helpers are overrided. I found this code in one Plugin.

$this->view = Zend_Registry::get('view');
$this->view->setBasePath('../application/views/');

Executing method setBasePath overrided paths to my helpers.

Upvotes: 0

ARIF MAHMUD RANA
ARIF MAHMUD RANA

Reputation: 5166

Try this I think a trailing slash(/) and underscore(_) may be creating problem

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath($path . "/DR/View/Helper/", "DR_View_Helper_");//Add $path
    $view->addHelperPath($path . "/FR/View/Helper/", "FR_View_Helper_");//Add $path

    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));

    Zend_Registry::set('view', $view);

    return $view;
}

Upvotes: 0

Tim Fountain
Tim Fountain

Reputation: 33148

The different paths are probably dependent on which module you're in. You should use an absolute path for the view helper path, then you won't have this problem:

$view->addHelperPath(APPLICATION_PATH."/../FR/View/Helper", "FR_View_Helper");

(update as required.)

ZF reuses helper classes it's already loaded, so $view->convertingText('', ''); fixes it because then the helper is loaded before the module changes.

Edit: Try this for your init view method:

protected function _initView()
{
    $view = new Zend_View();
    $view->addHelperPath("ZendX/JQuery/View/Helper", "ZendX_JQuery_View_Helper");
    $view->addHelperPath(APPLICATION_PATH."/../DR/View/Helper", "DR_View_Helper");
    $view->addHelperPath(APPLICATION_PATH."/../FR/View/Helper", "FR_View_Helper");

    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
    $viewRenderer->setViewScriptPathSpec(":controller/:action.:suffix");
    $stack = Zend_Controller_Action_HelperBroker::getStack();
    $stack->push($viewRenderer);

    Zend_View_Helper_PaginationControl::setDefaultViewPartial(array('pagination.phtml','default'));

    Zend_Registry::set('view', $view);

    return $view;
}

Upvotes: 1

Related Questions