Yii从checkboxlist接收数据

时间:2015-01-28 10:51:57

标签: php yii

我在Yii有一些项目。首先,它是一个包含两个文本字段的表单:名称和主题(主题是以逗号分隔的主题列表)。现在我需要将主题文本字段替换为复选框列表,这将添加由逗号分隔的相同字符串。

<!--<?php echo $form->labelEx($model,'Subjects'); ?>
<?php echo $form->textField($model,'Subjects',array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'Subjects'); ?>-->
<?php echo $form->labelEx($model,'Subjects'); ?>
<?php echo $form->checkBoxList($model,'Subjects',$this->listOfSubjects()); ?>
<?php echo $form->error($model,'Subjects'); ?>

主题列表是一个控制器方法,它返回Yii中checkboxlist所需的数组,如:

array(
'1'=>'Something',
'2'=>'Anotherthing'
);

此处还有我的动作代码。它非常标准:

public function actionCreate()
{
    $model=new CrdTeachers;
    if(isset($_POST['CrdTeachers']))
    {
        $model->attributes=$_POST['CrdTeachers'];
        if($model->save())
            $this->redirect(array('view','id'=>$model->Teacher_ID));        
    }
    $this->render('create',array(
        'model'=>$model,
    ));
}

当只有两个文本字段时,此代码工作正常。现在,当我使用创建操作时,它会说错误:

mb_strlen() expects parameter 1 to be string, array given

我无法在哪里处理它的数据以使其成为字符串。 Yii的任何专家在这里?我应该寻找什么?
更新: 这是CRDTeachers模型类

class CrdTeachers extends CActiveRecord
{
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return CrdTeachers the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'crd_teachers';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('Name, Subjects', 'required'),
            array('Name, Subjects', 'length', 'max'=>255),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('Teacher_ID, Name, Subjects', 'safe', 'on'=>'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            //'rSubjects'=>array(self::HAS_MANY, 'CrdSubjects', 'Subject_ID'),
            //'categories'=>array(self::MANY_MANY, 'CrdTeachers', '{{CrdSubjects}}(Subject_ID, Subject_Name)'),
        );
    }

    public function behaviors()
    {
        return array(
            'DMultiplyListBehavior'=>array(
                 'class'=>'DMultiplyListBehavior',
                 'attribute'=>'categoriesArray',
                 'relation'=>'categories',
                 'relationPk'=>'id',
            ),
        );
    }

    protected function afterSave()
    {
        //$this->refreshCategories();
        parent::afterSave();
    }

    protected function refreshCategories()
    {
        $categories = $this->categoriesArray;

        CrdTeachers::model()->deleteAllByAttributes(array('Subject_ID'=>$this->id));

        if (is_array($categories))
        {
            foreach ($categories as $id)
            {
                if (Category::model()->exists('id=:id', array(':id'=>$id)))
                {
                    $postCat = new CrdTeachers();
                    $postCat->post_id = $this->id;
                    $postCat->category_id = $id;
                    $postCat->save();
                }
            }
        }
    }   

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'Teacher_ID' => 'Teacher',
            'Name' => 'Name',
            'Subjects' => 'Subjects',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('Teacher_ID',$this->Teacher_ID);
        $criteria->compare('Name',$this->Name,true);
        $criteria->compare('Subjects',$this->Subjects,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }

    /*
    * Возвращает список по ID
    */
    public function getParentTypeById($id) {
        $title = $this->model()->findByPk($id)->Name;
        return $title;
    }   
}

2 个答案:

答案 0 :(得分:1)

您可以使用模型中的beforeValidate函数在验证之前处理输入。如果要继续验证,请确保运行父方法并返回true。通常它是这样完成的:

public function beforeValidate() 
{
    // do stuff to transform the array into the string
    return parent::beforeValidate();
}

答案 1 :(得分:1)

您可以在模型中使用此方法。

public function beforeValidate() 
{
    if (is_array($this->Subjects)) {
        $this->Subjects = implode(', ', $this->Subjects);
    }

    return parent::beforeValidate();
}