📝 Profile Fields System

Dynamic custom field management for user profiles

System Overview

The Profile Fields System is a powerful and flexible component of ProfileHub that allows administrators to create, manage, and organize custom profile fields. This system enables dynamic form generation, data validation, and seamless integration with the user interface.

With support for multiple field types, grouping, conditional logic, and hierarchical organization, the Profile Fields System adapts to any data collection requirement while maintaining a clean and user-friendly interface.

Core Concepts

System Architecture

The Profile Fields System is built on four main database entities:

Entity Purpose Key Fields
user_field Field definitions and metadata field_id, translation, type_field, group_id, sequence
user_field_groups Field organization and grouping group_id, group_name, group_icon, group_sequence
user_field_details User-specific field data details_id, user_id, field_id, user_entry
user_field_son Field options and sub-elements son_id, field_id, son_name, son_value

Supported Field Types

T Text Field

Use Case: Single-line text input for names, titles, or short descriptions.

<input type="text" name="field_name" class="form-control" maxlength="255">

📝 Textarea

Use Case: Multi-line text for biographies, descriptions, or detailed information.

<textarea name="field_name" class="form-control" rows="4"></textarea>

📋 Select Dropdown

Use Case: Single selection from predefined options like categories or status.

<select name="field_name" class="form-control"> <option value="option1">Option 1</option> <option value="option2">Option 2</option> </select>

Radio Buttons

Use Case: Single choice selection like gender, yes/no questions, or ratings.

<input type="radio" name="field_name" value="option1"> Option 1 <input type="radio" name="field_name" value="option2"> Option 2

☑️ Checkboxes

Use Case: Multiple selections for interests, skills, or permissions.

<input type="checkbox" name="field_name[]" value="option1"> Option 1 <input type="checkbox" name="field_name[]" value="option2"> Option 2

📅 Date Picker

Use Case: Date selections for birthdays, anniversaries, or deadlines.

<input type="date" name="field_name" class="form-control">

📎 File Upload

Use Case: Document uploads, profile pictures, or certificate files.

<input type="file" name="field_name" class="form-control" accept=".pdf,.jpg,.png">

# Number Field

Use Case: Numeric inputs for ages, quantities, or ratings.

<input type="number" name="field_name" class="form-control" min="0" max="100">

@ Email Field

Use Case: Email validation for contact information or notifications.

<input type="email" name="field_name" class="form-control">

🔗 URL Field

Use Case: Website links, social media profiles, or portfolio URLs.

<input type="url" name="field_name" class="form-control">

📊 Table Field

Use Case: Structured data entry with rows and columns for complex information.

<table class="dynamic-table"> <thead>...</thead> <tbody>...</tbody> </table>

🖼️ HTML Content

Use Case: Rich text editing with WYSIWYG editor for formatted content.

<div class="tinymce-editor"> <textarea name="field_name"></textarea> </div>

Field Groups & Organization

🗂️ Field Groups Purpose:

Field groups provide logical organization for related fields, improving user experience by grouping similar information together. Each group can have its own icon, description, and display sequence.

Example Field Group Structure

// Personal Information Group { "group_id": 1, "group_name": "Personal Information", "group_icon": "fa-user", "group_sequence": 1, "fields": [ { "field_id": 1, "translation": "First Name", "type_field": "text", "sequence": 1 }, { "field_id": 2, "translation": "Last Name", "type_field": "text", "sequence": 2 } ] }
Group Property Description Example
group_nameDisplay name for the group"Personal Information"
group_iconFontAwesome icon class"fa-user", "fa-building"
group_sequenceDisplay order on forms1, 2, 3...
group_descriptionHelp text for the group"Basic user information"

Field Creation Workflow

Creating Custom Fields

Define Field Group

Create or select a field group to organize related fields together.

$group = UserFieldGroups::create([ 'group_name' => 'Contact Information', 'group_icon' => 'fa-envelope', 'group_sequence' => 2 ]);

