为Yii创建查找字段

为Yii创建查找字段,yii,lookup,yii-components,Yii,Lookup,Yii Components,我试图在我的应用程序中创建一个类似的查找字段 用户点击浏览按钮,弹出一个对话框(小部件),里面有一个网格(CGridView)。用户可以选择一行,“描述”列被发送到我的表单中的文本字段 我已经通过在表单中注册以下脚本完成了这一部分: Yii::app()->clientScript->registerScript('scriptName', ' function onSelectionChange() { var keys = $("#CGridViewUsuario

我试图在我的应用程序中创建一个类似的查找字段

用户点击浏览按钮,弹出一个对话框(小部件),里面有一个网格(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');
        ?>

现在我有两项任务要做:

  • 当用户单击browse按钮时,CGridView应该出现 过滤器中已经填入了他在表单中输入的内容

  • 让CGridView过滤器工作


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

您只需在回调函数中为对话框的
open
事件提供回调函数即可

  • 使用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
    
  • 然后使用jquery.yiigridview.js'
    $.fn.yiigridview.update
    函数调用服务器,根据填充的值更新gridview:

    $.fn.yiiGridView.update("CGridViewUsuario", {
       data: $("#CGridViewUsuario .filters input").serialize()
    });
    
    'selectionChanged'=>'js:onSelectionChange'//'js:function(id){ onSelectionChange(); }',
    
    您可以在生成的html或资产文件夹中看到jquery.yiigridview.js文件,您可以在其中找到
    $.fn.yiigridview.update
    函数

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

    $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()
           });
        }
       ');
    
    并更改您的函数签名:
    选择上的函数更改(id)


    几乎忘记了,将gridview的数据提供程序和过滤器更改为模型实例,而不是静态实例。

    您只需为对话框的
    打开事件和回调函数提供回调函数即可

  • 使用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
    
  • 然后使用jquery.yiigridview.js'
    $.fn.yiigridview.update
    函数调用服务器,根据填充的值更新gridview:

    $.fn.yiiGridView.update("CGridViewUsuario", {
       data: $("#CGridViewUsuario .filters input").serialize()
    });
    
    'selectionChanged'=>'js:onSelectionChange'//'js:function(id){ onSelectionChange(); }',
    
    您可以在生成的html或资产文件夹中看到jquery.yiigridview.js文件,您可以在其中找到
    $.fn.yiigridview.update
    函数

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

    $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()
           });
        }
       ');
    
    并更改您的函数签名:
    选择上的函数更改(id)


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

    您尝试过什么吗?我想我可以做到这一点,但我不想重复您已经尝试过的内容,将上面的代码段中的“dataprovider”更改为$model->search(),将“filters”更改为$model您尝试过什么吗?我想我可以做到这一点,但我不想重复您已经尝试过的内容,尝试上面的代码段,并将“dataprovider”更改为$model->search(),将“filters”更改为$model如果您认为我遗漏了任何内容,请告诉我,我将说明我正在尝试。我必须在gridView的dataProvider和筛选器中使用的模型实例。。。它们是我外键的模型吗?现在一切都很顺利。过滤器正在工作,但仅当我使用它按Id进行过滤时。例如,我想通过相关模型的描述字段进行过滤(Functionario有一个Usuario)。当然,数据提供者和过滤器将是相关模型,因为网格是相关模型的,即Usuario。对于你的第二条评论,Usuario是否有一个描述字段?好的,那么你必须改变一些事情,首先在网格中,你必须添加该列,即网格的列字段应该如下所示:
    'columns'=>数组('Login','Nome','Description'),
    ,然后填充值,就像我为Login所做的那样。如果您认为我遗漏了任何内容,请告诉我,我会澄清我正在尝试。我必须在gridView的dataProvider和筛选器中使用的模型实例。。。它们是我外键的模型吗?现在一切都很顺利。过滤器正在工作,但仅当我使用它按Id进行过滤时。例如,我想通过相关模型的描述字段进行过滤(Functionario有一个Usuario)。当然,数据提供者和过滤器将是相关模型,因为网格是相关模型的,即Usuario。对于你的第二条评论,Usuario是否有一个描述字段?好的,那么你必须改变一些事情,首先在网格中,你必须添加该列,即网格的列字段应该如下所示:
    'columns'=>数组('Login','Nome','Description'),
    ,然后填充值,就像我在登录时所做的那样