Zend Framework - общий файл для размещения функций, доступ к которому можно получить из представления. - PullRequest
2 голосов
/ 05 октября 2009

Мне нужно иметь место для размещения некоторых общих функций, которые будут использовать различные скрипты вида, такие как создание html путем передачи ему переменной. Я знаю об использовании помощников, но я хочу иметь возможность помещать в него много функций, а не только одного помощника для каждой функции. Это плагин, который мне нужно создать?

спасибо

Ответы [ 6 ]

4 голосов
/ 05 октября 2009

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

class App_View_Helper_Example extends Zend_View_Helper_Abstract
{
    /**
     * @param  mixed|null $var
     * @return App_View_Helper_Example 
     */
    public function example($var = null)
    {
        if ($var === null) {
            return $this;
        }
        return $this->function1($var); // shortcut to method most used
    }

    public function function1($var)
    {
        return $this->view->escape($var);
    }

    public function function2($var1, $var2)
    {
        return $this->view->escape(sprintf('%s: %d', $var1, $var2));
    }

    // and so on... 
}

Это позволяет вам вызывать вспомогательные методы в вашем представлении следующим образом:

$this->example($var);
$this->example()->function1($var);
$this->example()->function2($var1, $var2);

Я использовал этот подход для помощника Google Static Map, который предоставляет centered() -метод для отображения карты с центром в заданном месте и byMarkers() -метод, который отображает статическую карту, автоматически центрирующуюся и масштабируемую вокруг списка данные маркеры.

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

3 голосов
/ 05 октября 2009

Хм, "звучит немного вонючий". Какие это будут функции? Если ваш дизайн в порядке, у вас не должно быть необходимости в этом классе мусорных баков. Если это действительно все о представлении, то вы должны создать помощники вида, частичные или частичные циклы!

0 голосов
/ 23 ноября 2009

Но мне также интересно, что сказал Джастин, что у меня может быть общий помощник расширенного представления? Чтобы все мои представления или контроллеры могли получить доступ для выполнения повторяющихся задач, таких как некоторые HTML-элементы / стили и т. Д. ... Как бы я мог настроить это?

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

Одна из причин в том, что вы сохраняете дополнительные классы и файлы включений. Как ты мог это сделать?

Если они связаны, вы можете поместить их в один помощник вида. Но не делай такие вещи, как

$this->htmlWrapper()->wrapParapgraph()->wrapContentBox()
    ->translateFromTo('NL', 'EN');

translateFromTo(…) не имеет ничего общего с html-упаковкой.

Если вы хотите оптимизировать ваши включения, вы можете поместить общий вспомогательный код в производный класс View:

class MyView extends Zend_View
{
    function wrapParagraph() {}
    function otherFunction() {}
}

Эта опция также упоминается в руководстве Zend Framework как средство оптимизации.

Обратите внимание, что возможность повторного использования помощника вида не зависит от выбора помощников вида в качестве отдельных классов. Вы автоматически получаете доступ к текущему виду объекта, если ваш помощник расширяет Zend_View_Helper_Abstract.

class My_View_Helper extends Zend_View_Helper_Abstract
{
    function wrapParagraph($content) {
        // do something …
        return $this->someOtherViewHelper();
    }

}

Далее вы написали

$ formVars = $ this-> formVars ();

На самом деле это не имеет смысла, так как Zend_View регистрирует только один помощник вида на один момент просмотра.

$formVars=$this->formVars();
$formVars->doOneThing();
$formVars->doSecondThing();

эквивалентно

$this->formVars()->doOneThing();
$this->formVars()->doSecondThing();

Аспект Singleton оказывает серьезное влияние на то, как вы проектируете представления помощников, как видите.

0 голосов
/ 05 октября 2009

Спасибо всем за предложения. Я обнаружил, что вы можете использовать помощник вида (как сказал Стефан) для хранения большего количества функций, просто возвращая $ this из него, например:

class Zend_View_Helper_FormVars
{


    public function formVars(){

        return $this;

    }

    public function openFormFieldGroup($name=''){

        $html='';
        $html.='<div id="formFldGrpWrapper">';
        $html.='<div id="formFldGrpName"><b>'.$name.'</b></div>';
        return $html;

    }

}

Теперь в моем скрипте вида я могу использовать его так:

$formVars=$this->formVars();
$html.=$formVars->openFormFieldGroup('General');

Но меня также интересует, что сказал Джастин, что у меня может быть общий помощник расширенного представления? Чтобы все мои представления или контроллеры могли получить доступ для выполнения повторяющихся задач, таких как некоторые HTML-элементы / стили и т. Д. ... Как мне настроить это?

спасибо.

0 голосов
/ 05 октября 2009

Если вам не нужна «группа помощников» (что на самом деле не так уж и плохо, как предлагали другие авторы), вы можете расширить Zend_View, добавить методы-члены, а затем установить Viewrenderer на расширенное представление.

http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.viewrenderer

0 голосов
/ 05 октября 2009

Похоже, что вы хотите, это частичный помощник

Если вы не хотите использовать помощники (в том числе частичный помощник), вы можете просто создать некоторые глобальные функции, вставить их в некоторый файл и включить его в файл начальной загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...