当前位置: 首页 > 知识库问答 >
问题:

Kartik Select 2-以编程方式更改多个

姜志
2023-03-14

我有一个yii2activeform,其中表单的功能可以根据表单中的其他内容进行更改。所以,我有一个clubs字段,在某些情况下可以是多个字段,但在其他情况下不能是多个字段。

<?= $form->field($model, 'clubs')->widget(\kartik\widgets\Select2::classname(), [
    'data' => $club_data,
    'hideSearch' => false,
    'options' => ['placeholder' => 'Add Club(s)'],
    'pluginOptions' => [
        'allowClear' => true,
        'multiple' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => 'web/index.php?r=clubs/clubslist',
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }'),
        ],
    ],
])->label('Club(s)'); ?>

我需要通过编程将multiple-pluginOption更改为true和false。这应该是当用户进入表单时,也应该是当表单上的下拉列表更改时。我可以在用户最初进入表单时这样做,但在另一个下拉列表更改时不会立即这样做。

我已经创建了单独的字段,一个实际上链接到数据库中的字段,另一个没有链接到数据库中的字段,这种工作方式很有效,但它一点也不优雅!

我看了两个kartik select2留档和标准jQuery select2留档,我不能发现任何东西。任何帮助或指针将不胜感激。

共有1个答案

盖诚
2023-03-14

几个月前,我在一个Yii2-formwizard插件上工作,在那里我遇到了提供表格功能和克隆字段的情况,当涉及到使用第三方插件,如Select2Datepicker时,这真的成了屁股上的痛>我想出了以下代码以及许多其他代码(因为其他部分与您的问题无关,所以不添加它)。

按照Kartik-select2的工作方式,它将select2插件特定选项存储在正在使用select2的元素的data-krajee-select2属性中。主题或Kartik的插件特定选项(如theme)和其他选项保存在变量中,该变量的名称保存在data-s2-options属性中。您可以在正在使用它们的页面的“查看源”中查找它们。

所以你需要做的是

  • 获取应用的选项
  • 添加/更新选项
  • 应用回选项

由于您刚刚添加了一个字段,而不是其他字段,因此它将更改,我将演示一个示例,在该示例中,您可以使用两个不同的按钮将select2的行为从multiple更改为single,单击相关按钮select2将相应工作。您可以随时调整javascript代码。

但是在我添加任何代码之前,你需要修复一件事,当你使用插件选项中的ajax选项时,你不需要主data选项。换句话说,它对你的select2没有任何影响,只是增加了页面加载时间,你应该删除它。

你select2应该看起来像下面一样,我添加了id到select2的选项中,例如,你可以将其更改为活动形式格式化的名称,如field_name格式,如果你愿意,但不要忘记在javascript代码中更改id

<?php echo $form->field($model, 'clubs')->widget(\kartik\widgets\Select2::classname(), [
    'hideSearch' => false,
    'options' => ['placeholder' => 'Add Club(s)','id'=>'clubs'],
    'pluginOptions' => [
        'allowClear' => true,
        'multiple' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => 'web/index.php?r=clubs/clubslist',
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }')
        ]
    ]
])->label('Club(s)');?>

在页面上添加以下按钮

echo Html::button('multiple', ['class' => 'btn btn-info', 'id' => 'multi']);
echo Html::button('single', ['class' => 'btn btn-info', 'id' => 'single']);

现在神奇的东西,把它加在你的视野顶部

$js = <<<JS
    var element=$("#clubs");
    $('#multi').on('click',function(e){
        //reset select2 values if previously selected 
        element.val(null).trigger('change');

        //get plugin options
        let dataSelect = eval(element.data('krajee-select2'));

        //get kartik-select2 options
        let krajeeOptions = element.data('s2-options');

        //add your options
        dataSelect.multiple=true;

        //apply select2 options and load select2 again
        $.when(element.select2(dataSelect)).done(initS2Loading("clubs", krajeeOptions));
    });

    $('#single').on('click',function(e){
        element.val(null).trigger('change');
        let dataSelect = eval(element.data('krajee-select2'));
        let krajeeOptions = element.data('s2-options');
        dataSelect.multiple=false;
        $.when(element.select2(dataSelect)).done(initS2Loading("clubs", krajeeOptions));
    });
JS;

$this->registerJs($js, \yii\web\View::POS_READY);

现在,如果您的select2工作正常,请单击“多个”按钮,您将看到select2和单击“单个”按钮时启用了多个选项。

希望能有帮助。

 类似资料:
  • 我使用下面的hack以编程方式更改homeAsupIndicator。 但这在大多数新手机(HTC One、Galaxy S3等)上都不起作用。是否有一种方法可以跨设备统一更改。我只需要在主屏幕上更改它。其他屏幕将具有默认屏幕。因此无法使用样式。xml

  • 我已经读过一些关于颜色的线程,但所有这些线程都必须通过style.xml进行设置。 现在我用这个来确定颜色。 是否可以不使用XML,例如使用代码来更改SwitchCompat/Checkbox的颜色?

  • 问题内容: 我发现了只在Android N设备上才能复制的真正奇怪的错误。 在浏览我的应用程序时,可以更改语言。这是更改它的代码。 该代码在我的巡回活动(带电话)中效果很好,但是在接下来的所有活动中,所有String资源都是错误的。屏幕旋转将其修复。我该怎么办?我应该以其他方式更改Android N的语言环境还是仅仅是系统错误? PS这是我发现的。第一次启动MainActivity时(在​​我的旅

  • 问题内容: 我有一个带有标题的导航栏。当我双击文本以将其重命名时,它实际上说这是一个导航项,所以可能就是这样。 我正在尝试使用代码来更改文本,例如: 那显然不是我的代码,只是显示了它是如何工作的。 因此,每当我按下按钮时,我都希望标题更改。 问题答案: 您可以通过更改显示的视图控制器的标题来更改标题: 通常,这是在视图控制器上加载视图时完成的: 但是,这仅在将视图控制器嵌入UINavigation

  • 以编程方式更改我的附加程序的日志级别,或者受到其他来源的影响。 亲爱的社区。 Log4J2版本为:2.12。0 我的应用程序正在使用log4j2。xml,日志级别设置为INFO。我的应用程序也在读取另一个配置文件,我想在其中为我的用户设置日志级别,例如DEBUG。 当应用程序初始化时(从log4j2.xml),我想将all的级别更改为DEBUG from second source作为示例。所以我

  • 这里有个简单的问题。我有一个UIButton,currencySelector,我想通过编程更改文本。以下是我所拥有的: Xcode给了我一个错误“预期声明”。我做错了什么?我该如何更改按钮的文本?