Разрешить расположение помощника представления из контроллера или формы

У меня есть несколько хелперов представлений, которые добавляют файлы JavaScript, когда они нужны (например, чтобы только формы использовали CKEditor и тому подобное). Моя структура каталогов (упрощенная, чтобы включать только соответствующие файлы) такова:

application
    --forms
        --Project
            AddIssue.php
    --modules
        --default
            --views
                --helpers
                    JQueryUI.php
                    Wysiwyg.php
        --project
            --controllers
                ProjectController.php
            --views
                --scripts
                    --project
                        version.phtml
                        issueadd.phtml

Что я хочу сделать:

  1. включить CKEditor в представление project/project/issueadd
  2. включить пользовательский интерфейс jQuery в project/project/version

Когда я нахожусь внутри скрипта представления, вызов <?php $this->jQueryUI(); ?> работает как шарм, даже несмотря на то, что помощник находится в каталоге помощников модуля по умолчанию. Однако это не относится к контроллеру и форме.

В контроллере ProjectController.php, versionAction() пробовал вызывать:

$this->view->jQueryUI();

и эффект был исключением:

Сообщение: Плагин с именем «JQueryUI» не найден в реестре; используемые пути: Project_View_Helper_: C:/xampp/htdocs/bugraid/application/modules/project/views\helpers/ Zend_View_Helper_: Zend/View/Helper/

Точно так же в форме AddIssue.php я пробовал это:

$this->getView()->wysiwyg();

и снова было исключение:

Сообщение: Плагин с именем «Wysiwyg» не найден в реестре; используемые пути: Project_View_Helper_: C:/xampp/htdocs/bugraid/application/modules/project/views\helpers/ Zend_View_Helper_: Zend/View/Helper/

Очевидно, что оба варианта будут работать, если мои помощники представления будут находиться в каталогах помощников модулей/контроллеров, из которых они вызываются, но, поскольку они используются во многих модулях, я бы хотел, чтобы они находились в каталоге помощников представления модуля по умолчанию. .

Итак, мои вопросы:

  1. Как мне получить доступ к этим помощникам представления из контроллера и формы?
  2. Есть ли более простой способ обойти это (кроме простого включения всех файлов javascript в макет)? Нравится создание плагина или помощника действий? (Я не делал этого раньше, так что я действительно не знаю, я только начинаю свое приключение с ZF).

person mingos    schedule 12.02.2011    source источник
comment
Относительно вопроса 1. Вы должны иметь доступ к помощникам обычным способом. Однако, поскольку это не работает, я думаю, что есть проблема с тем, как вы загружаете свой ресурс просмотра и как вы выполняете концертную регистрацию помощника или как вы добавляете к нему путь помощника. Я вставляю пример добавления вспомогательного пути в Bootsrap.php: pastebin.com/5z6yzjnx. работа для модульной установки ZF.   -  person Marcin    schedule 12.02.2011
comment
Вы используете JQueryUI.php. Это что-то из коробки ZF или это ваша собственная кулинария?   -  person akond    schedule 12.02.2011
comment
@akond: это моя готовка. Он просто добавляет jquery.js, jqueryui.js и ui.css в заголовок страницы, ничего особенного. Я использую его только на одной странице, где мне нужны перетаскиваемые элементы, и решил, что включать его на все страницы не имеет смысла. @Marcin: ваше понимание, как обычно, бесценно. Не могли бы вы опубликовать это как ответ?   -  person mingos    schedule 13.02.2011
comment
Я сделал ответ из своего комментария. Рад, что смог помочь.   -  person Marcin    schedule 13.02.2011


Ответы (3)


Относительно Q1 (на основе комментариев). Вы должны иметь доступ к помощникам обычным способом. Однако, поскольку это не работает, я думаю, что есть проблема с тем, как вы загружаете свой ресурс просмотра и/или как вы выполняете конкретную регистрацию помощников или как вы добавляете к нему путь помощника. Я вставляю пример добавления вспомогательного пути в Bootsrap.php:

<?php
#file: APPLICATION_PATH/Bootstrapt.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    public function _initViewHelperPath() {

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

          $view->addHelperPath(
                APPLICATION_PATH . '/modules/default/views/helpers',
                'My_View_Helper' // <- this should be your helper class prefix.
        );
    }

}
?>

Это, конечно, должно нормально работать для модульной установки ZF.

Что касается вопроса 2: вы можете использовать headScript view helper для управления тем, какие скрипты вы загружаете в тег head вашего макета. С помощью этого помощника вы можете сделать это своими действиями.

Например. Если в layout.php у вас есть:

<head>
    <?php echo $this->headScript(); ?>
</head>

затем в, например. indexAction вы можете добавить некоторый файл JS следующим образом:

$this->view->headScript()->appendFile($this->view->baseUrl('/js/someJS.js'));
person Marcin    schedule 13.02.2011
comment
Что касается Q2, да, это то, что я сделал ранее, и это сработало нормально. Захотелось переключиться на хелперы и научиться ими правильно пользоваться :). - person mingos; 13.02.2011

Как бы я ни ненавидел отвечать на свои вопросы, я придумал еще одно решение, основанное на том, что предложил Марчин в своем ответе. Это также можно сделать в application.ini:

resources.view[] =
resources.view.helperPath.My_View_Helper = APPLICATION_PATH "/modules/default/views/helpers"

Предостережение в том, что строки должны появляться в этом порядке. Если он будет изменен, все, что предшествует resources.view[] =, будет проигнорировано.

person mingos    schedule 13.02.2011

Я бы предпочел избавиться от вашего JQueryUI.php и использовать ZendX. Что-то такое:

В контроллере:

    ZendX_JQuery::enableView ($this->view);
    $this->view->jQuery ()->enable ()->setRenderMode (ZendX_JQuery::RENDER_ALL);

В макете:

<?php echo $this->jQuery () ?>
person akond    schedule 13.02.2011
comment
Спасибо за ответ. Хотя это хороший момент и солидная информация (раньше я не знал ZendX), это не совсем относится к моему вопросу, касающемуся доступа к помощникам представлений :). - person mingos; 13.02.2011