如何在 Gridview 视图和更新按钮上实现 Yii2 模态对话框?
How to implement Yii2 Modal Dialog on Gridview view and update button?
我想在每行单击查看或更新按钮时在我的 gridview 上实现 Yii2 模态对话框。
任何人都可以请教如何实施它吗?
根据 arogachev 的建议:
这是我的代码更新
<?php
//var_dump($dataProvider);
$gridColumns = [
[
'format' => 'html',
'attribute' => 'avatar',
'label'=>'Image',
'headerOptions' => ['width' => '80%',],
],
[ 'class' => 'yii\grid\ActionColumn',
'template' => '{view} {delete}',
'headerOptions' => ['width' => '20%', 'class' => 'activity-view-link',],
'contentOptions' => ['class' => 'padding-left-5px'],
'buttons' => [
'view' => function ($url, $model, $key) {
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>','#', [
'id' => 'activity-view-link',
'title' => Yii::t('yii', 'View'),
'data-toggle' => 'modal',
'data-target' => '#activity-modal',
'data-id' => $key,
'data-pjax' => '0',
]);
},
],
],
];
?>
<?php
Pjax::begin();
echo \kartik\grid\GridView::widget([
'dataProvider' => $dataProvider,
'columns'=>$gridColumns,
'summary'=>false,
'responsive'=>true,
'hover'=>true
]);
Pjax::end();
?>
<?php $this->registerJs(
"$('.activity-view-link').click(function() {
$.get(
'imgview',
{
id: $(this).closest('tr').data('key')
},
function (data) {
$('.modal-body').html(data);
$('#activity-modal').modal();
}
);
});
"
); ?>
<?php
?>
<?php Modal::begin([
'id' => 'activity-modal',
'header' => '<h4 class="modal-title">View Image</h4>',
'footer' => '<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>',
]); ?>
<div class="well">
</div>
<?php Modal::end(); ?>
首先,您应该将 class 添加到视图 link,而不是 id,因为有多个元素:
选项更改:
'class' => 'activity-view-link',
在 JS 中:
$('.activity-view-link').click(function() {
您可以从相应的父元素中提取元素 ID tr
。它存储在 data-key
属性中。
$('.activity-view-link').click(function() {
var elementId = $(this).closest('tr').data('key');
}
请注意,在复合主键的情况下,它将是对象,而不是字符串/数字。
获得 ID 后,根据模型加载 AJAX 并将内容插入模态主体。
控制器中相关方法示例:
public function actionView($id)
{
$model = YourModel::findOne($id);
if (!$model) {
// Handle the case when model with given id does not exist
}
return $this->renderAjax('view', ['id' => $model->id]);
}
AJAX 调用示例:
$(".activity-view-link").click(function() {
$.get(
.../view // Add missing part of link here
{
id: $(this).closest('tr').data('key')
},
function (data) {
$('.modal-body').html(data);
$('#activity-modal').modal();
}
);
});
这是我处理这个问题的方法。首先我在网格视图中创建按钮如下:
[
'class' => 'yii\grid\ActionColumn',
'options'=>['class'=>'action-column'],
'template'=>'{update} {delete}',
'buttons'=>[
'update' => function($url,$model,$key){
$btn = Html::button("<span class='glyphicon glyphicon-pencil'></span>",[
'value'=>Yii::$app->urlManager->createUrl('example/update?id='.$key), //<---- here is where you define the action that handles the ajax request
'class'=>'update-modal-click grid-action',
'data-toggle'=>'tooltip',
'data-placement'=>'bottom',
'title'=>'Update'
]);
return $btn;
}
]
],
接下来将以下内容添加到您的视图文件中:
use yii\bootstrap\Modal;
并添加将包含模态内容的部分
<?php
Modal::begin([
'header'=>'<h4>Update Model</h4>',
'id'=>'update-modal',
'size'=>'modal-lg'
]);
echo "<div id='updateModalContent'></div>";
Modal::end();
?>
现在您需要 javascript(在本例中为 jQuery)来处理点击事件并进行 ajax 调用。我在 @web/scripts 文件夹文件中创建了一个 mymodal.js,如下所示:
$(function () {
$('.update-modal-click').click(function () {
$('#update-modal')
.modal('show')
.find('#updateModalContent')
.load($(this).attr('value'));
});
});
将此文件添加到托管您的 gridview 的视图文件中。
registerJsFile('@web/scripts/mymodal.js',['depends' => [\yii\web\JqueryAsset::className()]]);?>
剩下的就是设置处理您的 ajax 请求的操作。在 ExampleController.php 中(根据上面 gridview 按钮中的设置)添加以下操作:
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->validate() ) {
//prepare model to save if necessary
$model->save();
return $this->redirect(['index']); //<---This would return to the gridview once model is saved
}
return $this->renderAjax('update', [
'model' => $model,
]);
}
在此之后,您只需要确保您的 update.php 视图文件设置与模型表单和提交按钮就可以了。
我使用自然脚本添加了以下代码。
Yii::$app->urlManager->createUrl(['self-assessment-detail/update','id'=>$key])
我想在每行单击查看或更新按钮时在我的 gridview 上实现 Yii2 模态对话框。
任何人都可以请教如何实施它吗?
根据 arogachev 的建议: 这是我的代码更新
<?php
//var_dump($dataProvider);
$gridColumns = [
[
'format' => 'html',
'attribute' => 'avatar',
'label'=>'Image',
'headerOptions' => ['width' => '80%',],
],
[ 'class' => 'yii\grid\ActionColumn',
'template' => '{view} {delete}',
'headerOptions' => ['width' => '20%', 'class' => 'activity-view-link',],
'contentOptions' => ['class' => 'padding-left-5px'],
'buttons' => [
'view' => function ($url, $model, $key) {
return Html::a('<span class="glyphicon glyphicon-eye-open"></span>','#', [
'id' => 'activity-view-link',
'title' => Yii::t('yii', 'View'),
'data-toggle' => 'modal',
'data-target' => '#activity-modal',
'data-id' => $key,
'data-pjax' => '0',
]);
},
],
],
];
?>
<?php
Pjax::begin();
echo \kartik\grid\GridView::widget([
'dataProvider' => $dataProvider,
'columns'=>$gridColumns,
'summary'=>false,
'responsive'=>true,
'hover'=>true
]);
Pjax::end();
?>
<?php $this->registerJs(
"$('.activity-view-link').click(function() {
$.get(
'imgview',
{
id: $(this).closest('tr').data('key')
},
function (data) {
$('.modal-body').html(data);
$('#activity-modal').modal();
}
);
});
"
); ?>
<?php
?>
<?php Modal::begin([
'id' => 'activity-modal',
'header' => '<h4 class="modal-title">View Image</h4>',
'footer' => '<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>',
]); ?>
<div class="well">
</div>
<?php Modal::end(); ?>
首先,您应该将 class 添加到视图 link,而不是 id,因为有多个元素:
选项更改:
'class' => 'activity-view-link',
在 JS 中:
$('.activity-view-link').click(function() {
您可以从相应的父元素中提取元素 ID tr
。它存储在 data-key
属性中。
$('.activity-view-link').click(function() {
var elementId = $(this).closest('tr').data('key');
}
请注意,在复合主键的情况下,它将是对象,而不是字符串/数字。
获得 ID 后,根据模型加载 AJAX 并将内容插入模态主体。
控制器中相关方法示例:
public function actionView($id)
{
$model = YourModel::findOne($id);
if (!$model) {
// Handle the case when model with given id does not exist
}
return $this->renderAjax('view', ['id' => $model->id]);
}
AJAX 调用示例:
$(".activity-view-link").click(function() {
$.get(
.../view // Add missing part of link here
{
id: $(this).closest('tr').data('key')
},
function (data) {
$('.modal-body').html(data);
$('#activity-modal').modal();
}
);
});
这是我处理这个问题的方法。首先我在网格视图中创建按钮如下:
[
'class' => 'yii\grid\ActionColumn',
'options'=>['class'=>'action-column'],
'template'=>'{update} {delete}',
'buttons'=>[
'update' => function($url,$model,$key){
$btn = Html::button("<span class='glyphicon glyphicon-pencil'></span>",[
'value'=>Yii::$app->urlManager->createUrl('example/update?id='.$key), //<---- here is where you define the action that handles the ajax request
'class'=>'update-modal-click grid-action',
'data-toggle'=>'tooltip',
'data-placement'=>'bottom',
'title'=>'Update'
]);
return $btn;
}
]
],
接下来将以下内容添加到您的视图文件中:
use yii\bootstrap\Modal;
并添加将包含模态内容的部分
<?php
Modal::begin([
'header'=>'<h4>Update Model</h4>',
'id'=>'update-modal',
'size'=>'modal-lg'
]);
echo "<div id='updateModalContent'></div>";
Modal::end();
?>
现在您需要 javascript(在本例中为 jQuery)来处理点击事件并进行 ajax 调用。我在 @web/scripts 文件夹文件中创建了一个 mymodal.js,如下所示:
$(function () {
$('.update-modal-click').click(function () {
$('#update-modal')
.modal('show')
.find('#updateModalContent')
.load($(this).attr('value'));
});
});
将此文件添加到托管您的 gridview 的视图文件中。
registerJsFile('@web/scripts/mymodal.js',['depends' => [\yii\web\JqueryAsset::className()]]);?>剩下的就是设置处理您的 ajax 请求的操作。在 ExampleController.php 中(根据上面 gridview 按钮中的设置)添加以下操作:
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->validate() ) {
//prepare model to save if necessary
$model->save();
return $this->redirect(['index']); //<---This would return to the gridview once model is saved
}
return $this->renderAjax('update', [
'model' => $model,
]);
}
在此之后,您只需要确保您的 update.php 视图文件设置与模型表单和提交按钮就可以了。
我使用自然脚本添加了以下代码。
Yii::$app->urlManager->createUrl(['self-assessment-detail/update','id'=>$key])