2010-09-19 2 views
2

Предполагая, что вы пытаетесь как можно ближе подойти к представлению Zend Framework о юниверсе, как следует совместно использовать общий доступ к одному и тому же модулю из одного модуля?Совместное использование помощников Zend (просмотр или действие) Между модулями

Предположим, у меня есть два модуля. Модуль «А» имеет помощник вида «Вывод».

class Modulea_Zend_View_Helper_Ouput extends Zend_View_Helper_Abstract 
{ 
    function output($var) 
    { 
     echo strip_tags($var); 
     return true; 
    } 
} 

Если я пытаюсь использовать этот помощник с точки зрения в модуле «B»

File: moduleb/views/scripts/index/index.phtml 

<?php $this->output($somevar); ?> 

я получаю исключение

Plugin по имени «Выход» не был найден в реестр

Какое «право» было использовать помощник вида Выход из модуля B.

+0

Итак, у вас есть помощник вида в модуле A, который на самом деле не является модулем? – jason

+1

Джейсон, это правильно. Мы часто обнаруживаем/понимаем, что помощник, созданный для определенного модуля, оказывается полезным в другом модуле. Это не всегда очевидно в начале проекта. Из тон вашего вопроса звучит так, что есть центральное место для помощников, которые используются во всех модулях, и вы предполагаете, что эти помощники должны быть перемещены? Или что-то другое? –

+0

Легко перемещать помощника в библиотеку. Вы также можете создавать помощники как «Application_View_Helper_», общие для всего приложения. – takeshin

ответ

0

На самом деле у меня есть папка с библиотекой и внутри нее видятся и вспомогательные папки. Я помещаю общих помощников в эту папку.

моя структура:

-application 
    --modules 
    ---modulea 
    ---moduleb 
-library 
    --view 
    ---HELPER 

я добавил папку библиотеки в моей включить путь с помощью команды set_include_path.

+0

Это приличное решение Рахим, но я не уверен, что это «правильный». Zend_Framework всегда поразила меня как нечто, предназначенное для сидения поверх самого PHP, и отвлечься от необходимости использовать основные функции, такие как set_include_path, для обработки загрузки в вашем коде. –

1

Вы можете добавить помощник к представлению в загрузчике

$this->bootstrap('view'); 
$view->addHelperPath(APPLICATION_PATH . '/views/helpers/','My_View_Helper'); 
+1

Я предполагаю, что это приведет к ошибке, так как $ view не определен. – Starx

0

Если вы положили ваши помощник в пути к библиотеке, они будут автоматически загружаются в любом месте.

library 
    Zend 
    View 
     Helper 
     YourHelper.php 
    Zend 
    Controller 
     Action 
     Helper 
      YourHelper.php 

Вы можете заменить Zend с вашего собственного пространства имен, но вы должны установить его, например. в application.ini:

resources.view.helperPath.Application_View_Helper = "Application/View/Helper" 
resources.frontController.actionHelperPaths.Application_Controller_Action_Helper = "Application/Controller/Action/Helper" 
+6

Настоятельно рекомендуется никогда не использовать префикс 'Zend_'. Это потенциально может привести к столкновениям и неожиданному поведению во время будущих обновлений. – jason

1

только добавить:

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

Достаточно ..

2

Чтобы добавить ответ Chillini, и в ответ на последующий комментарий Starx в:

Если $view не определен , попробуйте добавить это в свой Bootstrap:

protected function _initView() 
{ 
    // Initialize view 
    $view   = new Zend_View(); 
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
     'ViewRenderer' 
    ); 
    $viewRenderer->setView($view); 
    $view->addHelperPath(
     APPLICATION_PATH . '/views/helpers/', 
     'My_View_Helper' 
    ); 
} 

Кроме того, я заметил, что вы можете изменить class Modulea_Zend_View_Helper_Ouput на class Modulea_Zend_View_Helper_Output на всякий случай.

1

Простейший способ, которым я реализую это, заключается в следующем.

  1. Создать новую папку сказать Helpers внутри папки Library
  2. Поместите View Helper файл внутри файла, который вы назвали бы Output.php
  3. Внутри «Output.PHP»у вас есть следующий код:
class Helpers_Output extends Zend_View_Helper_Abstract 
{  public function ($var) 
    { 
     echo strip_tags($var); 
     return true; 
    } 
} 

А в вашем Application.ini добавить вид вспомогательный путь следующим

resources.view.helperPath.Helpers = "Помощники /"

Я предпочитаю этот метод, так как он позволяет размещать ваши помощники в центральном месте вне модулей, а в других, чтобы сделать его доступным для всего вашего приложения, все, что вам нужно, - это всего лишь одна строка ввода в Application.ini

1

Вот мой подход:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 
    public function __construct($application) { 
     parent::__construct($application); 
     $this->bootstrap("view"); 
     $view = $this->getResource('view'); 
     Zend_Registry::set("Zend_View", $view); 
    } 
} 

class Core_Bootstrap extends Zend_Application_Module_Bootstrap { 
    public function __construct($application) { 
     parent::__construct($application); 
     $view = Zend_Registry::get("Zend_View"); 
     $view->addHelperPath(APPLICATION_PATH . "/modules/core/views/helpers", 'Core_View_Helper'); 
    } 
} 

Поскольку применение широко (скажем, «глобальный») Помощники используются совместно с модулями, когда модуль должен делегировать вспомогательный вид на другие модули, вы должны добавить это вид приложения. Если ваш помощник представления имеет зависимости от собственного модуля (т. Е. Использует модели), его просто не очень удобно помещать в библиотеку.

Приведенный выше код позволяет использовать горячие капли модуля в приложении без каких-либо изменений в основных файлах конфигурации только один раз, и в большинстве случаев это не повредит ничего другого.

Смежные вопросы