为Yii创建查找字段

时间:2012-06-22 11:02:33

标签: yii lookup yii-components

我正在尝试在我的应用程序中创建类似于查找字段。

目的是用户点击浏览按钮,然后弹出一个内部有网格(CGridView)的对话框(widget)。用户可以选择一行,并将“描述”列发送到我的表单中的textField。

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

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过滤器。

不要忘记,如果所有这些都成功运行,当用户点击保存按钮时,我将不得不在模型中保存lookupField的相应ID。

1 个答案:

答案 0 :(得分: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函数。

  3. 要订阅对话框的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)

    几乎忘记了,将数据提供者和网格视图的过滤器更改为模型实例,而不是静态实例。