Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2复选框列表中的选中项目_Php_Yii2 - Fatal编程技术网

Php Yii2复选框列表中的选中项目

Php Yii2复选框列表中的选中项目,php,yii2,Php,Yii2,我对ActiveForm中的复选框列表有一个虚拟问题 所以我有两个模型(我去掉了不相关的代码): 对象模型: class Object extends ActiveRecord { public $oFacilities = array(); public static function tableName() { return 'objects'; } public function getObjectFacilities(){

我对ActiveForm中的复选框列表有一个虚拟问题

所以我有两个模型(我去掉了不相关的代码):

对象模型:

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']);
    }
}
我的ObjectController中有两个操作:

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(); ?>

创建操作工作正常(渲染和保存),但我对基于junktion表的渲染复选框列表有一个问题-没有选中任何复选框。你能告诉我我做错了什么吗

亲切问候,, 卡米尔

更新

我找到了问题所在-当我更改呈现chckboxList的代码时,如下所示:

<?= $form->field($model, 'oFacilities')->checkboxList(Facility::forWidget()) ?>


选中先前选中的复选框。但是我的checkboxList并没有分成三列。

item函数的
{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>";
        }
    ])
?>

项函数的
{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>";
        }
    ])
?>

您正在使用
Facility::forObject()
作为小部件调用中的项,但是
Facility
中没有这样的方法。你能解释一下你的意思吗?也许是Widget的
?嗨,我的坏朋友。当然,我指的是小部件方法。已编辑并更正。您正在小部件调用中使用
Facility::forObject()
作为项目,但
Facility
中没有此类方法。你能解释一下你的意思吗?也许是Widget的
?嗨,我的坏朋友。当然,我指的是小部件方法。编辑和更正。非常感谢!很有魅力。非常感谢!工作起来很有魅力。