From 586eab0a883adc1993bc4b064d4e365f6d92fc98 Mon Sep 17 00:00:00 2001 From: alexvenga Date: Fri, 9 Dec 2022 15:18:41 +0300 Subject: [PATCH 1/2] New field Translatable extends of Json, for spatie/laravel-translatable package --- src/Fields/Spatie/Translatable.php | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/Fields/Spatie/Translatable.php diff --git a/src/Fields/Spatie/Translatable.php b/src/Fields/Spatie/Translatable.php new file mode 100644 index 000000000..fe96887c8 --- /dev/null +++ b/src/Fields/Spatie/Translatable.php @@ -0,0 +1,85 @@ +fields([ + Select::make($key, 'key') + ->options(array_combine($this->getLanguagesCodes(), array_map(fn($code) => Str::upper($code), $this->getLanguagesCodes()))) + ->nullable(), + Text::make($value, 'value'), + ]); + + return $this; + } + + protected function getLanguagesCodes(): array + { + sort($this->languagesCodes); + return $this->languagesCodes; + } + + public function getFields(): array + { + + if (empty($this->fields)) { + $this->fields([ + Select::make('Language', 'key') + ->options(array_combine($this->getLanguagesCodes(), array_map(fn($code) => Str::upper($code), $this->getLanguagesCodes()))) + ->nullable(), + Text::make('Value', 'value'), + ]); + } + + return parent::getFields(); + } + + public function hasFields(): bool + { + return true; + } + + public function indexViewValue(Model $item, bool $container = false): string + { + return $item->{$this->field()}; + } + + public function exportViewValue(Model $item): string + { + return $item->{$this->field()}; + } + + public function formViewValue(Model $item): mixed + { + return $item->getTranslations($this->field()); + } + + public function save(Model $item): Model + { + if ($this->requestValue() !== false) { + $item->{$this->field()} = collect($this->requestValue()) + ->filter(fn($data) => !empty($data['key']) && !empty($data['value'])) + ->mapWithKeys(fn($data) => [$data['key'] => $data['value']]) + ->toArray(); + } + + return $item; + } + +} From e0bbd9b7ac37b7a6c014a2ed110f429d47f9bff2 Mon Sep 17 00:00:00 2001 From: alexvenga Date: Fri, 9 Dec 2022 16:40:04 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B2=D0=B4=D0=B2=D0=B0=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0:=20requiredLanguages(array)=20-=20=D1=8F?= =?UTF-8?q?=D0=B7=D1=8B=D0=BA=D0=B8=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D1=8B=20=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B,=20=D0=B8=D0=BD=D0=B0=D1=87=D0=B5=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D1=87=D0=B8=D1=82=20=D0=B8=D1=81=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20priorityLanguages(array)?= =?UTF-8?q?=20-=20=D1=8F=D0=B7=D1=8B=D0=BA=D0=B8=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B5=20=D0=B1=D1=83=D0=B4=D1=83=D1=82=20?= =?UTF-8?q?=D0=B2=D0=B2=D0=B5=D1=80=D1=85=D1=83=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=8F=D0=B7=D1=8B?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Fields/Spatie/Translatable.php | 59 ++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/src/Fields/Spatie/Translatable.php b/src/Fields/Spatie/Translatable.php index fe96887c8..617103197 100644 --- a/src/Fields/Spatie/Translatable.php +++ b/src/Fields/Spatie/Translatable.php @@ -4,6 +4,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; +use Illuminate\Validation\ValidationException; use Leeto\MoonShine\Fields\Json; use Leeto\MoonShine\Fields\Select; use Leeto\MoonShine\Fields\Text; @@ -15,13 +16,51 @@ class Translatable extends Json "af", "sq", "am", "ar", "an", "hy", "ast", "az", "eu", "be", "bn", "bs", "br", "bg", "ca", "ckb", "zh", "zh-HK", "zh-CN", "zh-TW", "co", "hr", "cs", "da", "nl", "en", "en-AU", "en-CA", "en-IN", "en-NZ", "en-ZA", "en-GB", "en-US", "eo", "et", "fo", "fil", "fi", "fr", "fr-CA", "fr-FR", "fr-CH", "gl", "ka", "de", "de-AT", "de-DE", "de-LI", "de-CH", "el", "gn", "gu", "ha", "haw", "he", "hi", "hu", "is", "id", "ia", "ga", "it", "it-IT", "it-CH", "ja", "kn", "kk", "km", "ko", "ku", "ky", "lo", "la", "lv", "ln", "lt", "mk", "ms", "ml", "mt", "mr", "mn", "ne", "no", "nb", "nn", "oc", "or", "om", "ps", "fa", "pl", "pt", "pt-BR", "pt-PT", "pa", "qu", "ro", "mo", "rm", "ru", "gd", "sr", "sh", "sn", "sd", "si", "sk", "sl", "so", "st", "es", "es-AR", "es-419", "es-MX", "es-ES", "es-US", "su", "sw", "sv", "tg", "ta", "tt", "te", "th", "ti", "to", "tr", "tk", "tw", "uk", "ur", "ug", "uz", "vi", "wa", "cy", "fy", "xh", "yi", "yo", "zu", ]; + protected array $requiredLanguagesCodes = []; + + protected array $priorityLanguagesCodes = []; + protected bool $keyValue = true; + /** + * @param array $languages Массив кодов языков, которые обязательно надо ввести при редактировании + * @return $this + */ + public function requiredLanguages(array $languages): static + { + sort($languages); + $this->requiredLanguagesCodes = $languages; + + return $this; + } + + /** + * @param array $languages Массив кодов языков, которые которые будут вверху select языков + * @return $this + */ + public function priorityLanguages(array $languages): static + { + sort($languages); + $this->priorityLanguagesCodes = $languages; + + return $this; + } + + protected function getLanguagesCodes(): array + { + sort($this->languagesCodes); + + return collect(array_combine($this->requiredLanguagesCodes, $this->requiredLanguagesCodes)) + ->merge(array_combine($this->priorityLanguagesCodes, $this->priorityLanguagesCodes)) + ->merge(array_combine($this->languagesCodes, $this->languagesCodes)) + ->toArray(); + } + public function keyValue(string $key = 'Language', string $value = 'Value'): static { $this->fields([ Select::make($key, 'key') - ->options(array_combine($this->getLanguagesCodes(), array_map(fn($code) => Str::upper($code), $this->getLanguagesCodes()))) + ->options($this->getLanguagesCodes()) ->nullable(), Text::make($value, 'value'), ]); @@ -29,12 +68,6 @@ public function keyValue(string $key = 'Language', string $value = 'Value'): sta return $this; } - protected function getLanguagesCodes(): array - { - sort($this->languagesCodes); - return $this->languagesCodes; - } - public function getFields(): array { @@ -73,10 +106,20 @@ public function formViewValue(Model $item): mixed public function save(Model $item): Model { if ($this->requestValue() !== false) { - $item->{$this->field()} = collect($this->requestValue()) + $array = collect($this->requestValue()) ->filter(fn($data) => !empty($data['key']) && !empty($data['value'])) ->mapWithKeys(fn($data) => [$data['key'] => $data['value']]) ->toArray(); + + $notSetLanguages = array_diff($this->requiredLanguagesCodes, array_keys($array)); + + if (!empty($notSetLanguages)) { + throw ValidationException::withMessages( + [$this->field() => + sprintf('Для поля %s не заданы значения переводов на языки: %s', $this->label(), implode(', ', $notSetLanguages))]); + } + + $item->{$this->field()} = $array(); } return $item;