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');
        ?>

今、私がしなければならない2つのタスクがあります:

  • ユーザーが参照ボタンをクリックすると、フォームに入力した入力がフィルターに入力された状態でCGridViewが表示されます。

  • CGridViewフィルターを機能させます。

これがすべて正常に実行された場合、ユーザーが保存ボタンをクリックしたときに、lookupFieldの対応するIDをモデルに保存する必要があることを忘れないでください。

4

1 に答える 1

1

openダイアログのイベントにコールバック関数を提供するだけで、コールバック関数で

  1. jquery セレクターを使用して、選択したい (グリッドビューの) 入力フィルターを選択し、必要なフォームのフィールドからその値を入力します。

    $("#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関数を使用して、入力した値に従ってグリッドビューを更新するためにサーバーを呼び出します。

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

    jquery.yiigridview.jsファイルは、生成された html またはアセット フォルダーにあり、その中に関数が含ま$.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).

ほとんど忘れていましたが、グリッドビューのデータプロバイダーとフィルターを静的インスタンスではなくモデルインスタンスに変更してください。

于 2012-06-22T17:03:24.370 に答える