Помощник представления вызова Zend Framework из Zend_View_Helper - PullRequest
8 голосов
/ 26 ноября 2009

У меня есть помощник по имени Zend_View_Helper_FormVars, который используется одним из моих модулей. У меня также есть общий помощник в application/common/helpers/GeneralFunctions.php

Я пытаюсь вызвать функцию из Zend_View_Helper_FormVars, которая находится в GeneralFunctions.php.

Вот краткая версия Zend_View_Helper_FormVars:

class Zend_View_Helper_FormVars
{
    public $reqFieldVisual='<span class="req">*</span>';
    public $roles=array('admin'=>'admin', 'user'=>'user');
    public $paymentMethods=array('1'=>'Check', '2'=>'Credit Card',
                '3'=>'Cash', '4'=>'Other');


    public function formVars(){
        $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl();
        return $this;
    }

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(),
        $codesArr=array()) {
        $html='';
        $html.=Zend_View_Helper_GeneralFunctions::generalFunctions()->progressMeter();
        return $html;
    }
}

Вот код в GeneralFunctions.php:

class Zend_View_Helper_GeneralFunctions
{
    public function generalFunctions(){
        $this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl();
        return $this;   
    }

    public function progressMeter() {
        $html='';
        $html.='<span id="progressWrapper">';
        $html.='<span id="progressMeter"></span>';
        $html.='</span>';
        $html.='';
        return $html;
    }
}

Кроме того, я забыл упомянуть, что у меня в Bootstrap автоматически загружен помощник GeneralFunctions, и он уже доступен для всех моих модулей:

$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper');

Вот что я пробовал, но получаю ошибку:

// application/Bootstrap.php ----------->
function _initViewHelpers() {
    // add a helper for use for all modules
    $view->addHelperPath(APPLICATION_PATH .'/Common/Helper', 'Common_Helper');
}
//-------------------->


// application/common/helpers/General.php ----------->
class Zend_View_Helper_General extends Zend_View_Helper_Abstract
{
    public function general(){
        return $this;
    }   
    public function test(){
        return 'test 123';
    }
}
//-------------------->

// application/modules/dashboard/views/helpers/DashboardHelper.php ----------->
class Zend_View_Helper_DashboardHelper extends Common_Helper_General
{

    public function dashboardHelper(){
        return $this;
    }

    public function dashboardTest(){
        return 'from dashboard';
    }

}
//-------------------->

// application/modules/dashboard/views/scripts/index/index.phtml ----------->
echo $this->dashboardHelper()->test();
//-------------------->

Я получаю сообщение об ошибке:

Фатальная ошибка: класс Common_Helper_General не найден в /Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php в строке 2

Ответы [ 4 ]

14 голосов
/ 27 ноября 2009

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

Убедитесь, что ваш помощник вида расширяет Zend_View_Helper_Abstract, чтобы у него был доступ к $view. Тогда вы можете просто вызвать помощников, как при просмотре, т.е.

$this->view->generalFunctions()->progressMeter();

На основе вашего примера выше:

<?php

class Zend_View_Helper_FormVars extends Zend_View_Helper_Abstract {

    /* ... */

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(),
        $codesArr=array()) {
        $html='';
        $html. $this->view->generalFunctions()->progressMeter();
        return $html;
    }
}
0 голосов
/ 26 ноября 2009

Вы вызываете свой класс, не создавая его экземпляров.

Ваша функция generalFunctions() использует указатель $this, который не будет работать; также это не статический метод.

Один из параметров устанавливает индикатор выполнения в статическую функцию и вызывает ее напрямую следующим образом:

Zend_View_Helper_GeneralFunctions::progressMeter();

Другой вариант - сначала создать экземпляр вашего класса.

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

Я вижу несколько проблем с вашим кодом.

  1. Вы пытаетесь вызвать Zend_View_Helper_GeneralFunctions::generalFunctions() как статический метод, когда он объявлен как метод класса (т. Е. Вам нужно создать экземпляр класса, чтобы использовать его) из-за того, что вы пропустили ключевое слово static.
  2. Если вы на самом деле хотите использовать generalFunctions() в качестве статического метода и исправить это, то вам нужно либо сделать baseUrl статическим свойством, либо вам нужно будет создать экземпляр класса и затем вернуть его.
  3. Идея использования вашего класса GeneralFunctions в качестве контейнера для статических методов, которые вызываются напрямую, на самом деле является признаком более глубоких проблем и по праву называется запахом кода. Если вы думаете, что я лгу, взгляните на высокоприоритетные элементы для Zend Framework 2.0 (подсказка: он включает в себя удаление всех статических методов из фреймворка). Или вы всегда можете спросить ТАК, что они думают о статических методах :-).

Глядя на ваше заданное имя класса для класса общих функций Zend_View_Helper_GeneralFunctions и учитывая текущий сценарий, в котором вы пытаетесь использовать помощник GeneralFunctions внутри другого помощника, я бы предположил, что вам действительно нужно сделать одно из двух ,

  1. Вам нужно, чтобы каждый подкласс класса помощника был классом GeneralFunctions, чтобы у всех ваших помощников были доступны эти функции. По сути, спросите себя, все ли ваши помощники начинают свою жизнь как GeneralFunction помощники с расширенными функциональными возможностями. Это решение использует наследование для решения вашей проблемы.
  2. Каждый помощник вида должен содержать экземпляр объекта View, с которым выполняются действия. Следовательно, теоретически вы должны иметь доступ к любому другому помощнику вида с помощью магического метода __call (я думаю, что есть и явный метод, но я всегда использую магический метод). Это может выглядеть так в вашем сценарии:

    public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) 
    {
        $html='';
        $html.= $this->generalFunctions()->progressMeter();
        return $html;
    }
    

    В этом сценарии метод __call загрузит помощник GeneralFunctions и затем вызовет метод progressMeter() из помощника GeneralFunctions.

    Теперь ваш GeneralFunctions вспомогательный класс, вероятно, будет выглядеть так:

    class Zend_View_Helper_GeneralFunctions
    {
        public function __construct()
        {
            $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl();
        }
    
        public function progressMeter() {
            $html='';
            $html.='<span id="progressWrapper">';
            $html.='<span id="progressMeter"></span>';
            $html.='</span>';
            $html.='';
            return $html;
        }
    }
    
0 голосов
/ 26 ноября 2009

Возможно, вы не настроили свой автозагрузчик для загрузки классов из папки application/common/helpers/.

См. Zend_Application_Module_Autoloader для путей по умолчанию. Вы должны добавить свою новую папку к этому.

...