'required|string|min:3|max:100', 'ukuran' => 'required|in:S,M,L', 'kategori' => 'required|in:single,fresh,premium_fresh,artificial', 'harga' => 'required|numeric|min:0', 'request_khusus' => 'nullable|string|max:255', 'deskripsi' => 'required|string|min:10', // Dinamis: required jika store (POST), nullable jika update (PUT) 'foto' => $this->isMethod('post') ? 'required|image|mimes:jpeg,png,jpg|max:2048' : 'nullable|image|mimes:jpeg,png,jpg|max:2048', ]; } public function messages(): array { return [ 'required' => 'Kolom :attribute tidak boleh kosong.', 'string' => 'Input :attribute harus berupa teks valid.', 'min' => ':attribute terlalu pendek, minimal harus :min karakter.', 'max' => ':attribute melebihi batas, maksimal :max karakter/KB.', 'in' => 'Pilihan :attribute tidak sesuai dengan data yang tersedia.', 'numeric' => ':attribute harus berupa angka.', 'image' => ':attribute harus berupa file gambar (foto).', 'mimes' => 'Format :attribute tidak didukung. Gunakan format: jpeg, png, atau jpg.', 'foto.max' => 'Ukuran :attribute terlalu besar, maksimal adalah 2MB.', ]; } public function attributes(): array { return [ 'nama' => 'nama buket', 'ukuran' => 'ukuran buket', 'kategori' => 'kategori buket', 'harga' => 'harga', 'request_khusus' => 'request khusus', 'deskripsi' => 'deskripsi produk', 'foto' => 'foto produk', ]; } /** * Trik untuk Modal: Mengembalikan error ke modal yang tepat */ protected function failedValidation(Validator $validator) { $redirect = redirect()->back()->withErrors($validator)->withInput(); if ($this->isMethod('post')) { $redirect->with('error_modal', 'create'); } else { // Mengambil ID dari parameter route untuk modal edit $redirect->with('error_id', $this->route('buket')); } throw new HttpResponseException($redirect); } }