Yii - генерация URL с сохранением или удалением параметров GET - PullRequest
1 голос
/ 28 ноября 2011

В настоящее время у меня есть вид, управление, в котором перечислены элементы данных. Вместо того, чтобы запускать «редактировать» и «добавлять» действия с отдельными представлениями, у меня появляется соответствующая встроенная форма отображения на странице, когда это необходимо. На форме есть кнопка «Отмена», которая будет скрывать ее.

Прямо сейчас я решаю, что, если таковые имеются, формировать для отображения inline через параметр GET с именем mode. Поэтому /controller/manage отобразит элементы, а /controller/manage?mode=edit отобразит элементы и покажет форму редактирования для правильного элемента данных.

Действие принимает различные другие параметры GET, такие как интервал даты.

Чтобы активировать форму, я создаю ссылку на текущее действие с параметром mode, объединенным с существующими параметрами в $_GET. Я использую следующую однострочную:

<?php echo CHtml::link('Edit', array_merge(array('/session/manage', 'mode' => 'edit', 'id' => 6), $_GET)); ?>

Для реализации ссылки "отмена" я использую:

<?php echo CHtml::link('Cancel', array_diff(array_merge(array('/session/manage'), $_GET), array('edit'))); ?>

Мой вопрос: есть ли более чистый способ сделать это? Хотя это работает , это похоже на взлом. Я не нашел никакой документации по созданию URL-адресов, включающих существующие параметры GET. Предоставляет ли Yii встроенный метод, чтобы делать то, что я хочу? Должен ли я переоценить свой общий подход к условным представлениям, что, в свою очередь, может привести к более чистому решению?

1 Ответ

2 голосов
/ 28 ноября 2011

Один из способов - сохранить все последние переменные _GET в состоянии сеанса.Затем ваш контроллер будет работать с этими сохраненными данными и использовать новые переменные _GET для их переопределения.Используя этот метод, вам не нужно объединять существующие переменные _GET обратно в новый запрос.Компромисс состоит в том, что вам в конечном итоге приходится управлять этими данными сеанса и обрабатывать возможные особые случаи (например, начинать заново со свежим состоянием).

Другой способ - использовать Ajax для вызова действия, которое возвращает частичное представление сВаша предоставленная форма редактирования.Тогда вашим ссылкам нужно будет просто вызвать некоторый javascript, который выполняет вызов Ajax с текущим идентификатором и отображает возвращенную форму на странице.Ваши ссылки выглядят примерно так:

<a href="#" onclick="showEdit(6)">

Поскольку использование Ajax не приведет к перезагрузке страницы, вам не нужно беспокоиться о параметрах _GETтребуется показать свой список.А ваша ссылка «Отмена» станет вызовом javascript для простого удаления формы редактирования из DOM.Использование jQuery:

$('#editform').remove();

Еще один способ сделать его немного чище - это инкапсулировать все элементы array_merge() в методе пользовательского компонента или помощника.Тогда ваш код может выглядеть примерно так:

echo CHtml::link('Edit', URLHelper::mergeGet(array('/session/manage', 'mode' => 'edit', 'id' => 6));

или даже экскалировать , что в вашем собственном классе CHtml:

echo MyCHtml::link('Edit', array('/session/manage', 'mode' => 'edit', 'id' => 6));

, где MyCHtml::link() делает все, что CHtml::link() делает в дополнение к array_merge.MyCHtml может даже расширить CHtml, чтобы он содержал все методы CHtml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...