【问题标题】:How to implement Yii2 Modal Dialog on Gridview view and update button?如何在 Gridview 视图和更新按钮上实现 Yii2 模态对话框?
【发布时间】:2015-02-06 04:05:29
【问题描述】:

当在每一行单击查看或更新按钮时,我想在我的 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(); ?>

【问题讨论】:

  • 在这种情况下如何打开实际的查看/更新页面?在弹出框内容中有链接?
  • 嗨 arogachev,在 gridview 中,当我单击眼睛按钮时,视图页面将在模态中启动,当我单击铅笔按钮时,更新页面将在模态中启动。实际的查看/更新页面是一个可以自行启动的url页面。
  • 这有点像在 Yii1 中,使用 CJuiDialog 来编辑 CGridView 中的行,只是我需要在 Yii2 中实现它,我无法在网上找到任何指南。
  • 嗨,我在网上找到了一些与我想要的代码相似的代码,但是我不知道如何将所选行的 id 发送到模态 url,以便我可以在里面加载相关模型那个对话框。
  • 我不明白,模态与弹出框有什么关系?弹出框类似于工具提示,但在单击而不是悬停时显示。

标签: gridview dialog modal-dialog yii2


【解决方案1】:

首先您应该将 class 添加到视图链接,而不是 id,因为有多个元素:

选项变化:

'class' => 'activity-view-link',

在 JS 中:

$('.activity-view-link').click(function() {

您可以从对应的父 tr 中提取元素 id。它存储在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();
        }  
    );
});

【讨论】:

    【解决方案2】:

    这就是我的处理方式。首先,我在网格视图中创建了如下按钮:

    [
        '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 视图文件,并且一切顺利。

    【讨论】:

      【解决方案3】:

      我使用自然脚本添加了以下代码。

      Yii::$app->urlManager->createUrl(['self-assesment-detail/update','id'=>$key])

      【讨论】:

      • 稍微解释一下会很有帮助!
      • 添加说明如何回答问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 2012-11-28
      • 1970-01-01
      • 2021-03-03
      • 2013-10-25
      相关资源
      最近更新 更多