# LiveComponent FormBuilder Integration Elegante Integration zwischen LiveComponent System und bestehendem FormBuilder. ## Architektur ``` ┌─────────────────────────┐ │ MultiStepFormDefinition │ ← Value Object mit Steps └────────────┬────────────┘ │ ├─► FormStepDefinition ← Step-Info + Fields │ └─► FormFieldDefinition ← Field-Config (text, email, etc.) │ ├─► FieldType (enum) ├─► FieldCondition (conditional rendering) └─► StepValidator (validation logic) ┌─────────────────────────┐ │ MultiStepFormComponent │ ← Generic LiveComponent └────────────┬────────────┘ │ └─► LiveFormBuilder ← Erweitert bestehenden FormBuilder │ └─► FormBuilder (bestehend, wiederverwendet!) ``` ## Verwendungsbeispiel ### 1. Form Definition erstellen (Deklarativ, Type-Safe) ```php use App\Framework\LiveComponents\FormBuilder\MultiStepFormDefinition; use App\Framework\LiveComponents\FormBuilder\FormStepDefinition; use App\Framework\LiveComponents\FormBuilder\FormFieldDefinition; use App\Framework\LiveComponents\FormBuilder\FieldCondition; // Deklarative Form-Definition - kein Code-Duplikat! $userRegistrationForm = new MultiStepFormDefinition( steps: [ // Step 1: Personal Information new FormStepDefinition( title: 'Persönliche Informationen', description: 'Bitte geben Sie Ihre persönlichen Daten ein', fields: [ FormFieldDefinition::text( name: 'first_name', label: 'Vorname', required: true ), FormFieldDefinition::text( name: 'last_name', label: 'Nachname', required: true ), FormFieldDefinition::email( name: 'email', label: 'E-Mail Adresse', required: true ) ], validator: new PersonalInfoValidator() ), // Step 2: Account Type new FormStepDefinition( title: 'Konto-Typ', description: 'Wählen Sie Ihren Konto-Typ', fields: [ FormFieldDefinition::radio( name: 'account_type', label: 'Account Type', options: [ 'personal' => 'Privatkonto', 'business' => 'Geschäftskonto' ], required: true ), // Conditional Field - nur bei Business FormFieldDefinition::text( name: 'company_name', label: 'Firmenname', required: true )->showWhen( FieldCondition::equals('account_type', 'business') ), FormFieldDefinition::text( name: 'vat_number', label: 'USt-IdNr.', placeholder: 'DE123456789' )->showWhen( FieldCondition::equals('account_type', 'business') ) ], validator: new AccountTypeValidator() ), // Step 3: Preferences new FormStepDefinition( title: 'Präferenzen', description: 'Passen Sie Ihre Einstellungen an', fields: [ FormFieldDefinition::checkbox( name: 'newsletter', label: 'Newsletter abonnieren' ), FormFieldDefinition::select( name: 'language', label: 'Bevorzugte Sprache', options: [ 'en' => 'English', 'de' => 'Deutsch', 'fr' => 'Français' ], defaultValue: 'de' ) ] ) ], submitHandler: new UserRegistrationSubmitHandler() ); ``` ### 2. Validator implementieren ```php use App\Framework\LiveComponents\FormBuilder\StepValidator; final readonly class PersonalInfoValidator implements StepValidator { public function validate(array $formData): array { $errors = []; if (empty($formData['first_name'] ?? '')) { $errors['first_name'] = 'Vorname ist erforderlich'; } if (empty($formData['last_name'] ?? '')) { $errors['last_name'] = 'Nachname ist erforderlich'; } if (empty($formData['email'] ?? '')) { $errors['email'] = 'E-Mail ist erforderlich'; } elseif (!filter_var($formData['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = 'Ungültige E-Mail Adresse'; } return $errors; } } final readonly class AccountTypeValidator implements StepValidator { public function validate(array $formData): array { $errors = []; if (empty($formData['account_type'] ?? '')) { $errors['account_type'] = 'Bitte wählen Sie einen Konto-Typ'; } // Conditional validation für Business if (($formData['account_type'] ?? '') === 'business') { if (empty($formData['company_name'] ?? '')) { $errors['company_name'] = 'Firmenname ist erforderlich'; } } return $errors; } } ``` ### 3. Submit Handler implementieren ```php use App\Framework\LiveComponents\FormBuilder\FormSubmitHandler; use App\Framework\LiveComponents\FormBuilder\SubmitResult; final readonly class UserRegistrationSubmitHandler implements FormSubmitHandler { public function __construct( private UserService $userService ) {} public function handle(array $formData): SubmitResult { try { $user = $this->userService->registerUser( firstName: $formData['first_name'], lastName: $formData['last_name'], email: $formData['email'], accountType: $formData['account_type'], companyName: $formData['company_name'] ?? null, newsletter: ($formData['newsletter'] ?? 'no') === 'yes', language: $formData['language'] ?? 'de' ); return SubmitResult::success( message: 'Registrierung erfolgreich!', redirectUrl: '/dashboard', data: ['user_id' => $user->id] ); } catch (\Exception $e) { return SubmitResult::failure( message: 'Registrierung fehlgeschlagen: ' . $e->getMessage() ); } } } ``` ### 4. Controller Setup ```php use App\Framework\Http\Attributes\Route; use App\Framework\Http\Method; use App\Framework\Http\ViewResult; use App\Framework\LiveComponents\FormBuilder\MultiStepFormComponent; use App\Framework\LiveComponents\ValueObjects\ComponentId; final readonly class UserRegistrationController { #[Route('/register', method: Method::GET)] public function showRegistrationForm(): ViewResult { // Form Definition (könnte auch aus Container kommen) $formDefinition = $this->createUserRegistrationForm(); // Component erstellen $component = new MultiStepFormComponent( id: ComponentId::generate('user-registration'), formDefinition: $formDefinition ); return new ViewResult( template: 'pages/register', data: [ 'registration_form' => $component ] ); } private function createUserRegistrationForm(): MultiStepFormDefinition { return new MultiStepFormDefinition( steps: [ // ... (wie oben) ], submitHandler: new UserRegistrationSubmitHandler($this->userService) ); } } ``` ### 5. Template Usage ```html