first commit
This commit is contained in:
122
app/Models/MetrikaForm.php
Normal file
122
app/Models/MetrikaForm.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?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 => ''
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user