DTO used to transfer data to the form and get data from it.


DTO must extend \XLite\Model\DTO\Base\ADTO class

You must define at least two methods:

  • init - to get data from given object and store it to DTO. Data must be stored at DTO class properties by section name as \XLite\Model\DTO\Base\CommonCell. CommonCell is object access to key -> value pairs represented form model fields for each section, If horizontal field used its value in DTO must be also CommonCell.

    protected function init($object)
        $this->default = new CommonCell([
            'identity' => $object->getProductId(),
            'generate_sku'     => !(boolean) $object->getProductId(),
            'sku'              => $object->getSku(),
            'name'             => $object->getName(),
            'price'            => $object->getPrice(),
            'full_description' => $object->getDescription(),
        $this->price = new CommonCell([
            'price'              => $object->getPrice(),
            'inventory_tracking' => new CommonCell([
                'inventory_tracking' => $object->getInventoryEnabled(),
                'quantity'           => $object->getAmount(),
  • populateTo - to transfer data from DTO to given object.


You can define DTO level backend validation to check the entire DTO. To do this you can define \XLite\Model\DTO\Base\ADTO::validate() static method:

 + @param Info                      $dto
 + @param ExecutionContextInterface $context
public static function validate($dto, ExecutionContextInterface $context)
    if (!empty($dto->default->sku) && !static::isSKUValid($dto)) {
        static::addViolation($context, 'default.sku', Translation::lbl('SKU must be unique'));

If there is invalid state you mast call \XLite\Model\DTO\Base\ADTO::addViolation() method with 3 params:

  • $context - the second param of validate method.
  • $field - full field name in dot notation ([section].[field] or [section].[field].[subfield]).
  • $message - message described the error.