我有两个数组。一个是 $ categories ,其中包含从我的数据库中检索到的所有类别,另一个是 $ preSelectedCategories ,其中包含我的复选框列表中需要预先选择的类别表单已加载。我试着这样做:
<?php echo $form->labelEx($model,'category_id'); ?>
<?php echo $form->checkBoxList($model, 'category_id', $categories, $preSelectedCategories, array('multiple'=>true)); ?>
<?php echo $form->error($model,'category_id'); ?>
但我没有成功。谁能帮我解决这个问题?谢谢!
编辑:我已经知道使用 CHtml :: checkBoxList 会有所帮助,但我想要的是使用 CActiveForm :: checkBoxList ,因为我使用的是模型验证复选框列表。
答案 0 :(得分:4)
一种选择是使用CHtml::activeName
获取输入的相应名称,并将其传递给CHtml::checkBoxList
,就像其他人建议的那样。
在我看来,更合适的另一个选择是在渲染表单之前将那些你想要预先检查的category_id
添加到控制器中的模型中(仅当它是GET请求时)。那么你根本不需要修改表格。
答案 1 :(得分:2)
您可以轻松地使用所选项目预先填充checkBoxList,它会在其第二个参数中选择一组选定的键。
$selected_keys = array_keys(CHtml::listData( $model->books, 'id' , 'id'));
echo CHtml::checkBoxList('Author[books][]', $selected_keys, $books);
请在我的博客上查看完整示例:
http://scriptbaker.com/how-to-make-yii-checkboxlist-selected/
答案 2 :(得分:1)
CHtml::actviceCheckBoxList
(你使用的CActiveForm :: checkBoxList是它的包装器)有这样的语法
public static function activeCheckBoxList($model,$attribute,$data,$htmlOptions=array())
如果你想手动设置预先选择的值 - 你应该使用CHtml :: checkBoxList
public static function checkBoxList($name,$select,$data,$htmlOptions=array())
这是一个CHtml类引用
* @param string $name name of the check box list. You can use this name to retrieve
* the selected value(s) once the form is submitted.
* @param mixed $select selection of the check boxes. This can be either a string
* for single selection or an array for multiple selections.
* @param array $data value-label pairs used to generate the check box list.
* Note, the values will be automatically HTML-encoded, while the labels will not.
答案 3 :(得分:1)
<?php
$categories = array(1,2,3);
$preSelectedCategories = array(1=>true,2=>true); // use this way
echo CHtml::checkBoxList('category_id',$preSelectedCategories,$categories);
?>
试试这个我试过,它运行成功。
答案 4 :(得分:1)
删除$ preSelectedCategories变量。 将$ model-&gt; category_id设置为包含所选复选框值的数组。
<?php echo $form->labelEx($model,'category_id'); ?>
<?php
$model->category_id = array('value1','value2');
echo $form->checkBoxList($model, 'category_id', $categories, array('multiple'=>true)); ?>
<?php echo $form->error($model,'category_id'); ?>
你应该尝试这个,但我没有测试过。
答案 5 :(得分:1)
使用数组填充属性,然后在表单上显示它。
在控制器中:
public function actionUpdate($id) {
$model=$this->loadModel($id);
//For example
$categories = array(0=>'Option One',1=>'Option Two',2=>'Option Three');
$preSelectedCategories = array(1,2);
//Magic here
$model->category_id = $preSelectedCategories;
if(isset($_POST['NameOfModel']) {
//category_id reset with incoming form data...
}
...
$this->render('update',array('model'=>$model,'categories'=>$categories));
}
在视图中,以您的形式:
echo $form->checkBoxList($model,'category_id',$categories);
未经测试,因为我在这里进行了修改...改编自Bootstrap扩展的表单小部件。
答案 6 :(得分:1)
大多数yii成员都有相同的问题,所以这里有更多甜蜜的代码和明确的解释。
首先,您需要找到预先选择的类别,例如 -
$criteria = new CDbCriteria();
$criteria->select = 'category_id as id';
$criteria->condition = 'userid = :userid';
$criteria->params = array(':userid' => Yii::app()->user->id);
//store pre-selected id into variable - $selected_keys
$selected_keys = array_keys(CHtml::listData(MyCategory::model()->findAll($criteria), 'id', 'id'));
现在生成整个类别列表,例如 -
$list = CHtml::listData(Categories::model()->findAll(array('order'=>'id')), 'id', 'category_name');
//htmlOptions for class and others elements
$htmlOptions = array('template' => '{input}{label}', 'separator'=>'', 'class'=>'in-checkbox', 'multiple'=>true, 'checked'=>'checked');
查看部分 -
<?php echo $form->labelEx($model, 'Category', array('class'=>'col-md-3 control-label')); ?>
<?php $model->Category = $selected_keys; //assign pre-selected list to Category list
echo $form->checkBoxList($model, 'Category', $list, $htmlOptions); ?>
<?php echo $form->error($model, 'Category'); ?>
试试这个,工作得很好..