我有一个带有'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中编码?
答案 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。这样的事情会起作用。