【问题标题】:Yii2 - How can I add a search in Dropdownlist WidgetYii2 - 如何在下拉列表小部件中添加搜索
【发布时间】:2016-11-13 14:36:14
【问题描述】:

美好的一天!

如何在下拉列表上添加搜索

我想要像 Select2 小部件这样的下拉搜索。

下拉列表:

<?= $form->field($modelRis, "[{$i}]lib_item_item_id")->dropDownList(
ArrayHelper::map(LibItem::find()->orderBy('item_description')->all(), 'item_id', 'item_description'),
[
    'prompt'=>'Select Item',
    'onchange'=>'
            var tmp = $(this).attr("id");
            var thisId = tmp.split("-");

            var tmp2 = "";
            var tmp3 = "";

            var sample_id = $(this).val();

            $.post( "'.Yii::$app->urlManager->createUrl(['online-requisition/listsofunit?item_id=']).'"+$(this).val(),
            function( data ) {
                $( "#risrequesteditem-"+thisId[1]+"-lib_unit_id").html( data );

                $( "#loop-"+thisId[1]+"-lib_item_item_id").val( sample_id );

                tmp2 = data;
                tmp3 = tmp2.split("=====");
                $( "#loop-"+thisId[1]+"-available_stock").val( tmp3[1] );
            });
        ',
    'pluginOptions' => [
            'allowClear' => true
    ],
])->label('Item',['class'=>'label-class']); ?>

我无法使用 select2 小部件,因为不支持 'onchange' 或这行代码:

'onchange'=>'
            var tmp = $(this).attr("id");
            var thisId = tmp.split("-");

            var tmp2 = "";
            var tmp3 = "";

            var sample_id = $(this).val();

            $.post( "'.Yii::$app->urlManager->createUrl(['online-requisition/listsofunit?item_id=']).'"+$(this).val(),
            function( data ) {
                $( "#risrequesteditem-"+thisId[1]+"-lib_unit_id").html( data );

                $( "#loop-"+thisId[1]+"-lib_item_item_id").val( sample_id );

                tmp2 = data;
                tmp3 = tmp2.split("=====");
                $( "#loop-"+thisId[1]+"-available_stock").val( tmp3[1] );
            });
        ',

谢谢...

更新:

如果我要使用 select2 小部件以便在选择项目期间具有搜索功能,则会出现问题。

在:

第一个选择它的工作:

onchange 功能 也一直在工作。并在选择项目后自动填写表单字段中的所有数据(项目编号、单位和库存可用)。 1st Selection

第二个选择不起作用: 但我可以选择一个项目。只有jquery函数onchange是问题...... 2nd Selection

谢谢...

【问题讨论】:

  • 对不起,我不太明白你的问题。你的问题到底是什么,你想达到什么目标?
  • 谢谢,如何在 dropdownlist 小部件上添加 search

标签: yii2


【解决方案1】:

按照上面 Ajith 的建议,您应该使用来自 http://demos.krajee.com/widget-details/select2 的 Yii2 Select2 Widget

如果你仔细看细节你会发现上面的小部件确实允许你通过使用小部件的pluginEvents参数设置来添加事件处理程序。

pluginEvents = [
"change" => "function() { log('change'); }",
"select2:opening" => "function() { log('select2:opening'); }",
"select2:open" => "function() { log('open'); }",
"select2:closing" => "function() { log('close'); }",
"select2:close" => "function() { log('close'); }",
"select2:selecting" => "function() { log('selecting'); }",
"select2:select" => "function() { log('select'); }",
"select2:unselecting" => "function() { log('unselecting'); }",
"select2:unselect" => "function() { log('unselect'); }"

];

虽然在不知道代码 sn-p 的上下文等的情况下无法提供正确的代码,但是可以使用 Yii2 Select2 小部件重写它,如下所示(下面的代码未经测试,但应该让您了解结构):

use kartik\widgets\Select2;

$data = ArrayHelper::map(LibItem::find()->orderBy('item_description')->all(), 'item_id', 'item_description');

// Usage with ActiveForm and model
echo $form->field($modelRis, "[{$i}]lib_item_item_id")->widget(Select2::classname(), [
    'data' => $data,
    'options' => ['placeholder' => 'Select Item'],
    'pluginOptions' => [
        'allowClear' => true
    ],
    'pluginEvents' => [
        'select2:select' => 'function(e) { 
            var tmp = e.target.id; 
            var thisId = tmp.split("-");

            var tmp2 = "";
            var tmp3 = "";

            var sample_id = e.target.value;

            $.post( "'.Yii::$app->urlManager->createUrl(['online-requisition/listsofunit?item_id=']).'"+$(this).val(),
            function( data ) {
                $( "#risrequesteditem-"+thisId[1]+"-lib_unit_id").html( data );

                $( "#loop-"+thisId[1]+"-lib_item_item_id").val( sample_id );

                tmp2 = data;
                tmp3 = tmp2.split("=====");
                $( "#loop-"+thisId[1]+"-available_stock").val( tmp3[1] );
            });
        }
        '
    ],
]);

请注意,我使用select2:select 作为事件处理程序。

我不得不提供这个作为单独的答案,因为我没有足够的声誉来添加评论。

【讨论】:

  • 谢谢@sm1979 但是当我使用select2小部件并在该小部件中添加插件事件时,事件中的更改功能没有加载,我不知道为什么..我要去更新我的帖子
【解决方案2】:

您可以为此目的使用yii2 select2 widget。在

上有很好的演示文档

http://demos.krajee.com/widget-details/select2

下面给出了一个使用主动表单的示例

// Usage with ActiveForm and model
echo $form->field($model, 'state_1')->widget(Select2::classname(), [
    'data' => $data,// the select option data items.The array keys are option values, and the array values are the corresponding option labels
    'options' => ['placeholder' => 'Select a state ...'],
    'pluginOptions' => [
        'allowClear' => true
    ],
    'pluginEvents' => [
         'change' => 'function(){// write your on change code here}'
     ]
]);

【讨论】:

  • tnx 用于回复.. 但我不能使用 select2 小部件,因为我不知道如何在该小部件中添加 onchange 功能......我将用完整的更新我的帖子下拉列表的代码..
  • 在 Yii2 select2 小部件的文档中有一个名为 pluginEvents 的属性,您可以在其中编写 @sm1979 提到的 select2 jquery 事件。对于您的代码,您必须为此目的使用更改事件。我有编辑了我的答案以包含更改事件
  • 非常感谢@Ajith 我真的很感谢你的帮助.. 但是当我使用 select2 小部件并在该小部件中添加插件事件时,未加载事件中的更改功能,我不知道为什么..我要更新我的帖子..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多