在创建新记录时保存Checkboxlist数据并检索用户上次检查的项目

时间:2013-07-29 14:42:35

标签: php yii checkboxlist

我有一个带有'categories'列的Product模型。此列应该能够包含来自Checkboxlist的数据。 每当用户创建新产品时,我希望表单显示“类别”复选框,并将项目设置为用户上次创建的产品中的活动状态。

例如:'类别'复选框列表包含“电影”和“音乐”项。当用户选中“电影”并创建产品时,下次用户创建产品时,“电影”已被选中(因为它保存了用户之前产品创建的选择)。

我认为这些是为实现这一目标而编码的最有效步骤:

创建产品时:已检查的项目将保存到“产品型号”和“产品型号”中的“类别”列中。用户的“个人资料”模型中的“类别”列

应在产品的“创建”表单中检索用户上次保存的类别(“配置文件”模型中的“类别”列)。 产品型号的_form视图中的代码:

<?php echo $form->checkBoxList($model, 'categories', array('movies'=>'Movies','music'=>'Music')); ?>

(我不确定在哪里为活动值设置数组)

我需要使用explode(“,”,$ model-&gt;类别)将所选复选框的数组转换为字符串,这样我就可以将它放在“产品”和“产品”的“类别”列中使用ProductController的actionCreate函数描述'模型。

然后,要将用户最后选择的Checkboxlist项目设置为Product _form视图中的有效项,我需要通过插入列来转换$ model-&gt;类别数据,即implode(“,”,$ user-&gt ;简介 - &GT;类别)

你会如何在Yii中编码?

1 个答案:

答案 0 :(得分:1)

使用CHtml::ckeckboxList代替activecheckbox。 它已选择参数。选择了key =&gt;值对的数组。 yiiframework.com/doc/api/1.1/CHtml#checkBoxList-detail

或者你可以重写(扩展)你的CHtml助手来解决你的格式。

例如:

public static function activeCheckBoxList($ model,$ attribute,$ data,$ htmlOptions = array())     {

        self::resolveNameID($model,$attribute,$htmlOptions);
    if(array_key_exists('explode_format',$htmlOptions))
    {
        $selection=explode($model->$attribute);
        unset($htmlOptions['explode_format']);
    }
        else{
        $selection=self::resolveValue($model,$attribute);
        }
    if($model->hasErrors($attribute))
        self::addErrorCss($htmlOptions);
    $name=$htmlOptions['name'];
    unset($htmlOptions['name']);

    if(array_key_exists('uncheckValue',$htmlOptions))
    {
        $uncheck=$htmlOptions['uncheckValue'];
        unset($htmlOptions['uncheckValue']);
    }
    else
        $uncheck='';

    $hiddenOptions=isset($htmlOptions['id']) ? array('id'=>self::ID_PREFIX.$htmlOptions['id']) : array('id'=>false);
    $hidden=$uncheck!==null ? self::hiddenField($name,$uncheck,$hiddenOptions) : '';

    return $hidden . self::checkBoxList($name,$selection,$data,$htmlOptions);
} 

然后只需将'explode_format'=>true添加到htmloptions for activecheckboxlist。这样的事情会起作用。