0

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

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

我相信这些是实现这一目标的最有效的编码步骤:

创建产品时:选中的项目保存到产品模型中的“类别”列和用户的“配置文件”模型中的“类别”列

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

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

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

我需要使用 explode(",", $model->categories) 将所选复选框的数组转换为字符串,这样我就可以将它放在“产品”和“配置文件”模型的“类别”列中使用 ProductController 的 actionCreate 函数。

然后要将用户最后选择的 Checkboxlist 项目设置为在 Product _form 视图中处于活动状态,我需要通过内爆列将 $model->categories 数据转换回数组,即 implode(",", $user->profile->categories )。

你会如何在 Yii 中编写代码?

4

1 回答 1

1

使用CHtml::ckeckboxList而不是activecheckbox. 它已经选择了参数。选择了键=>值对数组。yiiframework.com/doc/api/1.1/CHtml#checkBoxList-detail

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

例如:

公共静态函数 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'=>trueactivecheckboxlist 添加到您的 htmloptions 中。像这样的东西会起作用。

于 2013-07-29T15:16:38.143 回答