voyager-admin/voyager

View on GitHub
src/Traits/Bread/Saveable.php

Summary

Maintainability
A
1 hr
Test Coverage
F
45%
<?php

namespace Voyager\Admin\Traits\Bread;

use Illuminate\Support\Collection;
use Illuminate\Support\Str;

trait Saveable
{
    public function updateStoreData(Collection $formfields, mixed $data, mixed $model, bool $update = true): mixed
    {
        $formfields->each(function ($formfield) use ($data, &$model, $update) {
            $value = $data[$formfield->column->column] ?? '';

            if ($formfield->translatable ?? false) {
                $translations = [];
                $old = $model->{$formfield->column->column};
                if (!is_object($old)) {
                    $old = @json_decode($old);
                }
                foreach ($value as $locale => $translated) {
                    if ($update) {
                        $old = (isset($old->{$locale}) ? $old->{$locale} : '');
                        $translations[$locale] = $formfield->update($model, $translated, $old);
                    } else {
                        $translations[$locale] = $formfield->store($translated);
                    }
                }
                $value = json_encode($translations);
            } else {
                if ($update) {
                    $value = $formfield->update($model, $value, $model->{$formfield->column->column});
                } else {
                    $value = $formfield->store($value);
                }
            }

            if ($formfield->column->type == 'column') {
                $model->{$formfield->column->column} = $value;
            } elseif ($formfield->column->type == 'computed') {
                if (method_exists($model, 'set'.Str::camel($formfield->column->column).'Attribute')) {
                    $model->{$formfield->column->column} = $value;
                }
            }
        });

        return $model;
    }
}