Milk Admin
FormBuilder - Data Loading and Management
How to control data loading and management in forms.
Automatic Mode (Default)
$form = \Builders\FormBuilder::create($model)->getForm();
Automatically loads data if $_REQUEST['id'] is present.
Custom ID Parameter
If you need to use a different request parameter instead of id:
$form = \Builders\FormBuilder::create($model)
->setIdRequest('my_id')
->getForm();
This will load data from $_REQUEST['my_id'] instead of $_REQUEST['id'].
Custom Data Loading
For full control over data loading, use setData():
$modelData = $this->model->getByIdForEdit(_absint($_REQUEST['id'] ?? 0));
$form = \Builders\FormBuilder::create($model)
->setData($modelData)
->getForm();
Modifying Data Before Display
$modelData = $this->model->getByIdForEdit(_absint($_REQUEST['id'] ?? 0));
$modelData->title = "Foo!";
$form = \Builders\FormBuilder::create($model)
->setData($modelData)
->getForm();
Creating Data From Scratch
$modelData = $this->model->getEmpty();
$modelData->title = "Foo!";
$form = \Builders\FormBuilder::create($model)
->setData($modelData)
->getForm();
Form Data Handling
All form data is received in $_POST['data']:
$id = _absint($_POST['data']['id'] ?? $_REQUEST['id'] ?? 0);
Preserving User Input on Errors
When validation fails, you want to show the user's modified data, not the original database values:
$id = _absint($_POST['data']['id'] ?? $_REQUEST['id'] ?? 0);
$modelData = $this->model->getByIdForEdit($id, ($_POST['data'] ?? []));
$form = \Builders\FormBuilder::create($model)
->setData($modelData)
->getForm();
The second parameter ($_POST['data'] ?? []) merges POST data over the loaded data, preserving user changes when the form is re-displayed after an error.
When to Use Custom Data Loading
- Pre-populating fields with custom default values
- Loading data from sources other than
$_REQUEST['id'] - Modifying data before display
- Complex validation scenarios requiring data persistence
- Multi-step forms
- Using a different request parameter name
Complete Example
// Load data with POST override for error handling
$id = _absint($_POST['data']['id'] ?? $_REQUEST['id'] ?? 0);
$modelData = $this->model->getByIdForEdit($id, ($_POST['data'] ?? []));
// Modify data if needed
if (!$id) {
$modelData->created_by = get_current_user_id();
$modelData->status = 'draft';
}
// Create form with custom data loading
$form = \Builders\FormBuilder::create($model)
->setData($modelData)
->addStandardActions(true, '?page=posts')
->getForm();
Summary of Data Loading Methods
| Method | Use Case |
|---|---|
| Automatic (default) | When $_REQUEST['id'] contains the record ID |
setIdRequest('my_id') |
When using a different request parameter name |
setData($modelData) |
When you need full control over data loading and manipulation |
Note: The automatic mode is suitable for most cases. Use setIdRequest() or setData() only when you need specific control over data loading or manipulation.
Loading...