0

我在结合 YII 框架的扩展“EchMultiSelect”和“MultiModelForm”时遇到了一点问题。

我想要做的是复制一组表单元素,其中一个元素是 EchMultiSelect 小部件。

根据 jqRelCopy 页面上的教程,我需要将元素的副本(在他们的示例中为 datePicker)传递给“jsAfterNewId”选项:

'jsAfterNewId' => JQRelcopy::afterNewIdDatePicker($datePickerConfig),

因此,我尝试将其修改为:

'jsAfterNewId' => MultiModelForm::afterNewIdMultiSelect($memberFormConfig['elements']),

我还在 MultiModelForm.php 中添加了以下内容:

public static function afterNewIdMultiSelect($element)
    {
            $options = isset($element['options']) ? $element['options'] : array();
            $jsOptions = CJavaScript::encode($options);
            return "if(this.attr('multiple')=='multiple'){this.multiselect(jQuery.extend({$jsOptions}));};";                
    }

当我使用 Add Person 链接时,它被复制并正常工作,但是如果我添加/克隆三个项目,例如,当我更改第三个项目 multiselct 选项时,它会反映到第一个多选下拉列表,这对于其他也是相同的同样,当我通过单击“添加人员”链接添加新项目时,它会将相同的元素克隆到新的行项目

这是表单配置变量和多模型小部件调用的代码。

//$userList=array of the userIds from users table
$memberFormConfig = array(
      'elements'=>array(
        'userId'=>array(
            'type'=>'ext.EchMultiSelect.EchMultiSelect',                
            'model' => $User,
            'dropDownAttribute' => 'userId', 
            'data' => $userList,
            'dropDownHtmlOptions'=> array(
                'style'=>'width:500px;',
            ),
        ),
        ...
        ...         
    ));

从同一个视图文件中调用 MultiModelForm 小部件

$this->widget('ext.multimodelform.MultiModelForm',array(
        'id' => 'id_member', //the unique widget id
        'formConfig' => $memberFormConfig, //the form configuration array
        'model' => $model, //instance of the form model
        'tableView' => true,
        'validatedItems' => $validatedMembers,
        'data' => Person::model()->findAll('userId=:userId', array(':userId'=>$model->id)),
        'addItemText' => 'Add Person',
        'showAddItemOnError' => false, //not allow add items when in validation error mode (default = true)
             'fieldsetWrapper' => array('tag' => 'div',
            'htmlOptions' => array('class' => 'view','style'=>'position:relative;background:#EFEFEF;')
        ),
        'removeLinkWrapper' => array('tag' => 'div',
            'htmlOptions' => array('style'=>'position:absolute; top:1em; right:1em;')
        ),

        'jsAfterNewId' => MultiModelForm::afterNewIdMultiSelect($memberFormConfig['elements']),
    ));

有人可以帮我吗?

提前致谢!

4

1 回答 1

0

经过长时间的搜索和谷歌搜索,我找到了解决方案,只需替换 MultiModelForm.php 中的函数:

public static function afterNewIdMultiSelect($element)
{
      $options = isset($element['options']) ? $element['options'] : array();
      $jsOptions = CJavaScript::encode($options);
      return "if ( this.hasClass('test123456') )
        {
            var mmfComboBoxParent   = this.parent();
            // cloning autocomplete and select elements (without data and events)
            var mmfComboBoxClone    = this.clone();
            var mmfComboSelectClone = this.prev().clone();
            // removing old combobox
            mmfComboBoxParent.empty();
            // addind new cloden elements ()
            mmfComboBoxParent.append(mmfComboSelectClone);
            mmfComboBoxParent.append(mmfComboBoxClone);
            // re-init autocomplete with default options
            mmfComboBoxClone.multiselect(jQuery.extend({$jsOptions}));
        }";
}

而已....!!

谢谢...!!!

于 2015-03-20T16:31:49.723 回答