web-dev-qa-db-ja.com

Yii2でフラッシュメッセージを設定する方法

私はこれに従いました リンク 。私のコードはコントローラで次のとおりです

public function actionFunction4()
    {
        $this->layout="sintel";
        $model= new Customers();
        \Yii::$app->getSession()->setFlash('success', 'successfully got on to the payment page');
        return $this->render("function4",['model'=>$model]);
    }

ビューで

 <div id="message">

          <?= Yii::$app->session->getFlash('success');?>
      </div>

今、私がしたことの結果は、私が期待したものではありません。 「支払いページにアクセスできました」というメッセージが表示されました。 echoに似ている場合、なぜYii2でフラッシュメッセージが必要なのですか。フラッシュメッセージが通常のメッセージのように見えるコードに何かが欠けていると思います。

18
Bloodhound

フラッシュメッセージの設定

フラッシュメッセージは、同じユーザーの1つまたは複数の要求を通じてメッセージをセッションに保持するために使用されます。デフォルトでは、ユーザーに表示された後、セッションから削除されます。

フラッシュメッセージは setFlash() メソッドを使用して設定できます

以下のようなコードをcontrollerファイルに追加します。

Yii::$app->session->setFlash('success', "Your message to display.");

例:

class ProductsController extends \yii\web\Controller
{
    public function actionCreate()
    {
         $model = new User();

         if ($model->load(Yii::$app->request->post())) {
              if ($model->save()) {
                  Yii::$app->session->setFlash('success', "User created successfully."); 
              } else {
                  Yii::$app->session->setFlash('error', "User not saved.");
              }
              return $this->redirect(['index']);
         }
         return $this->render('create', [
             'model' => $model
         ]);
    }
}

フラッシュメッセージの表示

フラッシュメッセージを確認するには hasFlash() メソッドを使用し、フラッシュメッセージを取得するには getFlash() メソッドを使用します。

デフォルトでは、メッセージをフェッチするとセッションから削除されます。これは、メッセージがユーザーに提供される最初のページにのみ表示されることを意味します。フェッチメソッドには、この動作を変更できるブールパラメータがあります。

したがって、viewで上記で定義されたフラッシュメッセージの表示は、

// display success message
<?php if (Yii::$app->session->hasFlash('success')): ?>
    <div class="alert alert-success alert-dismissable">
         <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
         <h4><i class="icon fa fa-check"></i>Saved!</h4>
         <?= Yii::$app->session->getFlash('success') ?>
    </div>
<?php endif; ?>

// display error message
<?php if (Yii::$app->session->hasFlash('error')): ?>
    <div class="alert alert-danger alert-dismissable">
         <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
         <h4><i class="icon fa fa-check"></i>Saved!</h4>
         <?= Yii::$app->session->getFlash('error') ?>
    </div>
<?php endif; ?>
41
vishuB

これは古いことは知っていますが、Google検索の最初の結果なので更新します。設定部分はyii2でも同じです。コントローラーでこれを追加するだけです。

Yii::$app->session->setFlash('danger', 'you message');

setFlashの最初の引数は次のいずれかです。

error,danger,success,info,warning

フラッシュメッセージのスタイルの色を決定します。

表示部分については、これをレイアウトファイルに配置するだけです。

<?= common\widgets\Alert::widget() ?>

レイアウトファイルがない場合は、falshメッセージを表示するビューに追加するだけです。

この答えが他の人に役立つことを願っています。

3
Anas Dawood

フラッシュメッセージの利点は、一度しか表示されないことです。もうif/elseロジックを提供する必要はありません。また、レイアウトビューファイル(多くの場合、view/layout/main.php)にフラッシュメッセージを表示するコードを配置すると、必要なすべてのアクションでフラッシュメッセージを設定でき、通常の応答またはリダイレクトを使用できます。一度だけ表示されること。それは人生を少し楽にします。それはフラッシュメッセージのアイデアです-それは一定期間後に消えるということではありません。

guide のフラッシュメッセージに関するセクションを参照してください。

3
robsch

少ないコード。他の条件が続く場合はしたくない場合

 Yii::$app->session->setFlash('msg', '
     <div class="alert alert-success alert-dismissable">
     <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
     <strong>Validation error! </strong> Your message goes here.</div>'
  );

そしてあなたの意見では

 <?= Yii::$app->session->getFlash('msg') ?>
1

以下は、製品を追加するためのコントローラークラスです。

class ProductsController extends \yii\web\Controller
{
    public function actionCreate()
    {
        $ProductsModel = new Products();

        if ($ProductsModel->load(Yii::$app->request->post()) && $ProductsModel->save()) {
            Yii::$app->session->setFlash('success', "Product Added Successfully");
            return $this->redirect(['create']);
        }
        else{ 
            return $this->render('create', [
                'ProductsModel' => $ProductsModel
            ]);
        }
    }
}
0