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.

Loading...