php-yii框架直接通过模型填充CActiveform下拉列表数据


php yii framework populate CActiveform dropdownlist data by model directly?

我是yii的新手,此刻我正在学习。。。

我在模型中使用这个查询来获取我的列表框的关联数组

public function getAllCategories()
{

    $cats = $this->model()->findAll(array('select'=>'id,name'));
    $mainarr = array();
    foreach($cats as $obj)
        $mainarr["$obj->id"]=$obj->name;
    return $mainarr;
}

在我的表单上,我在我的下拉列表中将此函数称为

<?php echo $form->dropDownList($model,'name',$model->getAllCategories());  ?>

我有很多不同查询的下拉列表,我找不到任何更快的方法来做到这一点,每次我都必须创建上面的数组来实现它。如果有任何使用CActiveForm的解决方案,请告诉我更好、更快的填充解决方案?

更快的方法,我不确定还有其他方法。

但是您可以使用CHtml::listData();函数来减少代码。至少您将减少在模型类中定义函数的必要性:

<?php 
    echo $form->dropDownList($model,
      'name',
      CHtml::listData(Modelname::model()->findAll(),'id','name')// $model->getAllCategories()
    );
?>

listData();将获得array('id'=>'name')格式的关联数组。

编辑:

为了遵循良好的mvc实践,您可以在控制器操作中使用listData,它显示这个表单,而不是直接使用表单视图:

public function actionFormDisplayer(){
  // other code
  $list_for_name_dropdown = CHtml::listData(Modelname::model()->findAll(),'id','name');
  // other code
  // then in render pass this value also
  $this->render('viewname',
     array('dropdownoptions'=>$list_for_name_dropdown, // other data to pass
  ));
}

然后在您的视图中,您可以使用$dropdownoptions

如果您想从菜单模式下拉显示菜单名称,请使用以下代码$menu_model=菜单::model()->findAll()
$list=CHtml::listData($menu_model,'menu_id','menu_name');echo CHtml::dropDownList("类别",$category,$list,array("空"=>"(选择类别"));`