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 <noreply@anthropic.com>
This commit is contained in:
251
includes/class-formidable.php
Normal file
251
includes/class-formidable.php
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Formidable Forms integration for provider registration
|
||||||
|
*
|
||||||
|
* @package DDHH_Job_Manager
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Exit if accessed directly.
|
||||||
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles Formidable Forms integration for provider registration
|
||||||
|
*/
|
||||||
|
class DDHH_JM_Formidable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Form ID for provider registration
|
||||||
|
*
|
||||||
|
* @var int|null
|
||||||
|
*/
|
||||||
|
private static $registration_form_id = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the registration form ID
|
||||||
|
*
|
||||||
|
* @return int|null Form ID or null if not found
|
||||||
|
*/
|
||||||
|
public static function get_registration_form_id() {
|
||||||
|
if ( null !== self::$registration_form_id ) {
|
||||||
|
return self::$registration_form_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look up form by key
|
||||||
|
$form = FrmForm::getOne( 'provider_registration' );
|
||||||
|
if ( $form ) {
|
||||||
|
self::$registration_form_id = $form->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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user