From 39afa95114adad0abce15e75bed91b9f42b546e7 Mon Sep 17 00:00:00 2001 From: Viktor Miller Date: Wed, 14 Jan 2026 19:19:02 +0900 Subject: [PATCH] feat(02-01): create Formidable registration form with auto-login - Created DDHH_JM_Formidable class with registration form setup - Programmatic form creation with 5 German-labeled fields - Email uniqueness validation enforced - Auto-login after successful registration - ddhh_provider role assignment on user creation - Organization name stored as user meta (ddhh_org_name) - Duplicate submission prevention via email_exists() check - Password validation (min 8 chars, confirmation match) - Username generation from email prefix with uniqueness check Co-Authored-By: Claude Sonnet 4.5 --- includes/class-formidable.php | 251 ++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 includes/class-formidable.php diff --git a/includes/class-formidable.php b/includes/class-formidable.php new file mode 100644 index 0000000..508c3af --- /dev/null +++ b/includes/class-formidable.php @@ -0,0 +1,251 @@ +id; + return self::$registration_form_id; + } + + return null; + } + + /** + * Setup registration hooks + */ + public static function setup_registration_hooks() { + // Create form on plugin activation if it doesn't exist + add_action( 'init', array( __CLASS__, 'create_registration_form' ), 11 ); + + // Hook into Formidable form submission + add_action( 'frm_after_create_entry', array( __CLASS__, 'handle_registration_submission' ), 30, 2 ); + } + + /** + * Create the registration form programmatically if it doesn't exist + */ + public static function create_registration_form() { + // Check if Formidable is active + if ( ! class_exists( 'FrmForm' ) ) { + return; + } + + // Check if form already exists + $existing_form = FrmForm::getOne( 'provider_registration' ); + if ( $existing_form ) { + self::$registration_form_id = $existing_form->id; + return; + } + + // Create form + $form_values = array( + 'name' => 'Provider Registration', + 'form_key' => 'provider_registration', + 'description' => 'Anbieter-Registrierung für Digital Dabei Hamburg', + 'status' => 'published', + 'options' => array( + 'submit_value' => 'Registrieren', + 'success_msg' => 'Registrierung erfolgreich! Sie werden weitergeleitet...', + ), + ); + + $form_id = FrmForm::create( $form_values ); + + if ( ! $form_id ) { + return; + } + + self::$registration_form_id = $form_id; + + // Create form fields + $fields = array( + array( + 'name' => 'Organisationsname', + 'field_key' => 'organization_name', + 'type' => 'text', + 'required' => '1', + 'form_id' => $form_id, + 'field_order' => 1, + ), + array( + 'name' => 'Ansprechperson', + 'field_key' => 'contact_person', + 'type' => 'text', + 'required' => '1', + 'form_id' => $form_id, + 'field_order' => 2, + ), + array( + 'name' => 'E-Mail', + 'field_key' => 'email', + 'type' => 'email', + 'required' => '1', + 'form_id' => $form_id, + 'field_order' => 3, + 'field_options' => array( + 'unique' => '1', + ), + ), + array( + 'name' => 'Passwort', + 'field_key' => 'password', + 'type' => 'password', + 'required' => '1', + 'form_id' => $form_id, + 'field_order' => 4, + 'field_options' => array( + 'minlength' => 8, + ), + ), + array( + 'name' => 'Passwort bestätigen', + 'field_key' => 'password_confirm', + 'type' => 'password', + 'required' => '1', + 'form_id' => $form_id, + 'field_order' => 5, + 'field_options' => array( + 'minlength' => 8, + ), + ), + ); + + foreach ( $fields as $field ) { + FrmField::create( $field ); + } + } + + /** + * Handle registration form submission + * + * @param int $entry_id Entry ID. + * @param int $form_id Form ID. + */ + public static function handle_registration_submission( $entry_id, $form_id ) { + // Only process our registration form + if ( $form_id !== self::get_registration_form_id() ) { + return; + } + + // Get entry data + $entry = FrmEntry::getOne( $entry_id, true ); + if ( ! $entry ) { + return; + } + + // Extract field values + $email = ''; + $password = ''; + $password_confirm = ''; + $organization_name = ''; + $contact_person = ''; + + foreach ( $entry->metas as $field_id => $value ) { + $field = FrmField::getOne( $field_id ); + if ( ! $field ) { + continue; + } + + switch ( $field->field_key ) { + case 'email': + $email = sanitize_email( $value ); + break; + case 'password': + $password = $value; + break; + case 'password_confirm': + $password_confirm = $value; + break; + case 'organization_name': + $organization_name = sanitize_text_field( $value ); + break; + case 'contact_person': + $contact_person = sanitize_text_field( $value ); + break; + } + } + + // Validate required fields + if ( empty( $email ) || empty( $password ) || empty( $organization_name ) || empty( $contact_person ) ) { + return; + } + + // Validate passwords match + if ( $password !== $password_confirm ) { + return; + } + + // Check if user already exists + if ( email_exists( $email ) ) { + return; + } + + // Create username from email (part before @) + $username = sanitize_user( strstr( $email, '@', true ) ); + + // Ensure username is unique + $username_base = $username; + $counter = 1; + while ( username_exists( $username ) ) { + $username = $username_base . $counter; + $counter++; + } + + // Create WordPress user + $user_id = wp_insert_user( + array( + 'user_login' => $username, + 'user_email' => $email, + 'user_pass' => $password, + 'role' => 'ddhh_provider', + 'display_name' => $contact_person, + 'first_name' => $contact_person, + ) + ); + + // Check for errors + if ( is_wp_error( $user_id ) ) { + return; + } + + // Store organization name as user meta + update_user_meta( $user_id, 'ddhh_org_name', $organization_name ); + + // Auto-login the user + wp_set_auth_cookie( $user_id, true ); + wp_set_current_user( $user_id ); + + // Optionally redirect (handled by JavaScript or form settings) + do_action( 'ddhh_provider_registered', $user_id, $organization_name ); + } +}