前回の記事では、作成を例にYii2のモーダルポップアップウィンドウの使い方(基本的な使い方)を紹介しました。
実際の開発では、一覧ページのデータを変更するためにモーダルを使用する場面がよくありますが、一般的なループ表示であれば、モーダルの基本的な使い方を見た上で操作できる人が多いと思います。 GridView と組み合わせることで操作できるようになる人もいると思われます。この問題を解決する方法を見てみましょう。
1. グリッドビューオペレーションに[更新]ボタンを追加し、data-toggleのデータ対象クラスとdata-idの値を指定します
[ 'class' => 'yii\grid\ActionColumn', 'template' => '{update}', 'buttons' => [ 'update' => function ($url, $model, $key) { return Html::a('更新', '#', [ 'data-toggle' => 'modal', 'data-target' => '#update-modal', 'class' => 'data-update', 'data-id' => $key, ]); }, ], ],
2. 更新用のモーダルを追加します
<?php use yii\bootstrap\Modal; // 更新操作 Modal::begin([ 'id' => 'update-modal', 'header' => '<h4 class="modal-title">更新</h4>', 'footer' => '<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>', ]); $requestUpdateUrl = Url::toRoute('update'); $updateJs = <<<JS $('.data-update').on('click', function () { $.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') }, function (data) { $('.modal-body').html(data); } ); });
JS;
$this->registerJs($updateJs); Modal::end(); ?>
3. 更新メソッドを変更します
public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['index']); } else { return $this->renderAjax('update', [ 'model' => $model, ]); } }
プロセス全体は、前に説明したモーダルの基本的な使用法と何ら変わらないことがわかります。しかし、これで終わるわけではありません。ほとんどの人は、解決が難しい次のような一般的な問題に遭遇する可能性があると思います。
select2 が yii2 モーダルで使用されているのですが、検索ボックスが検索できないのはなぜですか?
yii2 1 つのページに複数のモーダルがあるのですが、なぜ複数のページが 1 つのページを共有し、データが読み込まれるまで待機するのですか?
yii2 単一のページに複数のモーダルがあります。例として、単一のページを追加して上記のグリッドビューを更新すると、更新された select2 が無効になり無効になります。
これらの問題を 1 つずつ解決する方法を見てみましょう:
まず最初の質問は、モーダルの使用開始時に options オプションの tabindex を false に指定するだけでよいということです。参考は次のとおりです。
Modal::begin([ // ...... 'options' => [ 'tabindex' => false ], ]);
2 番目と 3 番目の問題は、1 つのページで複数のモーダルを使用することによって発生します。この問題を説明するために、リストの [作成] ボタンとグリッドビューの [更新] ボタンの両方でモーダルを使用します。 Yii2 でのモーダルポップアップの使い方 (基本的な使い方) とこの記事によると、最初の問題は明らかに
です。$('.modal-body').html(data);
複数のモーダルが原因で、初めてモーダルを使用した後、すべてのモーダルの本体に値が割り当てられるため、後で他のモーダルを使用したときに、データが要求される前に同じ内容が表示されます。この問題を解決するには、各非同期リクエストの後にそれぞれのモーダル本体に個別の値を割り当てるだけで済みます。コードは次のように参照できます。
$('#create').on('click', function () { $.get('url', {}, function (data) { $('#create-modal').find('.modal-body').html(data); // $('.modal-body').html(data); } ); }); $('.data-update').on('click', function () { $.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') }, function (data) { $('#update-modal').find('.modal-body').html(data); // $('.modal-body').html(data); } ); });
このトピックで紹介した例のように、フォームにselect2が含まれていると、[作成]操作時のみselect2フィールドが正常になり、[更新]操作時はselect2フィールドが「非表示」になります。 ] 手術!
これは実際には、同じページ上の同じ select2 に対応する ID が原因で発生します。この問題を解決するには、データの各非同期リクエストの前に、ページ上の既存のフォーム項目をすべて削除するだけです。具体的な実装を参照してください:
$('#create').on('click', function () { // 有效避免multiply modal select2的问题 // 移除异步加载过来的form表单 $('.document-nav-form').remove(); $.get('{$requestUrl}', {}, function (data) { $('#create-modal').find('.modal-body').html(data); } ); }); $('.data-update').on('click', function () { // 有效避免multiply modal select2的问题 // 移除异步加载过来的form表单 $('.document-nav-form').remove(); $.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') }, function (data) { $('#update-modal').find('.modal-body').html(data); } ); });