Milk Admin
Expressions in FormBuilder
The FormBuilder exposes fluent methods to connect expressions to form fields. These expressions are executed
in real-time by the frontend through milk-form.js and expression-parser.js.
Main Methods
| Method | Effect | HTML Attribute |
|---|---|---|
calcExpr($expression) |
Calculates the field value | data-milk-expr |
defaultExpr($expression) |
Sets a soft default (frontend only) value | data-milk-default-expr |
validateExpr($expression, $message) |
Validates the field with a boolean expression | data-milk-validate-expr + data-milk-message |
requireIf($expression, $message) |
Field required only if condition is true | data-milk-required-if + data-milk-message |
showIf($field, $expression) |
Shows/hides a field or container | data-milk-show |
Quick Example
$form->field('total')->calcExpr('[qty] * [price]');
$form->field('end_time')->defaultExpr('TIMEADD([start_time], 45)');
$form->field('end_date')
->validateExpr('[start_date] <= [end_date]', 'End date must be later');
$form->field('notes')->requireIf('[qty] > 10', 'Notes required for quantity > 10');
$form->showIf('notes', '[qty] > 10');
defaultExpr (soft default)
defaultExpr() runs only on the frontend (JS). It sets a default value from an expression while keeping the field editable.
- Applied when the field is empty or was previously auto-filled by the same default expression.
- If the user edits the field manually, the default will not overwrite it on recalculation.
- Existing values (for example in edit forms) are preserved unless they were auto-filled.
$form->field('end_time')->defaultExpr('TIMEADD([start_time], 45)');
<input name="data[end_time]" type="time"
data-milk-default-expr="TIMEADD([start_time], 45)" />
HTML Attributes (custom form)
If you build a form manually, you can use the data-milk-* attributes directly:
<input name="data[qty]" type="number" />
<input name="data[price]" type="number" />
<input name="data[total]" type="number"
data-milk-expr="[qty] * [price]" />
<input name="data[end_time]" type="time"
data-milk-default-expr="TIMEADD([start_time], 45)" />
<input name="data[notes]" type="text"
data-milk-required-if="[qty] > 10"
data-milk-message="Notes required for quantity > 10" />
Automatic mapping from Model rules
If you define expressions in the Model (e.g. calcExpr(), validateExpr(), requireIf()),
the FormBuilder automatically maps them to data-milk-* when generating the form.
You can still override them in the FormBuilder if needed.
Learn more:
Loading...