/** * Store a Product Extension * * 1. Save Extension * 2. Save Image * * @return Response */ public function store() { if (!Input::has('extension')) { return new JSend('error', (array) Input::all(), 'Tidak ada data extension.'); } $errors = new MessageBag(); DB::beginTransaction(); //1. Validate Extension Parameter $extension = Input::get('extension'); if (is_null($extension['id'])) { $is_new = true; } else { $is_new = false; } $extension_rules = ['name' => 'required|max:255', 'price' => 'numeric', 'is_active' => 'boolean', 'is_customize' => 'boolean']; //1a. Get original data $extension_data = \App\Models\ProductExtension::findornew($extension['id']); //1b. Validate Basic Extension Parameter $validator = Validator::make($extension, $extension_rules); if (!$validator->passes()) { $errors->add('Extension', $validator->errors()); } else { //if validator passed, save Extension $extension_data = $extension_data->fill($extension); if (!$extension_data->save()) { $errors->add('Extension', $extension_data->getError()); } } //End of validate Extension //2. Validate Extension Image Parameter if (!$errors->count() && isset($extension['images']) && is_array($extension['images'])) { $image_current_ids = []; foreach ($extension['images'] as $key => $value) { if (!$errors->count()) { $image_data = \App\Models\Image::findornew($value['id']); $image_rules = ['imageable_id' => 'exists:Extensions,id|' . ($is_new ? '' : 'in:' . $extension_data['id']), 'imageable_type' => $is_new ? '' : 'in:' . get_class($extension_data), 'thumbnail' => 'required|max:255', 'image_xs' => 'required|max:255', 'image_sm' => 'required|max:255', 'image_md' => 'required|max:255', 'image_lg' => 'required|max:255', 'is_default' => 'boolean']; $validator = Validator::make($value, $image_rules); //if there was image and validator false if (!$validator->passes()) { $errors->add('Image', $validator->errors()); } else { $value['imageable_id'] = $extension_data['id']; $value['imageable_type'] = get_class($extension_data); $image_data = $image_data->fill($value); if (!$image_data->save()) { $errors->add('Image', $image_data->getError()); } else { $image_current_ids[] = $image_data['id']; } } } } //if there was no error, check if there were things need to be delete if (!$errors->count()) { $images = \App\Models\Image::imageableid($extension['id'])->imageabletype(get_class($extension_data))->get(['id'])->toArray(); $image_should_be_ids = []; foreach ($images as $key => $value) { $image_should_be_ids[] = $value['id']; } $difference_image_ids = array_diff($image_should_be_ids, $image_current_ids); if ($difference_image_ids) { foreach ($difference_image_ids as $key => $value) { $image_data = \App\Models\Image::find($value); if (!$image_data->delete()) { $errors->add('Image', $image_data->getError()); } } } } } //End of validate Extension image if ($errors->count()) { DB::rollback(); return new JSend('error', (array) Input::all(), $errors); } DB::commit(); $final_extension = \App\Models\ProductExtension::id($extension_data['id'])->with(['images'])->first()->toArray(); return new JSend('success', (array) $final_extension); }