public function savePhotos() { $photos = Yii::$app->session->get(self::SESSION_PHOTOS_KEY, []); $photos360 = Yii::$app->session->get(self::SESSION_PHOTOS_360_KEY, []); $photoModels = []; foreach ($photos as $photo) { $oldPath = $photo['path']; $newPath = $this->getUploadedPath() . ($newPath = "{$photo['name']}"); if (file_exists($oldPath)) { if (copy($oldPath, $newPath)) { $photoModels[] = new ProductPhoto(['photo' => $photo['name']]); } } } foreach ($photos360 as $photo) { $oldPath = $photo['path']; $newPath = $this->getUploaded360Path() . ($newPath = "{$photo['name']}"); if (file_exists($oldPath)) { if (copy($oldPath, $newPath)) { $photoModels[] = new ProductPhoto(['photo' => $photo['name'], 'type' => ProductPhoto::TYPE_360]); } } } $this->clearTmpPhotos(); Model::linkAll($this, $photoModels, 'photos'); }
/** * Updates an existing Product model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed * @throws ErrorException * @throws Exception * @throws NotFoundHttpException * @throws \yii\base\Exception */ public function actionUpdate($id) { $model = $this->findModel($id); $model->scenario = $model::SCENARIO_UPDATE; $videos = $model->videos; Model::setScenarios($videos, ProductVideo::SCENARIO_PRODUCT_UPDATE); $properties = $model->productProperties; Model::setScenarios($properties, ProductProperty::SCENARIO_PRODUCT_UPDATE); if ($model->load($post = Yii::$app->request->post())) { $oldVideoIds = ArrayHelper::map($videos, 'id', 'id'); $oldPropertyIds = ArrayHelper::map($properties, 'id', 'id'); $videos = Model::createMultiple(ProductVideo::classname(), $videos); $properties = Model::createMultiple(ProductProperty::classname(), $properties); Model::setScenarios($videos, ProductVideo::SCENARIO_PRODUCT_UPDATE); Model::setScenarios($properties, ProductProperty::SCENARIO_PRODUCT_UPDATE); Model::loadMultiple($videos, Yii::$app->request->post()); Model::loadMultiple($properties, Yii::$app->request->post()); $deletedVideoIds = array_diff($oldVideoIds, array_filter(ArrayHelper::map($videos, 'id', 'id'))); $deletedPropertyIds = array_diff($oldPropertyIds, array_filter(ArrayHelper::map($properties, 'id', 'id'))); Model::validateDuplicates($properties, 'property_id'); // ajax validation if (Yii::$app->request->isAjax) { Yii::$app->response->format = Response::FORMAT_JSON; return ArrayHelper::merge(ActiveForm::validate($model), ActiveForm::validateMultiple($properties, false), ActiveForm::validateMultiple($videos)); } if ($model->validate() && Model::validateMultiple($properties) && Model::validateMultiple($videos)) { $transaction = $model->getDb()->beginTransaction(); $oldMainPhoto = $model->getOldAttribute('main_photo'); $model->main_photo = UploadedFile::getInstance($model, 'main_photo'); try { if (!($category = Category::findOne(['id' => $model->category_id]))) { throw new \yii\base\Exception(); } if ($model->main_photo) { if (!$model->save(false)) { throw new ErrorException(); } $model->removeMainPhotoFromFolder($oldMainPhoto); if (!$model->upload()) { throw new \yii\base\Exception(); } } else { $model->setAttribute('main_photo', $oldMainPhoto); if (!$model->save(false)) { throw new \yii\base\Exception(); } } ProductVideo::deleteAll(['id' => $deletedVideoIds]); ProductProperty::deleteAll(['id' => $deletedPropertyIds]); Model::linkAll($model, $properties, 'productProperties'); Model::unsetEmpty($videos, 'video'); Model::linkAll($model, $videos, 'videos'); $model->savePhotos(); $transaction->commit(); Yii::$app->session->setFlash('success', 'Product have been updated.'); return $this->redirect('index'); } catch (Exception $e) { Yii::$app->session->setFlash('error', 'Failed to update product.'); $transaction->rollBack(); return $this->redirect('index'); } } } $model->clearTmpPhotos(); return $this->render('update', ['model' => $model, 'videos' => empty($videos) ? [new ProductVideo()] : $videos, 'properties' => empty($properties) ? [new ProductProperty()] : $properties, 'category' => Category::findOne(['id' => $model->category_id])]); }
/** * Updates an existing Category model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed */ public function actionUpdate($id) { $model = $this->findModel($id); $groupProperties = []; foreach ($model->groupProperties as $group) { $groupProperties[] = ['group' => $group, 'properties' => $group->properties]; } $request = Yii::$app->request; $post = $request->post(); $groupPost = $request->post('GroupProperty'); $propertyPost = $request->post('Property'); $model->scenario = $model::SCENARIO_UPDATE; if ($model->load($post)) { $oldProperties = ArrayHelper::flatten(ArrayHelper::getColumn($groupProperties, 'properties')); $oldGroups = ArrayHelper::flatten(ArrayHelper::getColumn($groupProperties, 'group')); $groupProperties = Model::loadProperties($groupPost, $propertyPost, true); if (!$groupProperties) { Yii::$app->session->setFlash('error', 'Failed to update category.'); return $this->redirect('index'); } $oldPropertyIds = ArrayHelper::getColumn($oldProperties, 'id'); $newPropertyIds = []; array_walk_recursive($propertyPost, function ($item, $key) use(&$newPropertyIds) { if ($key == 'id') { $newPropertyIds[] = $item; } }); $oldGroupIds = ArrayHelper::getColumn($oldGroups, 'id'); $newGroupIds = []; array_walk_recursive($groupPost, function ($item, $key) use(&$newGroupIds) { if ($key == 'id') { $newGroupIds[] = $item; } }); $deletedPropertiesIds = array_diff($oldPropertyIds, $newPropertyIds); $deletedGroupsIds = array_diff($oldGroupIds, $newGroupIds); if ($model->validate() && Model::validateProperties($groupProperties)) { $transaction = $model::getDb()->beginTransaction(); try { $oldImage = $model->getOldAttribute('image'); $oldIcon = $model->getOldAttribute('icon'); $oldIconHover = $model->getOldAttribute('icon_hover'); $model->image = UploadedFile::getInstance($model, 'image'); $model->icon = UploadedFile::getInstance($model, 'icon'); $model->icon_hover = UploadedFile::getInstance($model, 'icon_hover'); if ($model->image || $model->icon || $model->icon_hover) { if ($save = $model->save()) { $model->removeImageFromFolder($oldImage); $model->removeIconFromFolder($oldIcon); $model->removeIconHoverFromFolder($oldIconHover); if (!$model->upload()) { throw new \yii\base\Exception(); } } } else { $model->image = $oldImage; $model->icon = $oldIcon; $model->icon_hover = $oldIconHover; $save = $model->save(); } if ($save) { if (!empty($deletedPropertiesIds)) { Property::deleteAll(['id' => $deletedPropertiesIds]); } if (!empty($deletedGroupsIds)) { GroupProperty::deleteAll(['id' => $deletedGroupsIds]); } Model::linkProperties($model, $groupProperties); } Yii::$app->session->setFlash('success', 'Category have been updated.'); $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); Yii::$app->session->setFlash('error', 'Failed to update category.'); } } } else { if (empty($groupProperties)) { $groupProperties[] = ['group' => new GroupProperty(), 'properties' => [new Property()]]; } return $this->render('update', ['model' => $model, 'groupProperties' => $groupProperties]); } return $this->redirect('index'); }