# Feedback_Field Class
**[→ Class Reference](feedback-field-class.md)** | **[← Back to Index](README.md)**
The `Feedback_Field` class represents an individual form field submission. It stores the field's label, value, type, and metadata, and handles context-specific rendering for different output formats.
## Overview
A `Feedback_Field` represents the submitted data for a single form field. The class handles:
- Storing field label, value, and type
- Rendering values differently based on context (email, CSV, web, API)
- Special handling for complex field types (files, image-select)
- Serialization for storage and retrieval
## Properties
- **key** - Unique field identifier (e.g., "1_Email")
- **label** - Display label (e.g., "Email Address")
- **value** - Submitted value (string, array, or structured data)
- **type** - Field type (text, email, file, consent, etc.)
- **meta** - Additional metadata (e.g., `['render' => false]`)
- **form_field_id** - Original form field ID from form schema
## Creating Fields
### Basic Constructor
```php
$field = new Feedback_Field(
'1_Name', // key
'Full Name', // label
'John Doe', // value
'name', // type
[], // meta (optional)
'contact-name' // form_field_id (optional)
);
```
### From Serialized Data
```php
$data = [
'key' => '1_Email',
'label' => 'Email',
'value' => 'john@example.com',
'type' => 'email',
'meta' => [],
'form_field_id' => 'contact-email',
];
$field = Feedback_Field::from_serialized( $data );
```
### From V2 Format (Legacy)
```php
$field = Feedback_Field::from_serialized_v2( $data );
```
Handles Unicode normalization for legacy data with escaped characters.
## Getting Field Information
### Basic Getters
```php
$key = $field->get_key(); // '1_Name'
$label = $field->get_label(); // 'Full Name'
$value = $field->get_value(); // Raw value
$type = $field->get_type(); // 'name'
$form_field_id = $field->get_form_field_id(); // 'contact-name'
```
### Label with Context
```php
// Default label
echo $field->get_label(); // "Email"
// With count suffix (for duplicate labels)
echo $field->get_label( 'default', 1 ); // "Email"
echo $field->get_label( 'default', 2 ); // "Email (2)"
// API/CSV context (adds "Field" prefix if empty)
$empty_label_field = new Feedback_Field( '1_', '', 'value', 'text' );
echo $empty_label_field->get_label( 'csv' ); // "Field"
```
### Metadata
```php
$meta = $field->get_meta(); // All metadata
$render = $field->get_meta_key_value( 'render' ); // Specific key
// Check if field should be compiled
if ( $field->compile_field() ) {
// Field has render => false
}
```
## Rendering Values
### Context-Specific Rendering
The `get_render_value()` method renders values differently based on context:
```php
// Default rendering
echo $field->get_render_value();
// Email rendering (formatted for plain text emails)
echo $field->get_render_value( 'email' );
// CSV rendering (flattened for export)
echo $field->get_render_value( 'csv' );
// Web rendering (for post-submission page)
echo $field->get_render_value( 'web' );
// API rendering (includes file URLs, structured data)
$api_value = $field->get_render_value( 'api' );
// Submission format (structured data for processing)
$submit_data = $field->get_render_value( 'submit' );
```
### Available Contexts
| Context | Description | Use Case |
|---------|-------------|----------|
| `default` | Standard text rendering | General display |
| `web` | Same as default | Post-submission page |
| `ajax` | Same as web | AJAX responses |
| `email` | Plain text format | Email notifications |
| `csv` | Comma-separated format | CSV exports |
| `api` | Structured with URLs | REST API responses |
| `submit` | Structured for processing | Form submission handling |
## Field Types
### Text Fields
Simple string values:
```php
$field = new Feedback_Field( '1_Name', 'Name', 'John Doe', 'text' );
echo $field->get_render_value(); // "John Doe"
```
### Array Fields (Checkbox Multiple)
```php
$field = new Feedback_Field(
'1_Colors',
'Favorite Colors',
['Red', 'Blue', 'Green'],
'checkbox-multiple'
);
echo $field->get_render_value(); // "Red, Blue, Green"
```
### File Fields
File uploads have structured values:
```php
$value = [
'files' => [
[
'file_id' => 12345,
'name' => 'document.pdf',
'size' => 1024000,
'type' => 'application/pdf'
],
[
'file_id' => 12346,
'name' => 'image.jpg',
'size' => 512000,
'type' => 'image/jpeg'
]
]
];
$field = new Feedback_Field( '1_Upload', 'Document', $value, 'file' );
// Default rendering
echo $field->get_render_value(); // "document.pdf (1 MB), image.jpg (500 KB)"
// Check for files
if ( $field->has_file() ) {
// Handle files
}
// API rendering (includes URLs)
$api_value = $field->get_render_value( 'api' );
// [
// 'files' => [
// [
// 'file_id' => 12345,
// 'name' => 'document.pdf',
// 'size' => '1 MB',
// 'url' => 'https://...',
// 'is_previewable' => false
// ]
// ]
// ]
// Submission format
$submit_value = $field->get_render_value( 'submit' );
// [
// 'field_id' => 'contact-upload',
// 'files' => [...]
// ]
```
### Image Select Fields
Image selection with structured choice data:
```php
$value = [
'type' => 'image-select',
'choices' => [
[
'perceived' => 'A',
'selected' => 'B', // Actual selected value
'label' => 'Option B',
'showLabels' => true,
'image' => [
'id' => 123,
'src' => 'https://example.com/image.jpg'
]
]
]
];
$field = new Feedback_Field( '1_Choice', 'Pick One', $value, 'image-select' );
// Email rendering (shows selected values with labels)
echo $field->get_render_value( 'email' ); // "B - Option B"
// CSV rendering
echo $field->get_render_value( 'csv' ); // "B - Option B"
// Web/API rendering (returns structured array)
$web_value = $field->get_render_value( 'web' ); // Full structured array
```
**Note:** The `perceived` value is the letter shown to the user (can be shuffled), while `selected` is the actual option identifier.
### Consent Fields
```php
$field = new Feedback_Field( '1_Consent', 'Email consent', 'Yes', 'consent' );
echo $field->get_render_value(); // "Yes"
if ( $field->is_of_type( 'consent' ) ) {
// Handle consent
}
```
## Type Checking
```php
if ( $field->is_of_type( 'email' ) ) {
// Validate email format
}
if ( $field->is_of_type( 'file' ) ) {
// Handle file upload
}
if ( $field->has_file() ) {
// Field has files attached
}
```
## Serialization
### Serialize for Storage
```php
$data = $field->serialize();
```
Returns:
```php
[
'key' => '1_Email',
'label' => 'Email Address',
'value' => 'john@example.com',
'type' => 'email',
'meta' => [],
'form_field_id' => 'contact-email',
]
```
### Deserialize from Storage
```php
$field = Feedback_Field::from_serialized( $data );
```
Returns `null` if data is invalid (missing required keys).
## Common Field Types
| Type | Description | Example Value |
|------|-------------|---------------|
| `text` | Plain text input | `"Hello"` |
| `name` | Name field | `"John Doe"` |
| `email` | Email address | `"john@example.com"` |
| `url` | Website URL | `"https://example.com"` |
| `textarea` | Multi-line text | `"Long message..."` |
| `select` | Dropdown selection | `"Option A"` |
| `radio` | Radio button | `"Choice 1"` |
| `checkbox` | Single checkbox | `"Yes"` |
| `checkbox-multiple` | Multiple checkboxes | `["A", "B", "C"]` |
| `file` | File upload | `['files' => [...]]` |
| `image-select` | Image selection | `['type' => '...', 'choices' => [...]]` |
| `consent` | Consent checkbox | `"Yes"` or `""` |
| `hidden` | Hidden field | `"hidden_value"` |
| `subject` | Email subject | `"Contact Request"` |
| `ip` | IP address | `"192.168.1.1"` |
| `basic` | Generic field | Any value |
## Complete Examples
### Email Notification
```php
$fields = $feedback->get_fields();
$email_body = '';
foreach ( $fields as $field ) {
if ( $field->compile_field() ) {
continue; // Skip non-rendered fields
}
$label = $field->get_label( 'email' );
$value = $field->get_render_value( 'email' );
$email_body .= "{$label}: {$value}\n";
}
wp_mail( $to, $subject, $email_body );
```
### CSV Export
```php
$csv_rows = [];
$labels = [];
$values = [];
foreach ( $feedback->get_fields() as $field ) {
$labels[] = $field->get_label( 'csv' );
$values[] = $field->get_render_value( 'csv' );
}
$csv_rows[] = $labels;
$csv_rows[] = $values;
// Write to CSV file...
```
### API Response
```php
$response = [
'id' => $feedback->get_feedback_id(),
'author' => $feedback->get_author(),
'fields' => [],
];
foreach ( $feedback->get_fields() as $field ) {
$response['fields'][] = [
'label' => $field->get_label( 'api' ),
'value' => $field->get_render_value( 'api' ),
'type' => $field->get_type(),
];
}
wp_send_json( $response );
```
### File Download Links
```php
foreach ( $feedback->get_fields() as $field ) {
if ( ! $field->is_of_type( 'file' ) ) {
continue;
}
$value = $field->get_render_value( 'api' );
foreach ( $value['files'] as $file ) {
echo '';
echo esc_html( $file['name'] ) . ' (' . esc_html( $file['size'] ) . ')';
echo '
';
}
}
```
## Filters
### File Download URL
Customize file download URLs:
```php
add_filter( 'jetpack_unauth_file_download_url', function( $url, $file_id ) {
return home_url( '/download/?file=' . $file_id . '&token=' . generate_token() );
}, 10, 2 );
```
## Testing
See `Feedback_Field_Test.php` for comprehensive examples of:
- Field creation and serialization
- Context-specific rendering
- File and image-select handling
- Type checking
- Legacy format migration