| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- {{--
- Вьюха: Создание / редактирование веб-формы с конструктором полей
- Создана: 2026-05-07
- Контроллер: Admin\WebFormController::create() / edit()
- Переменные: $form (WebForm — пустая при создании, заполненная при редактировании)
- JS-конструктор вынесен в: admin/forms/partials/_form_editor_js.blade.php
- Типы полей: text, tel, email, select, textarea, checkbox
- Ширина поля: full (100%) / half (50%)
- --}}
- @extends('admin.layout')
- @section('title', $form->exists ? 'Редактировать форму' : 'Новая форма')
- @section('content_header')
- <div class="d-flex justify-content-between align-items-center">
- <h1 class="m-0">{{ $form->exists ? 'Редактировать форму: ' . $form->title : 'Новая форма' }}</h1>
- <a href="{{ route('admin.forms.index') }}" class="btn btn-default btn-sm">
- <i class="fas fa-arrow-left"></i> Назад
- </a>
- </div>
- @stop
- @section('breadcrumb')
- <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
- <li class="breadcrumb-item"><a href="{{ route('admin.forms.index') }}">Веб-формы</a></li>
- <li class="breadcrumb-item active">{{ $form->exists ? 'Редактировать' : 'Создать' }}</li>
- @stop
- @section('content')
- @if($errors->any())
- <div class="alert alert-danger">
- <ul class="mb-0">
- @foreach($errors->all() as $e) <li>{{ $e }}</li> @endforeach
- </ul>
- </div>
- @endif
- @if($form->exists)
- <form id="formEditor" action="{{ route('admin.forms.update', $form) }}" method="POST">
- @method('PUT')
- @else
- <form id="formEditor" action="{{ route('admin.forms.store') }}" method="POST">
- @endif
- @csrf
- <div class="row">
- {{-- Основные настройки --}}
- <div class="col-md-8">
- <div class="card card-primary card-outline">
- <div class="card-header"><h3 class="card-title">Настройки формы</h3></div>
- <div class="card-body">
- <div class="row">
- <div class="col-md-6">
- <div class="form-group">
- <label>Название <span class="text-danger">*</span></label>
- <input type="text" name="title" id="formTitle"
- class="form-control @error('title') is-invalid @enderror"
- value="{{ old('title', $form->title) }}"
- placeholder="Контактная форма" required>
- @error('title')<div class="invalid-feedback">{{ $message }}</div>@enderror
- </div>
- </div>
- <div class="col-md-6">
- <div class="form-group">
- <label>Слаг (уникальный идентификатор) <span class="text-danger">*</span></label>
- <input type="text" name="slug" id="formSlug"
- class="form-control @error('slug') is-invalid @enderror"
- value="{{ old('slug', $form->slug) }}"
- placeholder="contact" pattern="[a-z0-9\-_]+" required>
- <small class="text-muted">Только строчные буквы, цифры, дефис</small>
- @error('slug')<div class="invalid-feedback">{{ $message }}</div>@enderror
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-8">
- <div class="form-group mb-0">
- <label>Email для уведомлений о заявках</label>
- <input type="email" name="notify_email"
- class="form-control @error('notify_email') is-invalid @enderror"
- value="{{ old('notify_email', $form->notify_email) }}"
- placeholder="manager@example.ru">
- @error('notify_email')<div class="invalid-feedback">{{ $message }}</div>@enderror
- </div>
- </div>
- <div class="col-md-4">
- <div class="form-group mb-0">
- <label>Статус</label>
- <div class="mt-2">
- <div class="custom-control custom-switch">
- <input type="checkbox" class="custom-control-input" id="isActive"
- name="is_active" value="1"
- {{ old('is_active', $form->is_active ?? true) ? 'checked' : '' }}>
- <label class="custom-control-label" for="isActive">Форма активна</label>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- {{-- Конструктор полей --}}
- <div class="card card-secondary card-outline">
- <div class="card-header d-flex justify-content-between align-items-center">
- <h3 class="card-title">Поля формы</h3>
- <button type="button" class="btn btn-primary btn-sm" id="addFieldBtn">
- <i class="fas fa-plus"></i> Добавить поле
- </button>
- </div>
- <div class="card-body p-0">
- <div id="fieldsContainer"></div>
- <div id="fieldsEmpty" class="text-center text-muted py-4" style="display:none">
- <i class="fas fa-list fa-2x mb-2"></i><br>
- Нет полей. Нажмите «Добавить поле».
- </div>
- </div>
- <div class="card-footer">
- <small class="text-muted">
- <strong>Типы:</strong> text — текст, tel — телефон, email — почта, select — список, textarea — многострочный, checkbox — согласие<br>
- <strong>Ширина:</strong> full — полная, half — половина
- </small>
- </div>
- </div>
- </div>
- {{-- Правая колонка --}}
- <div class="col-md-4">
- <div class="card card-secondary card-outline">
- <div class="card-header"><h3 class="card-title">Использование</h3></div>
- <div class="card-body text-muted" style="font-size:13px;line-height:1.9">
- <p>Вставьте компонент в Blade-шаблон:</p>
- <code id="shortcodeHint"><x-web-form slug="{{ $form->slug ?: 'слаг' }}" /></code>
- <hr>
- <p><strong>Checkbox</strong> — одиночный чекбокс-согласие (данные не сохраняются в заявку)</p>
- <p><strong>Select</strong> — укажите варианты через Enter</p>
- <p class="mb-0"><strong>name</strong> — авто-заполняется из label, можно изменить</p>
- </div>
- </div>
- <div class="card card-secondary card-outline">
- <div class="card-body">
- <button type="submit" class="btn btn-primary btn-block">
- <i class="fas fa-save"></i> Сохранить форму
- </button>
- </div>
- </div>
- </div>
- </div>
- {{-- Скрытое поле — JSON полей, заполняется перед отправкой --}}
- <input type="hidden" name="fields_json" id="fieldsJson">
- </form>
- @stop
- @push('js')
- @include('admin.forms.partials._form_editor_js')
- @endpush
|