Yii2动态表单:演示3:带有房间类型的嵌套动态表单

Yii2动态表单:演示3:带有房间类型的嵌套动态表单,yii2,dynamicform,Yii2,Dynamicform,是否可以在“”中有不同类型的房间,并按其类型将房间分隔开?例如,如果我想创建与演示3相同的房间,并为每个房间添加一个类型。我想要A型、B型和C型房间。可以吗?(类型预加载到数据库中,用户无需插入新类型,也无需选择一种类型。如果我想插入“房间类型a”,我只需将其添加到它所属的位置) 我已经更改了html,但是控制器中的文件室数组没有包含所有文件室(因为第一个文件室被覆盖)。那么,我该怎么做才能让它正常工作呢 在图中你可以看到这种方法,我想让它发挥作用,因为仅仅编辑html是不起作用的 好的,这是我

是否可以在“”中有不同类型的房间,并按其类型将房间分隔开?例如,如果我想创建与演示3相同的房间,并为每个房间添加一个类型。我想要A型、B型和C型房间。可以吗?(类型预加载到数据库中,用户无需插入新类型,也无需选择一种类型。如果我想插入“房间类型a”,我只需将其添加到它所属的位置)

我已经更改了html,但是控制器中的文件室数组没有包含所有文件室(因为第一个文件室被覆盖)。那么,我该怎么做才能让它正常工作呢

在图中你可以看到这种方法,我想让它发挥作用,因为仅仅编辑html是不起作用的


好的,这是我的解决方案:

再创建两个扩展的“模型”类别。所以我有3个类别:Room(ActiveRecord)、RoomB(Model)、RoomC(Model)。所以我可以代表这三种类型的房间。 两个“Model”类的属性是“ActiveRecord”类的“id”和“description”(记住,我们谈论的是Room)。 在“_form.php”中,我将两个“render”(“u form-rooms”)”放在类为“col-md-4”的div中,以获得分隔

<td>
<div class="row">
<div class="col-md-4">
                    <?= $this->render('_form-rooms', [
                        'form' => $form,
                        'indexHouse' => $indexHouse,
                        'modelsRoom' => $modelsRoom[$indexHouse],
                    ]) ?>

<button type="button" class="remove-house btn btn-danger btn-xs"><span class="fa fa-minus"></span></button>
</div>
<div class="col-md-4">
                    <?= $this->render('_form-rooms', [
                        'form' => $form,
                        'indexHouse' => $indexHouse,
                        'modelsRoom' => $modelsRoomB[$indexHouse],
                    ]) ?>

<button type="button" class="remove-house btn btn-danger btn-xs"><span class="fa fa-minus"></span></button>
</div>
<div class="col-md-4">
                    <?= $this->render('_form-rooms', [
                        'form' => $form,
                        'indexHouse' => $indexHouse,
                        'modelsRoom' => $modelsRoomC[$indexHouse],
                    ]) ?>

<button type="button" class="remove-house btn btn-danger btn-xs"><span class="fa fa-minus"></span></button>
</div>
</div>
                </td>
因此,我询问这两个额外的“有效”变量是否为true以继续

if ($valid && $valid2 && $valid3) {
                $transaction = Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $modelPerson->save(false)) {
                        foreach ($modelsHouse as $indexHouse => $modelHouse) {

                            if ($flag === false) {
                                break;
                            }

                            ... (continue with the same code)
在表单的渲染中,我将创建的额外数组作为参数传递:

return $this->render('create', [
            'modelPerson' => $modelPerson,
            'modelsHouse' => (empty($modelsHouse)) ? [new House] : $modelsHouse,
            'modelsRoom' => (empty($modelsRoom)) ? [[new Room]] : $modelsRoom,
            'modelsRoomB' => (empty($modelsRoomB)) ? [[new RoomB]] : $modelsRoomB,
            'modelsRoomC' => (empty($modelsRoomC)) ? [[new RoomC]] : $modelsRoomC,
        ]);
在“_form.php”视图中,您可以看到上面的代码,我在呈现两个额外的“_form-rooms”时使用了两个额外的数组

在“_form-rooms”中,我删除了代表模型id的代码,因为在“actionUpdate”中,我删除了所有的“House”,因此,所有的“rooms”也将被删除。在这之后,我只做了与“actionCreate”(在文章之后)中相同的事情

我希望你能理解我的解决方案。这也许不是最好的解决方案,但对我来说很有效。我省略了更多的细节,不想在此回复中扩展太多内容,但您可以随时与我联系;)

如果您需要更多详细信息,请发电子邮件给我

return $this->render('create', [
            'modelPerson' => $modelPerson,
            'modelsHouse' => (empty($modelsHouse)) ? [new House] : $modelsHouse,
            'modelsRoom' => (empty($modelsRoom)) ? [[new Room]] : $modelsRoom,
            'modelsRoomB' => (empty($modelsRoomB)) ? [[new RoomB]] : $modelsRoomB,
            'modelsRoomC' => (empty($modelsRoomC)) ? [[new RoomC]] : $modelsRoomC,
        ]);