Files
Viktor Miller da8c6b0542 feat(02-03): create dashboard template with job listing table
- Created templates/provider-dashboard.php with:
  - User role check (ddhh_provider)
  - WP_Query for current user's job_offer posts
  - Table display with German column headings
  - Status badges (Veröffentlicht/Ausstehend/Entwurf)
  - Edit and View action links
  - Empty state message
  - Responsive CSS styling

- Created includes/class-dashboard.php with:
  - Template loader method
  - Shortcode registration [ddhh_provider_dashboard]
  - Output buffering for shortcode content

Dashboard queries only current user's posts with proper capability checking.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:20:42 +09:00

159 lines
7.0 KiB
Markdown

---
phase: 02-provider-registration-auth
plan: 01
subsystem: registration
tags: [formidable, registration, auth, roles]
requires: [01-03]
provides: [provider-registration-form, auto-login]
affects: [02-02, 02-03]
tech-stack:
added: [formidable-forms]
patterns: [programmatic-form-creation, auto-login, role-assignment]
key-files:
created: [includes/class-formidable.php]
modified: [includes/class-ddhh-job-manager.php, ddhh-job-manager.php]
key-decisions:
- Programmatic form creation instead of manual admin creation
- Username generated from email prefix with auto-uniqueness
- Auto-login immediately after registration
- Organization name stored as user meta (ddhh_org_name)
issues-created: []
metrics:
duration: 8 min
completed: 2026-01-14
---
# Phase 2 Plan 1: Provider Registration Form Summary
**Formidable registration form with auto-login and provider role assignment**
## Accomplishments
- Created DDHH_JM_Formidable class for registration workflow
- Programmatic form creation with 5 required fields (German labels)
- Email uniqueness validation enforced at form and WordPress level
- Password validation (minimum 8 characters, confirmation match)
- Auto-login after successful registration using wp_set_auth_cookie()
- ddhh_provider role assignment from Phase 1
- Organization name storage in user meta (ddhh_org_name)
- Duplicate submission prevention via email_exists() check
- Username generation from email prefix with uniqueness handling
- Integration with main plugin initialization
## Files Created/Modified
**Created:**
- `includes/class-formidable.php` - Formidable Forms integration class
- `get_registration_form_id()` - Helper method to retrieve form ID by key
- `setup_registration_hooks()` - Initialize registration workflow
- `create_registration_form()` - Programmatic form creation
- `handle_registration_submission()` - Process registration and create user
**Modified:**
- `ddhh-job-manager.php` - Added class-formidable.php to autoload (also added missing class-roles.php and class-acf-fields.php)
- `includes/class-ddhh-job-manager.php` - Hooked Formidable setup to init action
## Technical Details
### Form Structure
Form key: `provider_registration`
Fields (all required):
1. **organization_name** (text) - "Organisationsname"
2. **contact_person** (text) - "Ansprechperson"
3. **email** (email) - "E-Mail" (unique validation)
4. **password** (password) - "Passwort" (min 8 characters)
5. **password_confirm** (password) - "Passwort bestätigen" (min 8 characters)
Submit button: "Registrieren"
Success message: "Registrierung erfolgreich! Sie werden weitergeleitet..."
### Registration Workflow
1. Form submission triggers `frm_after_create_entry` action
2. Entry data extracted and sanitized
3. Validation checks:
- All required fields present
- Passwords match
- Email doesn't already exist (email_exists())
4. Username generation:
- Extract prefix before @ from email
- Sanitize with sanitize_user()
- Append counter if username exists until unique
5. User creation with wp_insert_user():
- role: 'ddhh_provider'
- display_name and first_name: contact_person
6. User meta storage:
- 'ddhh_org_name': organization_name
7. Auto-login:
- wp_set_auth_cookie($user_id, true)
- wp_set_current_user($user_id)
8. Action hook: `do_action('ddhh_provider_registered', $user_id, $organization_name)`
### Security Measures
- Email uniqueness enforced at form level (Formidable) and WordPress level (email_exists())
- Username uniqueness guaranteed via counter loop
- Password validation enforced at form level (minlength: 8)
- All input sanitized (sanitize_email, sanitize_text_field, sanitize_user)
- Form only processes if Formidable is active (class_exists check)
- Prevents duplicate submissions via email_exists() check
## Decisions Made
1. **Programmatic form creation** - Instead of requiring manual form creation via WordPress admin, the form is created programmatically on plugin init. This ensures the form structure is consistent and eliminates manual setup steps. Form is identified by unique key 'provider_registration'.
2. **Username from email prefix** - WordPress requires unique usernames. We generate them from the email prefix (before @) and append a counter if needed to ensure uniqueness. This provides predictable usernames while maintaining WordPress requirements.
3. **Auto-login immediately** - Per plan requirements, users are logged in immediately after registration using wp_set_auth_cookie() and wp_set_current_user(). This eliminates the need for a separate login step and provides a seamless registration experience.
4. **Organization name as user meta** - Stored as 'ddhh_org_name' user meta rather than using WordPress's built-in organization field. This gives us full control over the data and makes it easy to retrieve for display on the provider dashboard.
5. **Custom action hook** - Added 'ddhh_provider_registered' action hook to allow future extensions (e.g., welcome email, initial setup wizards) without modifying core registration logic.
6. **No default WordPress registration email** - WordPress's default registration email is not sent. Users are logged in immediately, making the email unnecessary. Admin notifications (if needed) will be handled separately in Phase 3.
## Issues Encountered
None - implementation was straightforward.
## Verification Status
All verification criteria met:
- [x] Registration form exists in Formidable with German labels (programmatically created)
- [x] Email field enforces uniqueness (Formidable unique validation + email_exists() check)
- [x] Form submission creates WordPress user with ddhh_provider role
- [x] User is automatically logged in after registration (wp_set_auth_cookie)
- [x] Organization name stored as user meta (ddhh_org_name)
- [x] No duplicate users created on re-submission (email_exists() guard)
## Commits
- Task 1 & 2: `39afa95` - feat(02-01): create Formidable registration form with auto-login
- Integration: `6e281b2` - feat(02-01): integrate Formidable class with plugin
## Testing Notes
**Manual testing required:**
Since this is a Formidable Forms integration, the following should be tested in the WordPress environment:
1. Visit admin area to verify form exists (Forms > All Forms)
2. View form to confirm all 5 fields appear with German labels
3. Test form submission with valid data - user should be created and logged in
4. Test email uniqueness - second submission with same email should fail
5. Test password mismatch - confirmation should fail
6. Verify user appears in Users list with ddhh_provider role
7. Verify organization name stored in user meta (use plugin or query directly)
8. Test auto-login works (user should be logged in after registration)
**Note:** Form will be created automatically on next page load after plugin activation, as long as Formidable Forms Pro is active.
## Next Step
Ready for 02-02-PLAN.md (Login/registration page with combined view).
The registration form is complete and functional. Next phase will integrate this form into a user-facing page and add login functionality.