Files
ntspi-app/app/Containers/Dashboard/UI/WEB/Requests/UpdateAcademicJournalRequest.php
2026-04-07 17:54:26 +05:00

108 lines
3.4 KiB
PHP

<?php
namespace App\Containers\Dashboard\UI\WEB\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
class UpdateAcademicJournalRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => ['required', 'string', 'max:255'],
'slug' => [
'required',
'string',
'max:255',
'unique:academic_journals,slug,' . $this->route('academicJournal')->id,
],
'main_info' => ['nullable', 'array'],
'chief_editor' => ['nullable', 'array'],
'editors' => ['nullable', 'array'],
'for_authors' => ['nullable', 'array'],
];
}
public function messages(): array
{
return [
'title.required' => 'Название журнала обязательно для заполнения',
'title.max' => 'Название журнала не должно превышать 255 символов',
'slug.required' => 'URL-адрес обязателен для заполнения',
'slug.unique' => 'Журнал с таким URL-адресом уже существует',
];
}
protected function prepareForValidation(): void
{
// Автоматическая генерация slug если не передан
if (empty($this->slug) && !empty($this->title)) {
$this->merge([
'slug' => Str::slug($this->title),
]);
}
// Генерация search_data из main_info
if (!empty($this->main_info)) {
$this->merge([
'search_data' => $this->generateSearchData($this->main_info),
]);
}
}
private function generateSearchData(array $data): string
{
$parts = [];
foreach ($data as $block) {
$parts[] = $this->getDataFromBlocks($block);
}
$result = implode(' ', $parts);
$result = preg_replace('/\s+/', ' ', $result);
$result = trim($result);
return strtolower($result);
}
private function getDataFromBlocks($block): string
{
$data = '';
switch ($block['type']) {
case 'paragraph':
$data .= strip_tags($block['data']['content']) . ' ';
break;
case 'heading':
$data .= strip_tags($block['data']['content']) . ' ';
break;
case 'files':
foreach ($block['data']['file'] as $file) {
$data .= $file['title'] . ' ';
}
break;
case 'person':
$data .= $block['data']['name'] . ' ';
break;
case 'stepper':
$data .= $block['data']['step_name'] . ' ';
foreach ($block['data']['steps'] as $step) {
$data .= $step['title'] . ' ';
$data .= strip_tags($step['content']) . ' ';
}
break;
case 'tabs':
foreach ($block['data']['tab'] as $item) {
foreach ($item['content'] as $blockItem) {
$data .= $this->getDataFromBlocks($blockItem);
}
}
break;
}
return $data;
}
}