2017-03-28 1 views
0

"demo 3: Nested Dynamic Form"에 다른 유형의 방을 가질 수 있으며 해당 유형별로 방을 분리 할 수 ​​있습니까? 예를 들어, 데모 3과 동일한 것을 만들고 싶으면 각 방의 유형을 추가하십시오. 객실 A 형, 객실 B 형, 객실 C 형을 갖고 싶습니다. 가능합니까? (유형은 데이터베이스에 미리로드되어 있으므로 사용자는 새로운 유형을 삽입하거나 하나의 유형을 선택할 필요가 없습니다. "방 유형 A"를 삽입하려는 경우 방금 추가 할 위치에 추가하십시오)Yii2 DynamicForm : 데모 3 : 방 유형의 중첩 된 동적 양식

I ' html을 변경했으나 컨트롤러의 방의 배열에 모든 방이 없었습니다 (첫 번째 점이 덮어 쓰기 때문에). 그래서 제대로 작동하려면 어떻게해야합니까?

그림에서 당신은 접근 방식을 볼 수 있습니다, 나는 단지 HTML을 편집하여 작동하지 않기 때문에 그것을 만들고 싶습니다.

는 "모델"의 확장이 더 clases 만들기 :

approach

답변

0

좋아, 여기 내 솔루션입니다. 그래서 저는 Room (ActiveRecord), RoomB (Model), RoomC (Model)의 3 가지가 있습니다. 그래서 나는 3 가지 유형의 방을 대표 할 수 있습니다. "Model"클래스의 속성은 "ActiveRecord"클래스의 "id"와 "description"입니다 (우리는 Room에 대해 이야기하고 있음을 기억하십시오). "_form.php"에서 두 개의 "render ('form-rooms')"을 구분 기호를 사용하여 "col-md-4"클래스의 div 안에 넣습니다. 은 "actionCreate"에서

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

, 내가 2 "모델"clases를 나타내는 2 개 여분의 배열을했습니다, 그래서 그 3 개 배열을 가지고 : $ modelsRoom = [[새 룸]]; $ modelsRoomB = [[새 룸 B]]; $ modelsRoomC = [[새 룸 C]]; "isset ($ _ POST [ 'Room'] [0] [0])"과 같이 두 개의 추가 배열을 사용하여 임시로 "actionCreate"코드의 모든 논리를 변경했습니다. '요청했습니다 "는 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(); 
        } 
       } 
      } 

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, 
     ]); 
: 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) 

를 계속 사실이 있는지 여부

그래서 나는 내가 만든 여분 배열을 매개 변수로 전달할 한 질문3210

"_form.php"보기에서 위의 코드를 볼 수 있습니다. 두 개의 추가 "_form-rooms"렌더링에서 두 개의 추가 배열을 사용했습니다.

"_form-rooms"에서 "actionUpdate"에서 "Houses"를 모두 제거 했으므로 모델의 ID를 나타내는 코드를 삭제했습니다. 따라서 모든 "rooms"이 삭제됩니다. 너무. 이 후, 나는 "actionCreate"(게시물 이후)에서와 똑같이 수행했습니다.

내 솔루션을 이해하시기 바랍니다. 그것은 아마도 최선의 해결책은 아니지만 그것은 나를 위해 일합니다. 이 회신을 너무 많이하지 않도록 생략 한 자세한 내용이 있지만, 언제나 연락 할 수 있습니다.)

자세한 내용이 필요하면 이메일을 보내주십시오.