2016-06-22 4 views
1

После отправки формы, если модель найдена в контроллере, представление отображается с установленным флэш-сообщением, но также с настраиваемым сообщением, например hello <?= $model->username; ?>, если применимо.Yii2 в форме представления модели имеет значение null после перенаправления

Все работало нормально, пока я не решил, что мне будет интересно добавить return $this->refresh();, чтобы предотвратить повторное заполнение формы. Что в конечном счете бросает Trying to get property of non-object на вид, так как модель находится в хорошем состоянии null.

Как я вижу, метод перенаправления предотвращает выполнение метода рендеринга, поэтому переменная модели отправляется в представление.

Я использую метод POST http, я думаю, я мог бы изменить GET, если это необходимо. Представляете ли вы, как это сделать?

CONTROLLER

public function actionIndividualSearch() { 
 
     
 
     $model = new Order(); 
 
     $model->scenario = Order::SCENARIO_SEARCH; 
 

 
     if ($model->load($post = Yii::$app->request->post()) && $model->validate()){ 
 
     //if ($model->load($post = Yii::$app->request->get()) && $model->validate()){ 
 

 
      $model = Order::find()->where(['number' => $post['Order']['number']])->one(); 
 
      
 
      $flash = $model ? ($model->status == Order::STATUS_COMPLETED ? 'orderCompleted' : 'orderNotCompleted') : 'orderNotFound'; 
 
      Yii::$app->session->setFlash($flash); 
 

 
      return $this->refresh(); 
 
      //return $this->redirect(['', 'model'=>$post['Order']['number']]); 
 
     } 
 

 
     return $this->render('individualSearch', [ 
 
      'model' => $model, 
 
     ]); 
 
    }

VIEW

<?php 
 

 
use yii\widgets\DetailView; 
 
use yii\helpers\Html; 
 

 
?> 
 

 
<div class="page-header"> 
 
    <h1>Consulta tu Orden</h1> 
 
</div> 
 

 
<p>Por favor introdusca el número de orden impreso en su ticket.</p> 
 

 
<?php echo $this->render('_search', ['model' => $model]); ?> 
 

 
    <?php if(Yii::$app->session->hasFlash('orderCompleted')): ?> 
 
    Hi <?= Html::encode($model->customer->first_name); ?> ... 
 

 
    <?php elseif(Yii::$app->session->hasFlash('orderNotCompleted')): ?> 
 
     Hi <?= Html::encode($model->customer->first_name); ?> ... 
 
    
 
<?php elseif(Yii::$app->session->hasFlash('orderNotFound')): ?> 
 
     Dear Customer... 
 
    <?php endif; ?>

+0

Попытка получить свойство не объекта: в какой строке отображается ошибка? Вы перешли чек. Потому что, отсюда все кажется ОК. –

+0

Проблема заключается в том, как отправить модель с контроллера на представление. Как после '$ this-> refresh', он становится нулевым. [см.] (http://stackoverflow.com/questions/37959760/yii2-in-a-form-submission-model-is-null-after-redirect/37966072#comment63408655_37966072) @nana – Decimoseptimo

ответ

0

После обновления вашей модели заказа пуст и $model->customer равна нулю.

И вы пытаетесь получить $model->customer->first_name в поле зрения.

+0

Да, я думаю, я подразумевал, что в вопрос. Истинный вопрос: как снова сделать модель доступной? один из способов, который я могу представить, это создать его как переменную контроллера, а затем в представлении получить доступ к нему как '$ this-> context-> model', я думаю, что это можно было бы сделать. Другой способ изменяет форму на GET, так что модель всегда подразумевается как параметр запроса ID, НО в этом случае на каждой странице перезагружать/обновлять форму будет повторно отправлено, правильно?, Флеш-сообщение всегда будет быть сгенерированным ... @urmaul – Decimoseptimo

+0

Усушно у вас есть отдельная страница «Просмотр порядка» и перенаправление на нее вместо обновления. – urmaul

0

Ответ был связан с использованием переменных сеанса, типа вспышки. Это позволило мне сохранить переменные между запросами. Спасибо всем.