好的,这是我的解决方案:
再创建 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”中做同样的事情(在帖子之后)。
我希望你能理解我的解决方案。这可能不是最好的解决方案,但它对我有用。我省略了更多细节,不要过多地回复此回复,但您可以随时与我联系;)
如果您需要更多详细信息,请给我发电子邮件。