我在ActiveForm中的checkboxList上遇到了一个虚拟问题。
所以我有两个模型(我切断了不相关的代码):
对象模型:
class Object extends ActiveRecord
{
public $oFacilities = array();
public static function tableName()
{
return 'objects';
}
public function getObjectFacilities(){
return $this->hasMany(Facility::className(),['id' => 'facilityId'])->viaTable('objectsfacilities', ['objectId' => 'id']);
}
}
设施型号:
class Facility extends ActiveRecord
{
public static function tableName()
{
return 'facilities';
}
public static function forWidget(){
$facilities =static::find()->select(['id','name'])->where(['type' => static::TYPE_OBJECT])
->orderBy('name')
->asArray()
->all();
return ArrayHelper::map($facilities, 'id', 'name');
}
public function getObjectsWithFacility(){
return $this->hasMany(Object::className(), ['id' => 'objectId'])->viaTable('objectsfacilities', ['facilityId' => 'id']);
}
}
我的对象控制器中有两个操作:
class ObjectController extends Controller
{
public function actionCreate(){
$model = new Object();
if($model->load(Yii::$app->request->post()) && $model->validate()){
$model->save();
foreach($model->oFacilities as $id){
$facility = Facility::findOne($id);
$model->link('objectFacilities', $facility);
}
Yii::$app->session->setFlash('alert', 'object-created');
return $this->redirect('index');
}
return $this->render('create', ['model' => $model]);
}
public function actionUpdate($id){
/* This action is complete - for now I just want to render a form */
if($model = Object::find()->where(['id' => $id])->with(['objectFacilities'])->one()){
foreach($model->objectFacilities as $facility) array_push($model->oFacilities, $facility->id);
return $this->render('update', ['model' => $model]);
}
}
}
这两个操作都使用称为_form.php的分部视图
<?php $form = ActiveForm::begin([
'id' => 'object-form',
'options' => ['class' => 'form-horizontal'],
'fieldConfig' => [
'template' => "{label}'n<div class='"col-lg-9'">{input}</div>'n<div class='"col-lg-9 col-lg-offset-3'">{error}</div>",
'labelOptions' => ['class' => 'col-lg-3 control-label'],
],
]); ?>
<?= $form->field($model, 'oFacilities')->checkboxList(Facility::forWidget(),[
'item' => function($index, $label, $name, $checked, $value) {
return "<label class='checkbox col-md-4' style='font-weight: normal;'><input type='checkbox' {$checked} name='{$name}' value='{$value}'>{$label}</label>";
}
]) ?>
<div class="form-group">
<div class="col-lg-offset-1 col-lg-11">
<?= Html::submitButton($model->isNewRecord ? 'Create object' : 'Save changes', ['class' => 'btn btn-primary', 'name' => 'object-button']) ?>
</div>
</div>
<?php ActiveForm::end(); ?>
创建操作工作正常(渲染和保存),但是我在基于垃圾表的渲染复选框列表时遇到了问题 - 没有检查任何检查对象。你能看出我做错了什么吗?
亲切问候卡米尔
更新
我找到了问题 - 当我更改呈现 chckboxList 的代码时,如下所示:
<?= $form->field($model, 'oFacilities')->checkboxList(Facility::forWidget()) ?>
选中较早选定的复选框。但是我的复选框列表没有细分为三列。
项函数的{checked}
部分在输入元素中输出 1 或 0。
将值更改为实际的"已检查"字符串以解决您的问题。
<?=
$form->field($model, 'oFacilities')->checkboxList(Facility::forWidget(),[
'item' => function($index, $label, $name, $checked, $value) {
$checked = $checked ? 'checked' : '';
return "<label class='checkbox col-md-4' style='font-weight: normal;'><input type='checkbox' {$checked} name='{$name}' value='{$value}'>{$label}</label>";
}
])
?>