Zend Framework: передача по ссылке для просмотра помощника не работает - PullRequest
1 голос
/ 07 декабря 2011

Вот простой помощник вида (обратите внимание на аргумент передачи по ссылке):

class Zend_View_Helper_MyViewHelper extends Zend_View_Helper_Abstract
{
  public function MyViewHelper(&$array)
  {
    unset($array['someExistingKey']);
  }
}

Это не работает в представлении. $array['someExistingKey'] все еще установлено (кроме как в непосредственном контексте метода). Zend должен что-то делать, чтобы предотвратить передачу массива по ссылке. Есть идеи по решению?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Когда вы вызываете $this->MyViewHelper($array) из ваших шаблонов, вы на самом деле не вызываете вспомогательный класс напрямую, Zend_View создает экземпляр класса и вызывает его для вас.Поэтому я думаю, у вас могут возникнуть проблемы с этим.Лучше всего, возможно, использовать Zend_Registry или рефакторинг, чтобы использовать другой подход, не требующий глобального.

1 голос
/ 07 декабря 2011

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

Ref.php

class Zend_View_Helper_Ref extends Zend_View_Helper_Abstract
{
    public function removeFromRef(&$ref)
    {
        // change your var value here
        unset($ref['key']);
    }

    /**
     * ZF calls this for us, but we'll call what we want, so you can skip this.
     */
//    public function ref()
//    {}
}

Как видите, вы можете пропустить соглашение о необходимости называть ваш основной метод именем файла, но я все же рекомендую его. Теперь вы можете передавать ссылки в представлениях / контроллерах:

// in view:
$this->getHelper('Ref')->removeFromRef($someVar2Change);
// in controller
$this->view->getHelper('Ref')->removeFromRef($someVar2Change);

По сути, именно это и делает $this->ref(): получает помощника, затем вызывает call_user_func_array.

У некоторых людей могут возникнуть проблемы с использованием $this->getHelper('Ref')->ref() вместо $this->ref(), но это работает.

...