コード例 #1
0
 /**
  * Updates an existing Person model.
  * If update is successful, the browser will be redirected to the 'view' page.
  * @param integer $id
  * @return mixed
  */
 public function actionUpdate($id)
 {
     $modelPerson = $this->findModel($id);
     $modelsHouse = $modelPerson->houses;
     $modelsRoom = [];
     $oldRooms = [];
     if (!empty($modelsHouse)) {
         foreach ($modelsHouse as $indexHouse => $modelHouse) {
             $rooms = $modelHouse->rooms;
             $modelsRoom[$indexHouse] = $rooms;
             $oldRooms = ArrayHelper::merge(ArrayHelper::index($rooms, 'id'), $oldRooms);
         }
     }
     if ($modelPerson->load(Yii::$app->request->post())) {
         // reset
         $modelsRoom = [];
         $oldHouseIDs = ArrayHelper::map($modelsHouse, 'id', 'id');
         $modelsHouse = Model::createMultiple(House::classname(), $modelsHouse);
         Model::loadMultiple($modelsHouse, Yii::$app->request->post());
         $deletedHouseIDs = array_diff($oldHouseIDs, array_filter(ArrayHelper::map($modelsHouse, 'id', 'id')));
         // validate person and houses models
         $valid = $modelPerson->validate();
         $valid = Model::validateMultiple($modelsHouse) && $valid;
         $roomsIDs = [];
         if (isset($_POST['Room'][0][0])) {
             foreach ($_POST['Room'] as $indexHouse => $rooms) {
                 $roomsIDs = ArrayHelper::merge($roomsIDs, array_filter(ArrayHelper::getColumn($rooms, 'id')));
                 foreach ($rooms as $indexRoom => $room) {
                     $data['Room'] = $room;
                     $modelRoom = isset($room['id']) && isset($oldRooms[$room['id']]) ? $oldRooms[$room['id']] : new Room();
                     $modelRoom->load($data);
                     $modelsRoom[$indexHouse][$indexRoom] = $modelRoom;
                     $valid = $modelRoom->validate();
                 }
             }
         }
         $oldRoomsIDs = ArrayHelper::getColumn($oldRooms, 'id');
         $deletedRoomsIDs = array_diff($oldRoomsIDs, $roomsIDs);
         if ($valid) {
             $transaction = Yii::$app->db->beginTransaction();
             try {
                 if ($flag = $modelPerson->save(false)) {
                     if (!empty($deletedRoomsIDs)) {
                         Room::deleteAll(['id' => $deletedRoomsIDs]);
                     }
                     if (!empty($deletedHouseIDs)) {
                         House::deleteAll(['id' => $deletedHouseIDs]);
                     }
                     foreach ($modelsHouse as $indexHouse => $modelHouse) {
                         if ($flag === false) {
                             break;
                         }
                         $modelHouse->person_id = $modelPerson->id;
                         if (!($flag = $modelHouse->save(false))) {
                             break;
                         }
                         if (isset($modelsRoom[$indexHouse]) && is_array($modelsRoom[$indexHouse])) {
                             foreach ($modelsRoom[$indexHouse] as $indexRoom => $modelRoom) {
                                 $modelRoom->house_id = $modelHouse->id;
                                 if (!($flag = $modelRoom->save(false))) {
                                     break;
                                 }
                             }
                         }
                     }
                 }
                 if ($flag) {
                     $transaction->commit();
                     return $this->redirect(['view', 'id' => $modelPerson->id]);
                 } else {
                     $transaction->rollBack();
                 }
             } catch (Exception $e) {
                 $transaction->rollBack();
             }
         }
     }
     return $this->render('update', ['modelPerson' => $modelPerson, 'modelsHouse' => empty($modelsHouse) ? [new House()] : $modelsHouse, 'modelsRoom' => empty($modelsRoom) ? [[new Room()]] : $modelsRoom]);
 }