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...