public function store(Request $request, FormDefinition $formDef) { $this->validate($request, ['name' => 'required|max:255|string', 'email' => 'required|email']); $fields = new Collection(); $errors = new Collection(); $request->session()->forget('field_validation_errors'); $request->session()->put('field_validation_errors', []); if ($formDef->submissions()->where('email', $request->input('email'))->get()->count() > 0) { $errors->push("A submission already exists for the e-mail you used: " . $request->input("email")); } foreach ($formDef->fields()->get() as $field) { $options = json_decode($field->options); if ($options->required && !$request->has($field->field_id) && ($field->type != 'Checkbox' && $field->type != 'File')) { $errors->push("Missing required field named " . $field->name . " with ID " . $field->field_id); } elseif ($options->required && $field->type == "File" && !$request->hasFile($field->field_id)) { $errors->push("Missing required file field named " . $field->name . " with ID " . $field->field_id); } elseif (!$request->has($field->field_id) && $field->type != 'File') { $fields->put($field->field_id, null); } else { if ($this->verifyField($field, $request->input($field->field_id), $request)) { if ($field->type != 'File') { $fields->put($field->field_id, $request->input($field->field_id)); } else { $fname = "file_" . str_random(32) . "." . $request->file($field->field_id)->getClientOriginalExtension(); $file = $request->file($field->field_id)->move('../storage/app/form/' . $formDef->id, $fname); $fields->put($field->field_id, $fname); } } else { $errors->push("Invalid value for field named \"" . $field->name . "\" with ID " . $field->field_id); } } } if ($errors->count() > 0) { //return response()->json(["The submission was REJECTED and errors follow",$errors],422); return redirect()->back()->withErrors($errors); //return view('formdefinitions.display', compact('fields', 'errors')); } $request->session()->forget('form_validation_errors'); $submission = new Submission(["form_definition_id" => $formDef->id, "name" => $request->input('name'), "email" => $request->input('email'), "password" => null, "submitted" => Carbon::now(), "status" => 'Reviewing', "options" => $fields->toJson()]); $submission->save(); //return response()->json(["The submission was accepted and follows",$submission],200); return view('formdefinitions.accepted', compact('formDef', 'submission')); }
public function update(FormDefinition $form, Request $request) { if ($form->status != "Drafting" || $form->submissions()->get()->count() > 0) { return response()->json(["error" => true, "message" => ["You cannot edit a form that isn't a Draft or has submissions"]], 405); } else { $this->validate($request, ['name' => 'required|max:100', 'description' => 'required', 'definition' => 'required|array']); $fieldErrors = new Collection(); $old_fields = $form->fields()->get(); $new_fields = new Collection(); $formDef = $form; $formDef->name = $request->input("name"); $formDef->description = $request->input('description'); foreach ($request->input('definition') as $fieldArray) { $fieldDef = collect($fieldArray); $type = $fieldDef->get("type"); if ($type == "Text") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required|boolean', 'text_type' => 'required|in:any,num,alpha,email,phone,date,time,multiline']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('text_type', $fieldDef->get('text_type')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { if ($type == "Checkbox") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'value_checked' => 'required', 'value_unchecked' => 'required']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('value_unchecked', $fieldDef->get('value_unchecked')); $field_options->put('value_checked', $fieldDef->get('value_checked')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { if ($type == "Select") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'multipleselect' => 'required|boolean', 'options' => 'required|array', 'options.*.label' => 'required', 'options.*.value' => 'required']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('multipleselect', $fieldDef->get('multipleselect')); $field_options->put('options', $fieldDef->get('options')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { if ($type == "RadioGroup") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'options' => 'required|array', 'options.*.label' => 'required', 'options.*.value' => 'required']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('options', $fieldDef->get('options')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { if ($type == "Address") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('options', $fieldDef->get('options')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { if ($type == "File") { $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required']); if ($validator->fails()) { $fieldErrors->push($validator->errors()); } else { $field_options = new Collection(); $field_options->put('required', $fieldDef->get('required')); $field_options->put('types', $fieldDef->get('types')); $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]); $field->save(); } } else { $fieldErrors->push(["Unknown field type in submission"]); continue; } } } } } } $new_fields->push($field); } if ($fieldErrors->count() == 0) { foreach ($old_fields as $old_field) { $old_field->delete(); } $formDef->save(); return response()->json(["id" => $formDef->id, "new_fields" => $new_fields, "old_fields" => $old_fields], 200); } else { //$formDef->forceDelete(); $errorBag = new Collection(); foreach ($fieldErrors as $fieldError) { foreach ($fieldError->messages() as $error) { $errorBag->push($error); } } return response()->json($errorBag, 422); } } }