Action View Helper в Zend - Обойти? - PullRequest
10 голосов
/ 02 июня 2009

Я работаю над созданием интерфейса, который я хочу использовать в качестве функции «просмотра с вкладками». Каждая из этих вкладок уже была написана как действие, и интерфейс с вкладками прекрасно работает как ссылки на отдельные вкладки. Я решил попробовать написать «индексную» страницу для этого контроллера - поместить содержимое всех вкладок в скрытые div и поменять их местами с помощью jQuery, но как только я начал использовать помощник вида действия - я столкнулся с множеством людей, которые говорили: что это плохая практика. ( см. Эту статью )

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

Просмотр к / item должен дать вам меню с вкладками, а также все содержимое div в скрытом теге - где / item / tab2 - это конкретное действие (например, отправка формы).

Еще одно осложнение / предостережение - некоторые действия будут вызывать исключения доступа, если пользователь не имеет доступа к этой «вкладке». Я бы предпочел не встраивать проверку доступа в систему дважды (показывая вкладку с пустым содержимым).

Я просто пытаюсь выяснить, что лучше всего делать с подобными вещами, и я подумал, что это может быть помощник действий. Если я пытаюсь использовать View Helpers - я начинаю задумываться, подходит ли это место для сборки Zend_Form.

Есть ли у кого-нибудь предложения по поводу "правильного" способа обхода без использования Zend_View_Helper_Action?

Ответы [ 4 ]

7 голосов
/ 28 июля 2009

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

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

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

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

1 голос
/ 07 июня 2009

Я не совсем уверен, в чем именно заключается ваша проблема, однако вы можете отключить макет:

$this->_helper->layout->disableLayout();

Тогда запрошенное Действие просто отобразит свой скрипт вида, который вы можете загрузить на вкладку.

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

1 голос
/ 04 июня 2009

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

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

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

0 голосов
/ 08 июня 2009

Вы можете перехватить любые исключения доступа, используя блок try / catch:

try { // action throwing exceptions } catch (Exception $e) { // catch silently }
...