Нужна помощь, чтобы понять, как написать мой помощник Zend View

Я новичок в 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;
    }
}

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


person SBUJOLD    schedule 03.08.2010    source источник


Ответы (2)


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

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

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

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

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

person Abdullah Khan    schedule 03.08.2010
comment
Мой вопрос именно в том, чтобы вытащить этот код из контроллера. Чего я не хочу делать, так это того, чтобы моя модель выводила теги ‹script› и включала JS-файлы, которым она там не принадлежит, поэтому я думаю, что решение состоит в том, чтобы использовать помощника. Это «достаточное количество логики» - это в основном всего несколько циклов в массивах, полученных от модели и выводящих правильный javascript, я действительно не чувствую, что это принадлежит модели, не так ли? - person SBUJOLD; 03.08.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() ?>  
person Keyne Viana    schedule 03.08.2010