如何将multimodelform与echmultiselect yii集成?

时间:2015-03-19 12:21:16

标签: yii multi-model-forms

我遇到了一些与扩展相关的问题" EchMultiSelect"和#34; MultiModelForm" YII框架。

我要做的是复制一组表单元素,其中一个元素是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选项然后它反映到第一个多选下拉列表时,会发生什么情况另外,当我通过点击Add Person链接添加新项目时,它将相同的元素克隆到新的行项目

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

//$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']),
    ));

有人可以帮我这个吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

经过长时间的搜索和googleing,我找到了解决方案,只需替换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}));
        }";
}

多数民众赞成...... !!

...谢谢!