在Yii中的CActiveForm-> checkBoxList中预先选择的项目

时间:2012-05-14 03:32:47

标签: yii selecteditem checkboxlist

我有两个数组。一个是 $ 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 ,因为我使用的是模型验证复选框列表。

7 个答案:

答案 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'); ?>

试试这个,工作得很好..