|
@@ -17,6 +17,7 @@ class ModelChangeDetector
|
|
|
|
|
|
$fields = call_user_func([$detector, "fields"]);
|
|
|
$diffFields = call_user_func([$detector, "diffFields"]);
|
|
|
+ $arrayFields = call_user_func([$detector, "arrayFields"]);
|
|
|
|
|
|
if (!$fields) {
|
|
|
return [];
|
|
@@ -24,18 +25,50 @@ class ModelChangeDetector
|
|
|
|
|
|
$items = [];
|
|
|
foreach ($fields as $field) {
|
|
|
- if (! $model->isDirty($field)) {
|
|
|
+ if (! $model->isDirty($field) && ! in_array($field, $diffFields)) {
|
|
|
continue;
|
|
|
}
|
|
|
+ if (in_array($field, $arrayFields)) {
|
|
|
+ $items = array_merge($items, self::getArrayChange($model, $field));
|
|
|
+ } else {
|
|
|
+ $change = self::getChange($model, $field);
|
|
|
+ if ($change['diff']) {
|
|
|
+ $items[] = $change;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ return $items;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getChange(Model $model, $field): array
|
|
|
+ {
|
|
|
+ return [
|
|
|
+ 'old' => is_array($model->getOriginal($field)) ? json_encode($model->getOriginal($field)) : $model->getOriginal($field),
|
|
|
+ 'field' => $field,
|
|
|
+ 'new' => is_array($model->$field) ? json_encode($model->$field) : $model->$field,
|
|
|
+ 'diff' => text_diff($model->getOriginal($field) ?? '', $model->$field ?? '')
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getArrayChange(Model $model, $field): array
|
|
|
+ {
|
|
|
+ $items = [];
|
|
|
+ $oldArr = $model->getOriginal($field);
|
|
|
+ $newArr = $model->$field;
|
|
|
+ foreach ($newArr as $field => $newValue) {
|
|
|
+ $oldValue = $oldArr[$field] ?? null;
|
|
|
+ $diff = text_diff($oldValue ?? '', $newValue ?? '');
|
|
|
+ if (!$diff) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
$items[] = [
|
|
|
- 'old' => is_array($model->getOriginal($field)) ? json_encode($model->getOriginal($field)) : $model->getOriginal($field),
|
|
|
+ 'old' => is_array($oldValue) ? json_encode($oldValue, JSON_UNESCAPED_UNICODE) : $oldValue,
|
|
|
'field' => $field,
|
|
|
- 'new' => is_array($model->$field) ? json_encode($model->$field) : $model->$field,
|
|
|
- 'diff' => in_array($field, $diffFields) ? text_diff($model->getOriginal($field) ?? '', $model->$field ?? '') : null,
|
|
|
+ 'new' => is_array($newValue) ? json_encode($newValue, JSON_UNESCAPED_UNICODE) : $newValue,
|
|
|
+ 'diff' => $diff
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
return $items;
|
|
|
}
|
|
|
}
|