public function mapData($defaultData = [], $filterFields = null)
{
$data = $this->getData();
if ($filterFields) {
$filterFields = array_flip($filterFields);
}
$values = [];
foreach ($this->getFields() as $field) {
$key = lcfirst($field->getId());
if (isset($data[$key])) {
$value = $data[$key];
} else {
$value = Tools::getArrayPath($data, $key);
}
if (null === $value && $defaultData) {
$value = isset($defaultData[$key]) ? $defaultData[$key] : null;
}
if (null === $value && $field->getDefault()) {
$value = $field->getDefault();
}
if ($field['customValue'] && method_exists($this, $method = $field['customValue'])) {
$value = $this->{$method}($field, $key);
}
$field->setValue($value);
}
foreach ($this->getFields() as $field) {
$key = $field->getId();
if ($field['noSave']) {
continue;
}
if ($field->getSaveOnlyFilled() && ($field->getValue() === '' || $field->getValue() === null)) {
continue;
}
if ($field->getCustomSave() && method_exists($this, $method = $field->getCustomSave())) {
$this->{$method}($values, $values, $field);
continue;
}
$startKey = explode('.', $key)[0];
if (!$filterFields || isset($filterFields[$startKey])) {
if (!($errors = $field->validate())) {
$field->mapValues($values);
} else {
$restException = new ValidationFailedException(sprintf('Field `%s` has a invalid value. [%s]', $key, json_encode($errors)), 420);
$restException->setData(['fields' => [$field->getId() => $errors]]);
throw $restException;
}
}
}
return $values;
}