🧩 Контроллер формы
Это руководство демонстрирует, как создать и обработать пользовательскую форму с помощью FormController в PageBlocks.
📄 1. Пример разметки формы
html
<form pb-form action="/form/submit" method="post" enctype="multipart/form-data">
<input type="hidden" name="_token" value="{csrf_token}">
<input type="hidden" name="honeypot" value="">
<input type="hidden" name="formname" value="Job">
<div class="modal-body">
<div class="mb-3">
<label for="job-name" class="col-form-label">Имя:</label>
<input type="text" class="form-control" name="name" id="job-name">
<span class="invalid-feedback" data-error="name"></span>
</div>
<div class="mb-3">
<label for="job-email" class="col-form-label">E-mail:</label>
<input type="email" class="form-control" name="email" id="job-email">
<span class="invalid-feedback" data-error="email"></span>
</div>
<div class="mb-3">
<label for="job-file" class="col-form-label">Резюме (PDF, DOC, DOCX):</label>
<input type="file" class="form-control" name="file" id="job-file">
<span class="invalid-feedback" data-error="file"></span>
</div>
<div class="mb-3">
<label for="job-message" class="col-form-label">Сообщение:</label>
<textarea class="form-control" name="message" id="job-message"></textarea>
<span class="invalid-feedback" data-error="message"></span>
</div>
</div>
<button type="submit" class="btn btn-primary">Отправить</button>
</form>🛣 2. Определение маршрута
Определите маршрут в core/App/routes/web.php:
php
use PageBlocks\App\Http\Controllers\FormController;
Route::post('/form/submit', [FormController::class, 'handle']);⚙️ 3. Логика контроллера формы
Расположен в core/App/Http/Controllers/FormController.php:
php
<?php
namespace PageBlocks\App\Http\Controllers;
use Boshnik\PageBlocks\Http\Request;
use Boshnik\PageBlocks\Support\Mail;
class FormController extends Controller
{
public function handle(Request $request)
{
// ⚠️ Валидация данных формы
$validated = $request->validate([
'honeypot' => 'empty|exclude', // Анти-спам: должно быть пустым
'formname' => 'required|string',
'name' => 'required|string|max:255',
'email' => 'required|email',
'file' => 'required|file|mimes:pdf,doc,docx,jpg|min:100|max:2048',
'message' => 'nullable|string',
]);
// 📥 Сохранение загруженного файла в assets/images/files
$validated['file'] = $request->file('file')->store('assets/images/files');
// Добавление IP-адреса пользователя
$validated['ip'] = $request->ip();
// 💾 Сохранение формы в таблицу pbTableValue
$save = query(\pbTableValue::class)->create([
'model_type' => 'pbMenu', // Может быть также modDocument или modUser
'field_name' => 'forms',
'createdon' => time(),
'values' => json_encode($validated),
]);
if (!$save) {
$this->modx->log(modX::LOG_LEVEL_ERROR, 'Ошибка сохранения формы: ' . print_r($validated, true));
}
// 📬 Отправка email менеджеру
Mail::to('pageblocks@boshnik.com')
->subject('Отправка резюме')
->view('chunks/email/manager', $validated)
->attach($validated['file'])
->send();
// 📤 Отправка подтверждения пользователю
Mail::send($validated['email'], 'Ваше резюме получено', 'Мы свяжемся с вами в ближайшее время!');
// Или с помощью хелпера:
// mail($validated['email'], 'Ваше резюме получено', 'Мы свяжемся с вами в ближайшее время!');
return response()->success('Сообщение об успехе');
}
}