Установка returnURL для кнопки CButtonColumn

Я смотрю на контроллер для кнопки Удалить по умолчанию в классе CButtonColumn. Ему удается вернуться на предыдущую веб-страницу после удаления строки CGridView и остаться на той же странице CGridView, а не перейти на первую страницу. Строки, ответственные за это в связанном контроллере, выглядят так:

if (!isset($_GET['ajax'])) $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

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


person Epicurus    schedule 15.03.2011    source источник
comment
Пожалуйста, просто отредактируйте свой вопрос, чтобы включить уточнение. Ответы зарезервированы именно для этого, ответов.   -  person Tim Post♦    schedule 18.03.2011
comment
Это работает, как вы описали по умолчанию (версия 1.1.12). Если вы посмотрите внимательно, на самом деле он не перенаправляется, потому что это вызов ajax и, следовательно, не пройдет проверку условия: !isset($_GET['ajax']). Обновление CGridView вызывается позже javascript, если удаление возвращает успех.   -  person Imre L    schedule 30.10.2012


Ответы (2)


Код «returnUrl», который вы просматриваете, использует переменную POST для returnUrl. Чтобы использовать это, вам нужно будет каким-то образом опубликовать это. В представлении этот код вызывается, я предполагаю, что в форме есть поле <input name="returnUrl">. Вы должны убедиться, что это поле (заполненное правильным значением URL-адреса) есть во всех представлениях, из которых вы отправляете POST, чтобы получить доступ к этой переменной POST в вашем действии контроллера.

Если вы отправляете сообщение в действие удаления через AJAX, я думаю, вы можете установить переменную $_POST['returnUrl'] с помощью jQuery AJAXфункция.

Другой способ — использовать переменную SESSION CWebUser returnUrl. этой POST-переменной. Я никогда этого не делал, но это встроено в Yii, поэтому я предполагаю, что оно работает нормально.

Мне никогда не нравился хакерский $_POST['returnUrl'], который генерирует Gii.

ДРУГАЯ вещь, которую вы могли бы сделать, это посмотреть на переменную $_SERVER['HTTP_REFERER'] и использовать ее для перенаправления возврата в вашем deleteAction. Я не знаю, будет ли это установлено правильно, с осложнениями из-за перенаправления/перезаписи 302, которые делает Yii.

Удачи!

person thaddeusmt    schedule 16.03.2011
comment
Спасибо за ответ. Я также рассматривал возможность использования упомянутой вами опции AJAX. Единственная проблема в том, что у меня нет опыта работы с AJAX/jQuery. - person Epicurus; 18.03.2011

Вы можете установить обратный URL-адрес с помощью вызова CHtml::link. Вот пример использования удаления

CHtml::link(
    'Delete',
    '#',
     array('submit'=>array('delete','id'=>$model->id),
           'params'=>('returnUrl'=>'controller/action...'), 
           'confirm' => 'Are you sure?'
     )
);

Взято из этого ответа Stackoverflow.

person Jason George    schedule 14.09.2012