Вопрос по zend-framework – Zend: Где / как я могу зарегистрировать пользовательские помощники вида?

10

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

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

Я создал вспомогательный тестовый вид на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: плагин с именем «Test» не был найден в реестре; используемые пути: Zend_View_Helper_: Zend / View / Helper /:./ views / helpers / in /usr/share/php/Zend/Loader/PluginLoader.php в строке 406

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

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? Если так, то может ли кто-нибудь продемонстрировать, как я буду использовать свои пути?

в первом случае вы можете добавить префикс в этот helperPath ...resouces.view.helperPath.My_View_Helper = gnarf
Также:resources.view[] = '' не имеет смысла в качестве директивы INI, это может быть с вами возиться ... gnarf

Ваш Ответ

3   ответа
13

С помощью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; }
 }
@meder - вы должны быть в состоянии удалить все элементы doctype / encoding / etc из начальной загрузки все вместе, заменив их правильными директивами конфигурации (что я вполне уверен, используя[] трюк не работает в INI) - Если вы обнаружите, что он не загружает ваши настройки достаточно быстро$this->boostrap('view'); в верхней части вашего_initApp() Функция в вашей начальной загрузке должна прочитать / установить все настройки. gnarf
Я попробовал то, что вы прокомментировали,resources.view.helperPaths.My_View_Helper = APPLICATION_PATH "/views/helpers" но до сих пор не могу найтиTest, Вы не против опубликовать свою рабочую структуру, используя только свой INI-файл? meder omuraliev
Я выбрал это в качестве ответа, потому что вы предоставили мне структуру каталогов, хотя способ, которым я на самом деле решил ее, был путем перемещения моей функции начальной загрузки, которая добавляла encoding / doctype в представление в начале, перед моими другими методами init, и это каким-то образом починил это. meder omuraliev
1

У меня была именно эта проблема, и я понял, что это произошло из-за проблемы в моей начальной загрузке: я определял и использовал новый объект Zend_View в одной из моих функций _init, которая, как мне кажется, перезаписывала все остальные мои настройки вида из моей начальной загрузки и мой файл application.ini (включая мое определение resources.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"

1

в моей начальной загрузке:

$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);
Константа DIRECTORY_SEPARATOR отлично подходит для выполнения explode () на путях к файлам, но не нужна для указания пути включения. Прямая косая черта прекрасно работает на платформах Windows и * nix. (Просто к вашему сведению) Sonny

Похожие вопросы