Передача модели при редиректе
Передача модели при редиректе
Возник вопрос, как правильно делают в такой ситуации?
Есть экшн который делает некоторые операции - генерирует датапровайдер для виджетов и т.д., а потом рендерит страничку. В этой странички кроме других элементов, с помощью рендер партиал выводится форма, ну например регистрации, которая имеет кнопку отправки формы. При нажатии на кнопку исполняется другой экшн, в конце которого должно вернуть на предыдущую страничку(я это делаю с помощью редиректа с ссылкой на первый экшн). Если форма отправки валидацию не прошла, как правильно передать модель с ошибками в форму? Рендером? Ну тогда снова нужно в этом экшене генерить датапровайдер(как в первом экшене) и делать другие операции результаты которых нужны для этой странички? Проще было б отправить модель формы через редирект, но параметрами редиректа модель не может быть?
Есть экшн который делает некоторые операции - генерирует датапровайдер для виджетов и т.д., а потом рендерит страничку. В этой странички кроме других элементов, с помощью рендер партиал выводится форма, ну например регистрации, которая имеет кнопку отправки формы. При нажатии на кнопку исполняется другой экшн, в конце которого должно вернуть на предыдущую страничку(я это делаю с помощью редиректа с ссылкой на первый экшн). Если форма отправки валидацию не прошла, как правильно передать модель с ошибками в форму? Рендером? Ну тогда снова нужно в этом экшене генерить датапровайдер(как в первом экшене) и делать другие операции результаты которых нужны для этой странички? Проще было б отправить модель формы через редирект, но параметрами редиректа модель не может быть?
Re: Передача модели при редиректе
ничерта не понятно. Скажу одно: редиректом занимается сервер, поэтому забудьте о передачах моделей.
Re: Передача модели при редиректе
Ну тогда как решить задачу.
Есть страничка с разными виджетами которые принимают dataprovider с контролера
Есть на страничке форма. Как передать в форму ошибки если данные отправляются постом и не проходят валидацию.
Когда страничка состоит из одной формы тогда все просто, делаем в экшене который вызывается для отправки формы в конце
например
$this->render("pageform", array('model'=>$model));
А как отрендерить форму с ошибками и другие элементы странички если страничка состоит не с одной формы?
Есть страничка с разными виджетами которые принимают dataprovider с контролера
Есть на страничке форма. Как передать в форму ошибки если данные отправляются постом и не проходят валидацию.
Когда страничка состоит из одной формы тогда все просто, делаем в экшене который вызывается для отправки формы в конце
например
$this->render("pageform", array('model'=>$model));
А как отрендерить форму с ошибками и другие элементы странички если страничка состоит не с одной формы?
Re: Передача модели при редиректе
а какая разница? все формы принимают на вход модели, все модели валидируются в контроллере, значит все модели вместе с ошибками передаются во вьюшку. Причем тут редирект?
Re: Передача модели при редиректе
Ладно, не о редиректе речь. Не хотел создавать новую тему.
Вот у меня экшн index при исполнении рендерит мою страничку index, в которую передаем модель интересующей нас формы
и другие параметры
в представлении index рендерпартиал формы
Сама форма
Экшн обработки формы teachers/teacherletter который меня и интересует, как правильно прописать?? Если модель $teacherletter=new TeacherLetter() уже была создана в actionIndex, то ниже ее не создаем, но как ее тогда передать в экшн TeacherLetter ниже?
Если создавать модель не в actionIndex а создавать в actionTeacherLetter что прописать после else если валидация формы не проходит, чтобы отрендерить всю страничку и форму с ошибками? Подскажите что делаю не так. Спасибо.
Вот у меня экшн index при исполнении рендерит мою страничку index, в которую передаем модель интересующей нас формы
Код: Выделить всё
$teacherletter=new TeacherLetter();
Код: Выделить всё
public function actionIndex()
{
$teacherletter=new TeacherLetter();
$criteria= new CDbCriteria;
$criteria->alias = 'teacher';
$criteria->order = 'rating DESC';
$dataProvider = new CActiveDataProvider('Teacher', array(
'criteria' => $criteria,
'Pagination'=>false,
));
$teachers = Teacher::getAllTeachersId();
$this->render('index',array(
'dataProvider'=>$dataProvider,
'teachers'=>$teachers,
'teacherletter'=>$teacherletter,
));
}
Код: Выделить всё
<?php $this->renderPartial('_ifYouTeachers', array('teacherletter'=>$teacherletter)); ?>
Код: Выделить всё
<?php $form=$this->beginWidget('CActiveForm',array(
'action'=>array("teachers/teacherletter"),
'htmlOptions'=> array(
'method'=>'post',
)
)); ?>
...
<?=CHtml::submitButton(Yii::t('teachers', '0180'),array('id'=>'send_btn', 'name'=>'sendletter'))?>
<?php $this->endWidget(); ?>
Если создавать модель не в actionIndex а создавать в actionTeacherLetter что прописать после else если валидация формы не проходит, чтобы отрендерить всю страничку и форму с ошибками? Подскажите что делаю не так. Спасибо.
Код: Выделить всё
public function actionTeacherLetter()
{
$letter=new TeacherLetter; //Не создаем?
$letter->attributes=$_POST["TeacherLetter"];
if ($letter->validate())
{
....
Yii::app()->user->setFlash('messagemail','Письмо отправлено');
header('Location: '.$_SERVER['HTTP_REFERER']);
}
else ??????
}
Re: Передача модели при редиректе
да вроде все верно. модель создаем.
Re: Передача модели при редиректе
а что написать в конце после ?
Нужно же страничку с ошибками отображать после валидации
Если редирект на actionIndex модель с ошибками не отобразится, если рендер index то еще нужно передавать
это почти весь код с actionIndex
Код: Выделить всё
else
Нужно же страничку с ошибками отображать после валидации
Если редирект на actionIndex модель с ошибками не отобразится, если рендер index то еще нужно передавать
Код: Выделить всё
'dataProvider'=>$dataProvider,
'teachers'=>$teachers,
Re: Передача модели при редиректе
а, я понял вашу проблему.
тогда так:
код примерный
тогда так:
Код: Выделить всё
if(validate()) {
Yii::app()->user->setFlash('messagemail','Письмо отправлено');
} else {
Yii::app()->user->setFlash('messageError',$model->getFirstError());
}
$this->redirect(...);
- valentinich
- Сообщения: 171
- Зарегистрирован: 2014.03.25, 13:58
Re: Передача модели при редиректе
Еще как вариант делать валидацию в экшене index
Код: Выделить всё
$teacherletter=new TeacherLetter();
$criteria= new CDbCriteria;
$criteria->alias = 'teacher';
$criteria->order = 'rating DESC';
$dataProvider = new CActiveDataProvider('Teacher', array(
'criteria' => $criteria,
'Pagination'=>false,
));
$teachers = Teacher::getAllTeachersId();
if (isset($_POST["TeacherLetter"])) {
$teacherletter->attributes=$_POST["TeacherLetter"];
if ($teacherletter->validate())
{
....
Yii::app()->user->setFlash('messagemail','Письмо отправлено');
$this->refresh();
}
}
$this->render('index',array(
'dataProvider'=>$dataProvider,
'teachers'=>$teachers,
'teacherletter'=>$teacherletter,
));
Тяжела и неказиста жизнь простого программиста
Re: Передача модели при редиректе
Благодарю, идея понятна. Пока нет возможности проверить.
Но если кроме ошибок нужно передать и сам текст который уже был введен(чтобы после перезагрузки странички наново не вводить другие поля) наверно тут не подойдет, так как выведутся только ошибки
Но если кроме ошибок нужно передать и сам текст который уже был введен(чтобы после перезагрузки странички наново не вводить другие поля)
Код: Выделить всё
Yii::app()->user->setFlash('messageError',$model->getFirstError());
Re: Передача модели при редиректе
тогда я бы все валидировал бы в index.Wizlight писал(а):Благодарю, идея понятна. Пока нет возможности проверить.
Но если кроме ошибок нужно передать и сам текст который уже был введен(чтобы после перезагрузки странички наново не вводить другие поля)наверно тут не подойдет, так как выведутся только ошибкиКод: Выделить всё
Yii::app()->user->setFlash('messageError',$model->getFirstError());