authorizeAccess(); $this->fillForm(); $this->previousUrl = url()->previous(); } protected function authorizeAccess(): void { static::authorizeResourceAccess(); abort_unless(static::getResource()::canCreate(), 403); } protected function fillForm(): void { $this->callHook('beforeFill'); $this->form->fill(); $this->callHook('afterFill'); } public function create(bool $another = false): void { $this->authorizeAccess(); try { $this->callHook('beforeValidate'); $data = $this->form->getState(); $this->callHook('afterValidate'); $data = $this->mutateFormDataBeforeCreate($data); $this->callHook('beforeCreate'); $this->record = $this->handleRecordCreation($data); $this->form->model($this->record)->saveRelationships(); $this->callHook('afterCreate'); } catch (Halt $exception) { return; } $this->getCreatedNotification()?->send(); if ($another) { // Ensure that the form record is anonymized so that relationships aren't loaded. $this->form->model($this->record::class); $this->record = null; $this->fillForm(); return; } $this->redirect($this->getRedirectUrl()); } protected function getCreatedNotification(): ?Notification { $title = $this->getCreatedNotificationTitle(); if (blank($title)) { return null; } return Notification::make() ->success() ->title($title); } protected function getCreatedNotificationTitle(): ?string { return $this->getCreatedNotificationMessage() ?? __('filament::resources/pages/create-record.messages.created'); } /** * @deprecated Use `getCreatedNotificationTitle()` instead. */ protected function getCreatedNotificationMessage(): ?string { return null; } public function createAnother(): void { $this->create(another: true); } protected function handleRecordCreation(array $data): Model { return $this->getModel()::create($data); } protected function mutateFormDataBeforeCreate(array $data): array { return $data; } protected function getFormActions(): array { return array_merge( [$this->getCreateFormAction()], static::canCreateAnother() ? [$this->getCreateAnotherFormAction()] : [], [$this->getCancelFormAction()], ); } protected function getCreateFormAction(): Action { return Action::make('create') ->label(__('filament::resources/pages/create-record.form.actions.create.label')) ->submit('create') ->keyBindings(['mod+s']); } protected function getSubmitFormAction(): Action { return $this->getCreateFormAction(); } protected function getCreateAnotherFormAction(): Action { return Action::make('createAnother') ->label(__('filament::resources/pages/create-record.form.actions.create_another.label')) ->action('createAnother') ->keyBindings(['mod+shift+s']) ->color('secondary'); } protected function getCancelFormAction(): Action { return Action::make('cancel') ->label(__('filament::resources/pages/create-record.form.actions.cancel.label')) ->url($this->previousUrl ?? static::getResource()::getUrl()) ->color('secondary'); } protected function getTitle(): string { if (filled(static::$title)) { return static::$title; } return __('filament::resources/pages/create-record.title', [ 'label' => Str::headline(static::getResource()::getModelLabel()), ]); } protected function getForms(): array { return [ 'form' => $this->makeForm() ->context('create') ->model($this->getModel()) ->schema($this->getFormSchema()) ->statePath('data') ->inlineLabel(config('filament.layout.forms.have_inline_labels')), ]; } protected function getFormSchema(): array { return $this->getResourceForm(columns: config('filament.layout.forms.have_inline_labels') ? 1 : 2)->getSchema(); } protected function getRedirectUrl(): string { $resource = static::getResource(); if ($resource::hasPage('view') && $resource::canView($this->record)) { return $resource::getUrl('view', ['record' => $this->record]); } if ($resource::hasPage('edit') && $resource::canEdit($this->record)) { return $resource::getUrl('edit', ['record' => $this->record]); } return $resource::getUrl('index'); } protected function getMountedActionFormModel(): string { return $this->getModel(); } protected static function canCreateAnother(): bool { return static::$canCreateAnother; } public static function disableCreateAnother(): void { static::$canCreateAnother = false; } }