Передача модели при редиректе

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Wizlight
Сообщения: 46
Зарегистрирован: 2015.03.01, 04:15

Передача модели при редиректе

Сообщение Wizlight »

Возник вопрос, как правильно делают в такой ситуации?
Есть экшн который делает некоторые операции - генерирует датапровайдер для виджетов и т.д., а потом рендерит страничку. В этой странички кроме других элементов, с помощью рендер партиал выводится форма, ну например регистрации, которая имеет кнопку отправки формы. При нажатии на кнопку исполняется другой экшн, в конце которого должно вернуть на предыдущую страничку(я это делаю с помощью редиректа с ссылкой на первый экшн). Если форма отправки валидацию не прошла, как правильно передать модель с ошибками в форму? Рендером? Ну тогда снова нужно в этом экшене генерить датапровайдер(как в первом экшене) и делать другие операции результаты которых нужны для этой странички? Проще было б отправить модель формы через редирект, но параметрами редиректа модель не может быть?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передача модели при редиректе

Сообщение zelenin »

ничерта не понятно. Скажу одно: редиректом занимается сервер, поэтому забудьте о передачах моделей.
Wizlight
Сообщения: 46
Зарегистрирован: 2015.03.01, 04:15

Re: Передача модели при редиректе

Сообщение Wizlight »

Ну тогда как решить задачу.
Есть страничка с разными виджетами которые принимают dataprovider с контролера
Есть на страничке форма. Как передать в форму ошибки если данные отправляются постом и не проходят валидацию.

Когда страничка состоит из одной формы тогда все просто, делаем в экшене который вызывается для отправки формы в конце
например
$this->render("pageform", array('model'=>$model));

А как отрендерить форму с ошибками и другие элементы странички если страничка состоит не с одной формы?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передача модели при редиректе

Сообщение zelenin »

а какая разница? все формы принимают на вход модели, все модели валидируются в контроллере, значит все модели вместе с ошибками передаются во вьюшку. Причем тут редирект?
Wizlight
Сообщения: 46
Зарегистрирован: 2015.03.01, 04:15

Re: Передача модели при редиректе

Сообщение Wizlight »

Ладно, не о редиректе речь. Не хотел создавать новую тему.
Вот у меня экшн 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,
        ));
    } 
в представлении index рендерпартиал формы

Код: Выделить всё

    <?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(); ?>
Экшн обработки формы teachers/teacherletter который меня и интересует, как правильно прописать?? Если модель $teacherletter=new TeacherLetter() уже была создана в actionIndex, то ниже ее не создаем, но как ее тогда передать в экшн TeacherLetter ниже?
Если создавать модель не в 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 ??????
    } 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передача модели при редиректе

Сообщение zelenin »

да вроде все верно. модель создаем.
Wizlight
Сообщения: 46
Зарегистрирован: 2015.03.01, 04:15

Re: Передача модели при редиректе

Сообщение Wizlight »

а что написать в конце после ?
Нужно же страничку с ошибками отображать после валидации
Если редирект на actionIndex модель с ошибками не отобразится, если рендер index то еще нужно передавать

Код: Выделить всё

'dataProvider'=>$dataProvider,
'teachers'=>$teachers, 
это почти весь код с actionIndex
:?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передача модели при редиректе

Сообщение zelenin »

а, я понял вашу проблему.
тогда так:

Код: Выделить всё

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: Передача модели при редиректе

Сообщение valentinich »

Еще как вариант делать валидацию в экшене 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,
        ));
 
Тяжела и неказиста жизнь простого программиста :|
Wizlight
Сообщения: 46
Зарегистрирован: 2015.03.01, 04:15

Re: Передача модели при редиректе

Сообщение Wizlight »

Благодарю, идея понятна. Пока нет возможности проверить.
Но если кроме ошибок нужно передать и сам текст который уже был введен(чтобы после перезагрузки странички наново не вводить другие поля)

Код: Выделить всё

Yii::app()->user->setFlash('messageError',$model->getFirstError()); 
наверно тут не подойдет, так как выведутся только ошибки
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передача модели при редиректе

Сообщение zelenin »

Wizlight писал(а):Благодарю, идея понятна. Пока нет возможности проверить.
Но если кроме ошибок нужно передать и сам текст который уже был введен(чтобы после перезагрузки странички наново не вводить другие поля)

Код: Выделить всё

Yii::app()->user->setFlash('messageError',$model->getFirstError());
наверно тут не подойдет, так как выведутся только ошибки
тогда я бы все валидировал бы в index.
Ответить