2017-03-28 1 views
0

Ist es möglich, verschiedene Arten von Räumen in der "demo 3: Nested Dynamic Form" zu haben und die Räume durch ihren Typ getrennt zu bekommen? Zum Beispiel, wenn ich das gleiche wie die Demo 3 Shows erstellen und einen Typ für jeden Raum hinzufügen möchte. Ich möchte Zimmer Typ A, Zimmer Typ B und Zimmer Typ C haben. Ist das möglich? (Typen sind in der Datenbank vorinstalliert, der Benutzer muss keinen neuen Typ einfügen oder einen Typ auswählen. Wenn ich einen "Raumtyp A" einfügen möchte, füge ich ihn einfach dort hinzu, wo er hingehört)Yii2 DynamicForm: Demo 3: Verschachtelte dynamische Form mit Raumtypen

I ' habe den HTML-Code geändert, aber das Array des Raums im Controller hat nicht alle Räume (weil die ersten überschrieben sind). Also, was muss ich tun, damit es funktioniert?

In dem Bild können Sie den Ansatz sehen, ich möchte es funktionieren lassen, weil durch nur Bearbeiten der HTML nicht funktioniert.

approach

Antwort

0

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.

Verwandte Themen