1

我正在尝试在我的应用程序中制作类似查找字段的内容。

目的是用户单击浏览按钮,它会弹出一个对话框(小部件),里面有一个网格(CGridView)。用户可以选择一行,并将“描述”列发送到我的表单中的文本字段。

我已经通过在表单中​​注册以下脚本来完成这部分:

Yii::app()->clientScript->registerScript('scriptName', '
function onSelectionChange()
{
        var keys = $("#CGridViewUsuario > div.keys > span");

        $("#CGridViewUsuario > table > tbody > tr").each(function(i)
        {
                if($(this).hasClass("selected"))
                {
                        $("#Funcionario_UsuarioId").val($(this).children(":nth-child(1)").text());
                }
        });
}
');

还有我的小部件:

            <?php $this->beginWidget('zii.widgets.jui.CJuiDialog', array(
                    'id'=>'mydialog',

                    'options'=>array(
                        'title'=>'Usuário',
                        'width' => 'auto',
                        'autoOpen'=>false,
                    ),
                ));

            $this->widget('zii.widgets.grid.CGridView', array(
                'dataProvider' => Usuario::model()->searchByLogin($model->UsuarioId),
                'id' => 'CGridViewUsuario',
                'filter' => Usuario::model(),
                'columns' => array(
                    'Login',
                    'Nome',
                ),
                'htmlOptions' => array(
                    'style'=>'cursor: pointer;'
                    ),                   
                'selectionChanged'=>'js:function(id){ onSelectionChange(); }',
            ));

            $this->endWidget('zii.widgets.jui.CJuiDialog');
        ?>

现在我有两个任务要做:

  • 当用户单击浏览按钮时,CGridView 应该会出现,其中过滤器已经填充了他在表单中键入的输入。

  • 让 CGridView 过滤器工作。

别忘了,如果这一切运行成功,当用户点击保存按钮时,我将不得不在模型中保存查找字段的相应 ID。

4

1 回答 1

1

您可以简单地为对话框的open事件提供一个回调函数,并在回调函数中

  1. 使用 jquery 选择器选择您想要选择的输入过滤器(gridview),并从您想要的表单中的任何字段填充其值:

    $("#CGridViewUsuario .filters input[name='Userio[login]']").val($("#Funcionario_UsuarioId").val());
    // replace the names/ids to whatever you are using,
    // if you want to set multiple values, then you might have to run a loop or each() or something of that sort
    
  2. 然后使用jquery.yiigridview.js '$.fn.yiiGridView.update函数调用服务器根据您填充的值更新gridview :

    $.fn.yiiGridView.update("CGridViewUsuario", {
       data: $("#CGridViewUsuario .filters input").serialize()
    });
    

    您可以在生成的 html 或您的资产文件夹中看到jquery.yiigridview.js$.fn.yiiGridView.update文件,并在其中找到该函数。

要订阅对话框的open事件,您可以将函数名称传递给'open'对话框'options'字段的选项:

$this->beginWidget('zii.widgets.jui.CJuiDialog', array(
                'id'=>'mydialog',

                'options'=>array(
                    'title'=>'Usuário',
                    // other options

                    'open'=>'js:dialogOpenCallback'
                ),
));

您可以在registerScript()调用本身中定义函数:

<?php
  Yii::app()->clientScript->registerScript('scriptName', '
    function onSelectionChange()
    {...}

    function dialogOpenCallback(event,ui){
       $("#CGridViewUsuario .filters input[name='Userio[login]']").val($("#Funcionario_UsuarioId").val());
       // replace the names/ids to whatever you are using,
       $.fn.yiiGridView.update("CGridViewUsuario", {
          data: $("#CGridViewUsuario .filters input").serialize()
       });
    }
   ');

此外,您可以更改调用onSelectionChange()函数的方式:

'selectionChanged'=>'js:onSelectionChange'//'js:function(id){ onSelectionChange(); }',

并更改您的函数签名:function onSelectionChange(id).

差点忘了,将gridview的数据提供者和过滤器更改为模型实例,而不是静态实例。

于 2012-06-22T17:03:24.370 回答