fillForm(); } protected function fillForm(): void { $this->callHook('beforeFill'); $this->data = []; foreach ($this->getSettingsClasses() as $settingsClass) { $settings = resolve($settingsClass); $this->data = array_merge($this->data, $settings->toArray()); } $this->form->fill($this->data); $this->callHook('afterFill'); } protected function getSettingsClasses(): array { $settingsNamespace = 'App\\Settings'; $settingsPath = app_path('Settings'); $settingsFiles = scandir($settingsPath); $settingsClasses = []; foreach ($settingsFiles as $file) { if (substr($file, -4) === '.php') { $className = $settingsNamespace . '\\' . basename($file, '.php'); if (class_exists($className)) { $reflectionClass = new ReflectionClass($className); if ($reflectionClass->implementsInterface(SettingsTabInterface::class)) { $settingsClasses[] = $className; } } } } // Sort settings classes by tab order usort($settingsClasses, function ($a, $b) { return $a::tabOrder() <=> $b::tabOrder(); }); return $settingsClasses; } public function save(): void { try { $this->beginDatabaseTransaction(); $this->callHook('beforeValidate'); $data = $this->form->getState(); $this->callHook('afterValidate'); $data = $this->mutateFormDataBeforeSave($data); $this->callHook('beforeSave'); foreach ($this->getSettingsClasses() as $settingsClass) { $settings = resolve($settingsClass); $settingsData = array_intersect_key($data, array_flip(array_keys($settings->toArray()))); if ($settings->toArray() != $settingsData) { $settings->fill($settingsData); $settings->save(); } } $this->callHook('afterSave'); $this->commitDatabaseTransaction(); } catch (Halt $exception) { $exception->shouldRollbackDatabaseTransaction() ? $this->rollBackDatabaseTransaction() : $this->commitDatabaseTransaction(); return; } catch (Throwable $exception) { $this->rollBackDatabaseTransaction(); throw $exception; } $this->rememberData(); $this->getSavedNotification()?->send(); if ($redirectUrl = $this->getRedirectUrl()) { $this->redirect($redirectUrl, navigate: FilamentView::hasSpaMode() && is_app_url($redirectUrl)); } } public function getSavedNotification(): ?Notification { $title = $this->getSavedNotificationTitle(); if (blank($title)) { return null; } return Notification::make() ->success() ->title($title); } public function getSavedNotificationTitle(): ?string { return __('Settings saved successfully'); } /** * @param array $data * @return array */ protected function mutateFormDataBeforeSave(array $data): array { return $data; } /** * @return array */ public function getFormActions(): array { return [ $this->getSaveFormAction(), ]; } public function getRedirectUrl(): ?string { return null; } public function getSaveFormAction(): Action { return Action::make('save') ->label(__('filament-spatie-laravel-settings-plugin::pages/settings-page.form.actions.save.label')) ->submit('save') ->keyBindings(['mod+s']); } public function form(Form $form): Form { return $form; } protected function getForms(): array { return [ 'form' => $this->form( $this->makeForm() ->schema($this->getFormSchema()) ->statePath('data') ->columns(2) ), ]; } protected function getFormSchema(): array { $tabs = []; foreach ($this->getSettingsClasses() as $settingsClass) { $tabs[] = Tabs\Tab::make($settingsClass::tabName()) ->schema($settingsClass::schema()) ->columns(1); } return [ Tabs::make('Settings') ->tabs($tabs), ]; } }