Ok, hier ist meine Lösung:
erstellen 2 weiteren clases erweitert von "Model". Also habe ich 3 Klassen: Raum (ActiveRecord), RoomB (Model), RoomC (Model). So kann ich die 3 Arten von Raum darstellen. Die Attribute der beiden "Model" -Klassen sind die "ID" und die "Beschreibung" der "ActiveRecord" -Klasse (denken Sie daran, wir sprechen über Room). In der "_form.php", habe ich zwei "render ('_ form-rooms')" mehr, innerhalb divs mit der Klasse "col-md-4", um die Trennung zu bekommen.
<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>
Im "actionCreate", ich habe 2 zusätzliche Arrays hergestellt, die 2 "Model" clases darstellt, so habe ich diese drei Felder: $ modelsRoom = [[neue Zimmer]]; $ modelsRoomB = [[neuer RoomB]]; $ modelsRoomC = [[neues RoomC]]; Ich habe die gesamte Logik des Codes innerhalb von "actionCreate" ad hoc mit den zwei zusätzlichen Arrays geändert, also beispielsweise im "isset ($ _ POST ['Room'] [0] [0])", I habe zu fragen für "isset ($ _ POST [ 'RoomB'] [0] [0])" und "isset ($ _ POST [ 'RoomC'] [0] [0])" auch:
// 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();
}
}
}
so frage ich mich, ob die 2 extra „gültig“ Variablen sind wahr
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)
und im rendern der Form fortzusetzen, habe ich als Parameter erstellt die zusätzlichen Arrays übergeben:
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,
]);
In der "_form.php" Ansicht können Sie den obigen Code sehen, ich habe die zwei zusätzlichen Arrays im Render der beiden zusätzlichen "_form-rooms" verwendet.
In den "_form-rooms" habe ich den Code entfernt, der die ID des Modells darstellt, weil ich im "actionUpdate" alle "Häuser" entfernt habe, so dass alle ihre "Räume" gelöscht werden auch. Danach habe ich einfach das selbe gemacht wie im "actionCreate" (nach dem Post).
Ich hoffe, Sie können meine Lösung verstehen. Es ist vielleicht nicht die beste Lösung, aber es funktioniert für mich. Es gibt weitere Details, die ich weggelassen habe, um diese Antwort nicht zu sehr zu erweitern, aber Sie können mich immer kontaktieren;)
Wenn Sie weitere Informationen benötigen, mailen Sie mir.