0

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

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

在图片中你可以看到这种方法,我想让它工作,因为仅仅编辑 html 是行不通的。

方法

4

1 回答 1

0

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

再创建 2 个扩展“模型”的类。所以我有 3 个类别:Room (ActiveRecord)、RoomB (Model)、RoomC (Model)。所以我可以代表 3 种类型的房间。两个“Model”类的属性是“ActiveRecord”类的“id”和“description”(记住,我们说的是Room)。在“_form.php”中,我在具有“col-md-4”类的 div 中添加了两个“render('_form-rooms')”以进行分离。

<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>

在“actionCreate”中,我制作了 2 个额外的数组来代表 2 个“模型”类,所以我有这 3 个数组: $modelsRoom = [[new Room]]; $modelsRoomB = [[新 RoomB]]; $modelsRoomC = [[新 RoomC]]; 我已经用两个额外的数组更改了“actionCreate”中代码的所有逻辑,例如,在“isset($_POST['Room'][0][0])”中,我'我还要求“isset($_POST['RoomB'][0][0])”和“isset($_POST['RoomC'][0][0])”:

// validate person and houses models
           $valid = $modelPerson->validate();
           $valid = Model::validateMultiple($modelsHouse) && $valid;
           $valid2 = $valid3 = $valid;

           if (isset($_POST['Room'][0][0])) {
               foreach ($_POST['Room'] as $indexHouse => $rooms) {
                   foreach ($rooms as $indexRoom => $room) {
                       $data['Room'] = $room;
                       $modelRoom = new Room;
                       $modelRoom->load($data);
                       $modelsRoom[$indexHouse][$indexRoom] = $modelRoom;
                       $valid = $modelRoom->validate();
                   }
               }
           }

           if (isset($_POST['RoomB'][0][0])) {
               foreach ($_POST['RoomB'] as $indexHouse => $rooms) {
                   foreach ($rooms as $indexRoom => $room) {
                       $data['Room'] = $room;
                       $modelRoom = new Room;
                       $modelRoom->load($data);
                       $modelsRoomB[$indexHouse][$indexRoom] = $modelRoom;
                       $valid2 = $modelRoom->validate();
                   }
               }
           }


           if (isset($_POST['RoomC'][0][0])) {
               foreach ($_POST['RoomC'] as $indexHouse => $rooms) {
                   foreach ($rooms as $indexRoom => $room) {
                       $data['Room'] = $room;
                       $modelRoom = new Room;
                       $modelRoom->load($data);
                       $modelsRoomC[$indexHouse][$indexRoom] = $modelRoom;
                       $valid3 = $modelRoom->validate();
                   }
               }
           }

所以我问2个额外的“有效”变量是否正确继续

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”中,我已经删除了所有“Houses”,所以它们的所有“rooms”也将被删除。在此之后,我只是在“actionCreate”中做同样的事情(在帖子之后)。

我希望你能理解我的解决方案。这可能不是最好的解决方案,但它对我有用。我省略了更多细节,不要过多地回复此回复,但您可以随时与我联系;)

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

于 2017-03-31T17:14:05.417 回答