first commit

This commit is contained in:
brusnitsyn
2026-01-04 23:15:06 +09:00
commit 0ec04cfb4b
104 changed files with 19072 additions and 0 deletions

122
app/Models/MetrikaForm.php Normal file
View 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 => ''
};
}
}