WebFormController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. /*
  4. * WebFormController — управление конструктором веб-форм в административной панели.
  5. * Маршруты: resource admin/forms (index, create, store, edit, update, destroy)
  6. * Поля формы хранятся в JSON-колонке fields модели WebForm.
  7. * Поле fields приходит в POST как JSON-строка из конструктора на JS.
  8. */
  9. use App\Http\Controllers\Controller;
  10. use App\Models\Service;
  11. use App\Models\WebForm;
  12. use Illuminate\Http\RedirectResponse;
  13. use Illuminate\Http\Request;
  14. use Illuminate\View\View;
  15. class WebFormController extends Controller
  16. {
  17. public function index(): View
  18. {
  19. $forms = WebForm::withCount('leads')->latest()->get();
  20. return view('admin.forms.index', compact('forms'));
  21. }
  22. public function create(): View
  23. {
  24. $form = new WebForm;
  25. $services = $this->servicesList();
  26. return view('admin.forms.edit', compact('form', 'services'));
  27. }
  28. public function store(Request $request): RedirectResponse
  29. {
  30. $data = $this->validated($request);
  31. WebForm::create($data);
  32. return redirect()->route('admin.forms.index')->with('success', 'Форма создана.');
  33. }
  34. public function edit(WebForm $form): View
  35. {
  36. $services = $this->servicesList();
  37. return view('admin.forms.edit', compact('form', 'services'));
  38. }
  39. public function update(Request $request, WebForm $form): RedirectResponse
  40. {
  41. $data = $this->validated($request, $form);
  42. $form->update($data);
  43. return redirect()->route('admin.forms.index')->with('success', 'Форма сохранена.');
  44. }
  45. public function destroy(WebForm $form): RedirectResponse
  46. {
  47. $form->delete();
  48. return redirect()->route('admin.forms.index')->with('success', 'Форма удалена.');
  49. }
  50. // Активные услуги в порядке sort_order для подстановки в select-поля форм
  51. private function servicesList(): array
  52. {
  53. return Service::where('is_active', true)
  54. ->orderBy('sort_order')
  55. ->orderBy('title')
  56. ->pluck('title')
  57. ->toArray();
  58. }
  59. // Парсим и валидируем входящие данные формы
  60. private function validated(Request $request, ?WebForm $form = null): array
  61. {
  62. $slugRule = 'required|string|max:80|regex:/^[a-z0-9\-_]+$/|unique:web_forms,slug';
  63. if ($form && $form->exists) {
  64. $slugRule .= ','.$form->id;
  65. }
  66. $request->validate([
  67. 'title' => 'required|string|max:150',
  68. 'slug' => $slugRule,
  69. 'notify_email' => 'nullable|email|max:150',
  70. 'is_active' => 'nullable|boolean',
  71. 'fields_json' => 'nullable|string',
  72. ]);
  73. // Декодируем поля из JSON-строки
  74. $fields = [];
  75. if ($request->filled('fields_json')) {
  76. $decoded = json_decode($request->input('fields_json'), true);
  77. if (is_array($decoded)) {
  78. $fields = $decoded;
  79. }
  80. }
  81. return [
  82. 'title' => $request->input('title'),
  83. 'slug' => $request->input('slug'),
  84. 'notify_email' => $request->input('notify_email'),
  85. 'is_active' => $request->boolean('is_active'),
  86. 'fields' => $fields,
  87. ];
  88. }
  89. }