123 lines
4.0 KiB
PHP
123 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class MetrikaForm extends Model
|
|
{
|
|
protected $table = 'metrika_group_items';
|
|
protected $primaryKey = 'metrika_group_item_id';
|
|
public $timestamps = false;
|
|
|
|
protected $fillable = [
|
|
'rf_metrika_group_id',
|
|
'rf_metrika_item_id'
|
|
];
|
|
|
|
// Метод для получения данных формы
|
|
public static function getFormData($groupId)
|
|
{
|
|
return self::with(['group', 'item'])
|
|
->where('rf_metrika_group_id', $groupId)
|
|
->get()
|
|
->map(function ($formItem) {
|
|
return [
|
|
'metrika_group_item_id' => $formItem->metrika_group_item_id,
|
|
'metrika_group_id' => $formItem->group->metrika_group_id,
|
|
'metrika_group_name' => $formItem->group->name,
|
|
'metrika_group_description' => $formItem->group->description,
|
|
'metrika_item_id' => $formItem->item->metrika_item_id,
|
|
'metrika_item_name' => $formItem->item->name,
|
|
'metrika_item_description' => $formItem->item->description,
|
|
'metrika_item_data_type' => $formItem->item->data_type,
|
|
'validation_rules' => $formItem->item->validation_rules ?? [],
|
|
'default_value' => $formItem->item->default_value,
|
|
'is_required' => $formItem->item->is_required ?? false,
|
|
'order' => $formItem->order ?? 0,
|
|
'section' => $formItem->section ?? 'general'
|
|
];
|
|
})
|
|
->sortBy('order')
|
|
->values();
|
|
}
|
|
|
|
// Связи
|
|
public function group()
|
|
{
|
|
return $this->belongsTo(MetrikaGroup::class, 'rf_metrika_group_id', 'metrika_group_id');
|
|
}
|
|
|
|
public function item()
|
|
{
|
|
return $this->belongsTo(MetrikaItem::class, 'rf_metrika_item_id', 'metrika_item_id');
|
|
}
|
|
|
|
// Генерация схемы валидации для фронта
|
|
public static function getValidationSchema($groupId)
|
|
{
|
|
$formItems = self::getFormData($groupId);
|
|
|
|
$schema = [];
|
|
$defaults = [];
|
|
|
|
foreach ($formItems as $item) {
|
|
$fieldName = "metrika_item_{$item['metrika_item_id']}";
|
|
|
|
// Правила валидации
|
|
$rules = [];
|
|
|
|
if ($item['is_required']) {
|
|
$rules[] = 'required';
|
|
}
|
|
|
|
if ($item['validation_rules']) {
|
|
foreach ($item['validation_rules'] as $rule => $value) {
|
|
switch ($rule) {
|
|
case 'min':
|
|
$rules[] = "min:{$value}";
|
|
break;
|
|
case 'max':
|
|
$rules[] = "max:{$value}";
|
|
break;
|
|
case 'numeric':
|
|
$rules[] = 'numeric';
|
|
break;
|
|
case 'integer':
|
|
$rules[] = 'integer';
|
|
break;
|
|
case 'string':
|
|
$rules[] = 'string';
|
|
break;
|
|
case 'boolean':
|
|
$rules[] = 'boolean';
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$schema[$fieldName] = $rules;
|
|
|
|
// Значение по умолчанию
|
|
$defaults[$fieldName] = $item['default_value'] ?? self::getDefaultByType($item['metrika_item_data_type']);
|
|
}
|
|
|
|
return [
|
|
'schema' => $schema,
|
|
'defaults' => $defaults,
|
|
'fields' => $formItems
|
|
];
|
|
}
|
|
|
|
private static function getDefaultByType($dataType)
|
|
{
|
|
return match($dataType) {
|
|
'integer', 'float' => 0,
|
|
'string', 'text' => '',
|
|
'boolean' => false,
|
|
'select' => null,
|
|
default => ''
|
|
};
|
|
}
|
|
}
|