动态形式wbraganca中的yii2插件仅适用于第一个元素

时间:2017-03-27 07:51:42

标签: yii2

我在wbraganca动态表单中使用了一些插件(yii \ widgets \ MaskedInput和kartik \ select2 \ Select2)。 我注意到这两个插件只在第一个元素上起作用。 请指教。谢谢你。 我的代码就像这样

<?= $form->field($detail, "[{$i}]item_id")->widget(Select2::classname(), [
    'data' => ArrayHelper::map(Item::find()->all(), 'id', 'name'),  
    'language' => 'en',
    'options' => ['placeholder' => 'Select Items ...', 'onchange' => 'getItemPrice($(this))'],
    'pluginOptions' => [
        'allowClear' => true
    ],
]) ?>

<?= $form->field($detail, "[{$i}]qty")->widget(\yii\widgets\MaskedInput::className(),
[
    'clientOptions' => [
    'alias' => 'numeric',
    'groupSeparator' => ',',
    'digits' => 0,
    'autoGroup' => true,
    'removeMaskOnSubmit' => true,
    'rightAlign' => false,                                  
    ],
    'options' => [
       'class' => 'form-control',
       'onchange' => 'calculateSubtotal($(this))',                                  
    ]                               
]) ?>

4 个答案:

答案 0 :(得分:3)

最后,我找到了这个问题的答案。它实际上是在github.com/wbraganca中回答的。 我在这做什么: 1.对于kartik / select2,修改源代码 yii2-dynamic-form.js (记得删除web / assets文件以使其生效)

// "kartik-v/yii2-widget-select2"
   var $hasSelect2 = $(widgetOptionsRoot.widgetItem).find('[data-krajee-select2]');
   if ($hasSelect2.length > 0) {
      $hasSelect2.each(function() {
          var id = $(this).attr('id');
          var configSelect2 = eval($(this).attr('data-krajee-select2'));

                // $(this).select2('destroy');
                if ($(this).data('select2')) {
                    $(this).select2('destroy');
                }

                var configDepdrop = $(this).data('depdrop');
                if (configDepdrop) {
                    configDepdrop = $.extend(true, {}, configDepdrop);
                    $(this).removeData().off();
                    $(this).unbind();
                    _restoreKrajeeDepdrop($(this));
                }
                var s2LoadingFunc = typeof initSelect2Loading != 'undefined' ? initSelect2Loading : initS2Loading;
                var s2OpenFunc = typeof initSelect2DropStyle != 'undefined' ? initSelect2Loading : initS2Loading;
                $.when($('#' + id).select2(configSelect2)).done(s2LoadingFunc(id, '.select2-container--krajee'));

                var kvClose = 'kv_close_' + id.replace(/\-/g, '_');

                $('#' + id).on('select2:opening', function(ev) {
                    s2OpenFunc(id, kvClose, ev);
                });

                $('#' + id).on('select2:unselect', function() {
                    window[kvClose] = true;
                });

                if (configDepdrop) {
                    var loadingText = (configDepdrop.loadingText) ? configDepdrop.loadingText : 'Loading ...';
                    initDepdropS2(id, loadingText);
                }                
            });
        }
  1. 对于yii / widgets / MaskedInput,还要更改 yii2-dynamic-form.js (添加一些代码): var _restoreSpecialJs = function(widgetOptions) { var widgetOptionsRoot = _getWidgetOptionsRoot(widgetOptions); // "jquery.inputmask" var $hasInputmask = $(widgetOptionsRoot.widgetItem).find('[data-plugin-inputmask]'); if ($hasInputmask.length > 0) { $hasInputmask.each(function() { $(this).inputmask('remove'); $(this).inputmask(eval($(this).attr('data-plugin-inputmask'))); }); }
  2. 然后将MaskedInput.php复制到您的文件夹项目(我的:models \ MaskedInput.php)并更改此代码

    $view->registerJs("var {$this->_hashVar} = {$encOptions};", View::POS_READY);
    

    $view->registerJs("var {$this->_hashVar} = {$encOptions};", View::POS_END);
    

    请记住从编辑过的文件中使用MaskedInput。 谢谢。

答案 1 :(得分:0)

我想要在添加新元素(表单)时重新初始化小部件。请参阅下面的链接,这不是您想要的,但与您的情况相同。

wbraganca yii2 dynamic form date picker issue?

答案 2 :(得分:0)

作曲家需要pceuropa / yii2-forms dev-master

答案 3 :(得分:0)

在阅读了wbraganca github中的一些问题之后,我决定从该回购中使用这个分支。

https://github.com/vivekmarakana/yii2-dynamicform

但是在某些情况下,widgetOptions数组中的那个叉子仍然存在问题。通过在错误行中删除该索引([i])来手动修复它们。