1

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

4

7 回答 7

4

一种选择是使用CHtml::activeName为输入获取适当的名称并将其传递给CHtml::checkBoxList,就像其他人建议的那样。

在我看来,另一个更合适的选择是category_id在呈现表单之前将您想要预先检查的那些 s 添加到控制器中的模型中(仅当它是 GET 请求时)。那么您根本不需要修改表单。

于 2012-05-15T05:00:50.003 回答
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/

于 2013-03-07T11:22:25.000 回答
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.
于 2012-05-14T05:14:30.323 回答
1
<?php 
$categories = array(1,2,3);
$preSelectedCategories = array(1=>true,2=>true); // use this way 
echo CHtml::checkBoxList('category_id',$preSelectedCategories,$categories); 
?>

试试这个我试过了,运行成功。

于 2012-05-14T05:37:43.993 回答
1

删除 $preSelectedCategories 变量。将 $model->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'); ?>

你应该试试这个,但我没有测试这个。

于 2012-05-15T10:44:03.390 回答
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 扩展的表单小部件。

于 2012-06-15T09:41:34.713 回答
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'); ?>

试试这个,很好用。。

于 2014-12-29T11:30:30.633 回答