Zend: Где/как я могу зарегистрировать специальные помощники вида?

В моем файле layout.phtml у меня есть:

<?php echo $this->Test(); ?>

Я создал помощник Test view в application/views/helpers/Test.php

<?php 

class My_View_Helper_Test extends Zend_View_Helper_Abstract {

    public function Test() {
        return 'test';
    }

}

И мой файл конфигурации @ configs/application.ini:

resources.view[] = ''
resources.view.helperPath = APPLICATION_PATH "/views/helpers"

Ошибка:

Zend_Loader_PluginLoader_Exception: Плагин по имени "Тест" не найден в реестра; используемые пути: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/in /usr/share/php/Zend/Loader/PluginLoader.php в строке 406

В аналогичной заметке я не могу зарегистрировать помощник для просмотра admin...

resources.view.helperPath.Admin_View_Helper = APPLICATION_PATH "/modules/admin/views/helpers"

Мой modules/admin/views/helpers/AdminPanel.php:

<?php

class My_View_Helper_AdminPanel extends Zend_View_Helper_Abstract {

public function AdminPanel() { return 'test'; }

}

У меня нет выбора, кроме как сделать это в Bootstrap с помощью addHelperPath? Если бы кто-нибудь мог продемонстрировать, как я буду использовать мои пути?

Ответ 1

Использование application.ini, вероятно, лучший способ их определить. Я помещал все мои помощники вида в свою библиотечную папку:

includePaths.library = APPLICATION_PATH "/../library"
autoloadernamespaces.0 = "SNTrack_"

;  -- Note, these are the only resources.view lines I have...
resources.view.doctype = "XHTML1_STRICT"
resources.view.helperPath.SNTrack_View_Helper = APPLICATION_PATH "/../library/SNTrack/View/Helper"

Структура каталогов:

/
  application/
  library/
    SNTrack/
      View/
        Helper/
          Test.php

Вид:

 $this->test('test')

SNTrack/View/Helper/test.php:

 class SNTrack_View_Helper_Test extends Zend_View_Helper_Abstract {
   public function test($args) { return $args; }
 }

Ответ 2

в моем бутстрапе:

$view = new Zend_View();
$view->addHelperPath(DE_Config::get('DE_appDir').DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'DE'.DIRECTORY_SEPARATOR.'View'.DIRECTORY_SEPARATOR.'Helper'.DIRECTORY_SEPARATOR, 'DE_View_Helper');
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

Ответ 3

У меня просто была эта точная проблема, и я понял, что это связано с проблемой в моей начальной загрузке: я определял и использовал новый объект Zend_View в одной из своих функций _init, что, по-моему, переписывало все мои другие параметры представления из обоих мой загрузочный файл и мой файл application.ini(включая мое определение resource.view.helperPath). Оскорбительный код был вслепую скопирован из здесь и помещен в функцию _initJQuery() в моей начальной загрузке, которая выглядела так:

protected function _initJQuery() {
   $view = new Zend_View();
   $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper');

   $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
   $viewRenderer->setView($view);
   Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
}

Решением было заменить первую строку ($ view = new Zend_View()) следующим образом:

$this->bootstrap('view');
$view = $this->getResource('view');

Еще одна вещь, которую нужно учитывать в отношении вашей линии:

resources.view.helperPath = APPLICATION_PATH "/views/helpers"

Обратите внимание, что это только регистрирует путь, а не префикс класса, поэтому это будет работать, только если классы-помощники имеют префикс класса Zend по умолчанию Zend_View_Helper, то есть Zend_View_Helper_Test. Если вы хотите, чтобы класс был My_View_Helper_Test, вам нужно сделать это:

resources.view.helperPath.My_View_Helper = APPLICATION_PATH "/views/helpers"