Нужна помощь в выяснении, как написать мой помощник Zend View - PullRequest
1 голос
/ 03 августа 2010

Я довольно новичок в Zend Framework и MVC в целом, поэтому я ищу несколько советов.У нас есть базовый класс контроллеров, в котором у нас есть несколько методов для получения некоторой пользовательской информации, конфигураций учетных записей и т. Д.

Поэтому я использую некоторые из этих методов для записи кода в различных действиях контроллеров, но теперь яЯ хочу избежать дублирования этого кода и более того, я хотел бы вынести этот код за пределы контроллера и помощника вида, так как он в основном предназначен для вывода некоторого JavaScript.Поэтому код в контроллере будет выглядеть так:

$obj= new SomeModel ( $this->_getModelConfig () );
$states = $obj->fetchByUser ( $this->user->getId() );
//Fair amount of logic here using this result to prepare some javascript that should be sent to the view...

$ this -> _ getModelConfig и $ this-> user-> getId () - это то, что я мог бы сделать в контроллере, теперь мой вопросКаков наилучший способ передать эту информацию помощнику вида, как только я переместить этот код из контроллера?

Должен ли я просто вызвать эти методы в контроллере и сохранить результаты в представлении и получить помощниказабрать это оттуда?

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

От контроллера:

$this->view->myHelper($this->user->getId(), $this->_getModelConfig());

От вида:

<?= $this->myHelper(); %>

Помощник:

class Zend_View_Helper_MyHelper extends Zend_View_Helper_Abstract
{
    public $userId = '';
    public $config = null;
    public function myHelper ($userId = null, $config = null)
    {
        if ($userId) {
            $this->userId = $userId;
            $this->config = $config;
        } else {
            //do the work
            $obj = new SomeModel($this->config);
            $states = $obj->fetchByUser($this->userId);
            //do the work here  
        }
        return $this;
    }
}

Любой советприветствуется!

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Во-первых, окончание тега в стиле ASP здесь, в «$ this-> myHelper ();%>», является плохой практикой, при этом более целесообразно сохранять логику в модели, а контроллер просто использовать для вызовамодели, получить результаты и плюнуть это на представление для просмотра.

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

в любом случае, вы не должны делать ваше ...

"// Приличное количество логики здесь, используя этот результат, чтобы подготовить некоторый javascript, который должен быть отправлен в представление ..."

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

0 голосов
/ 03 августа 2010

Лучший способ - это получить данные от вашей модели через ваш контроллер, а затем перейти к представлению.Но если вам действительно нужен пользовательский помощник для отображения частей обзора, мы узнаем, только если вы точно скажете, что вы пытаетесь сделать.

Если у вас уже есть эта логика в помощнике, попробуйте просто передать параметры в вашем представлении myhelper ($ this-> params);?>

Возможно, вы захотите взглянуть и на этот подход:

// In your view to put javascript in the header
// You can loop trought your data and then use it to generate the javascript.
<?php $this->headScript()->captureStart(); ?>
    $().ready(function(){
        $('#slideshow').cycle({ 
            fx:     'fade', 
            speed:  1000, 
            timeout: 6500, 
            pager:  '#nav'
        });
    });
<?php $this->headScript()->captureEnd() ?>  
...