Create Field Definition

Define the field with its type, validation rules, and display properties.

$field = UserField::create([ 'translation' => 'Phone Number', 'type_field' => 'text', 'group_id' => $group->group_id, 'sequence' => 1, 'required' => true, 'max_length' => 20 ]);

Add Field Options (if needed)

For select, radio, or checkbox fields, create the available options.

UserFieldSon::create([ 'field_id' => $field->field_id, 'son_name' => 'Mobile', 'son_value' => 'mobile' ]); UserFieldSon::create([ 'field_id' => $field->field_id, 'son_name' => 'Home', 'son_value' => 'home' ]);

Form Integration

The field automatically appears in user profile forms based on group sequence.

@foreach($user_fields as $field) @include('profilehub.components.field-renderer', [ 'field' => $field, 'value' => $user_data[$field->field_id] ?? '' ]) @endforeach

Data Storage & Retrieval

Field Data Storage

User-entered field data is stored in the user_field_details table with flexible JSON support for complex data types.

Column Type Purpose
details_idPrimary KeyUnique record identifier
user_idForeign KeyLinks to users table
field_idForeign KeyLinks to user_field table
user_entryTEXTStores the actual field value
entry_jsonJSONComplex data structures

Data Retrieval Examples

// Get all field data for a user $userData = UserFieldDetails::where('user_id', $userId) ->with('field', 'field.group') ->get(); // Get specific field value $phoneNumber = UserFieldDetails::where([ 'user_id' => $userId, 'field_id' => $phoneFieldId ])->first()->user_entry; // Get grouped field data $groupedData = UserFieldDetails::join('user_field', 'user_field_details.field_id', '=', 'user_field.field_id') ->join('user_field_groups', 'user_field.group_id', '=', 'user_field_groups.group_id') ->where('user_field_details.user_id', $userId) ->orderBy('user_field_groups.group_sequence') ->orderBy('user_field.sequence') ->get();

Field Validation & Rules

✅ Built-in Validation Features

Validation Implementation

// Server-side validation public function validateFieldData(Request $request, $fieldId) { $field = UserField::find($fieldId); $rules = []; switch ($field->type_field) { case 'email': $rules['field_' . $fieldId] = 'required|email|max:255'; break; case 'number': $rules['field_' . $fieldId] = 'required|numeric|min:0'; break; case 'file': $rules['field_' . $fieldId] = 'required|file|mimes:pdf,jpg,png|max:2048'; break; case 'text': $rules['field_' . $fieldId] = 'required|string|max:' . ($field->max_length ?? 255); break; } return $request->validate($rules); }

Administrative Interface

[Field Management Interface Screenshot]
Shows the admin interface for creating and managing custom fields with drag-and-drop ordering

Field Management Features

Feature Description Access Level
Create FieldsAdd new custom fields with various typesAdmin
Edit FieldsModify existing field propertiesAdmin
Reorder FieldsChange field display sequenceAdmin
Group ManagementCreate and organize field groupsAdmin
Field PreviewPreview how fields appear to usersAdmin
Bulk OperationsDelete or modify multiple fieldsSuper Admin

Field Management Routes

// Field management routes Route::prefix('admin/users/profile')->group(function () { Route::get('/fields', 'AdminUserDetailsController@index'); Route::get('/field', 'AdminUserDetailsController@userfield'); Route::post('/field/create', 'AdminUserDetailsController@createField'); Route::put('/field/{id}', 'AdminUserDetailsController@updateField'); Route::delete('/field/{id}', 'AdminUserDetailsController@deleteField'); Route::get('/groups', 'AdminUserDetailsController@groups'); Route::post('/groups/create', 'AdminUserDetailsController@createGroup'); Route::put('/groups/{id}', 'AdminUserDetailsController@updateGroup'); });

Best Practices

⚠️ Important Considerations

✅ Recommended Practices