protected function fixValue(Mesour\Editable\Structures\Fields\IStructureField $elementField, $value) { if (is_null($value)) { return null; } if ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::TEXT) { return Strings::trim($value); } elseif ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::ENUM) { /** @var Mesour\Editable\Structures\Fields\EnumField $elementField */ $values = $elementField->getValues(); $isValueAllowed = isset($values[$value]); if ($elementField->isNullable() && !$value && !$isValueAllowed) { return null; } if (!$isValueAllowed) { throw new Mesour\OutOfRangeException(sprintf('Enum value %s does not exist on %s field.', $value, $elementField->getName())); } return $value; } elseif ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::NUMBER) { /** @var Mesour\Editable\Structures\Fields\NumberField $elementField */ if (!$value && !is_numeric($value)) { if (!$elementField->isNullable()) { return 0; } return null; } if (method_exists($elementField, 'getDecimals') && $elementField->getDecimals() === 0 || strpos($value, '.') === -1) { return (int) $value; } return (double) $value; } elseif ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::DATE) { /** @var Mesour\Editable\Structures\Fields\DateField $elementField */ if (!$value && $elementField->isNullable()) { return null; } elseif ($value && !$value instanceof \DateTime) { try { if (is_numeric($value)) { $dateTime = new \DateTime(); $dateTime->setTimestamp($value); return $dateTime; } return new \DateTime($value); } catch (\Exception $e) { $exception = new Mesour\Editable\InvalidDateTimeException('Date is invalid'); $exception->setFieldName($elementField->getName()); throw $exception; } } } elseif ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::ONE_TO_ONE) { /** @var Mesour\Editable\Structures\Fields\OneToOneField $elementField */ if (!$value && $elementField->isNullable()) { return null; } } elseif ($elementField->getType() === Mesour\Sources\Structures\Columns\IColumnStructure::BOOL) { /** @var Mesour\Editable\Structures\Fields\BoolField $elementField */ if (Strings::length($value) === 0 && $elementField->isNullable()) { return null; } return !$value || $value === 'false' ? false : true; } return $value; }
private function addField(Fields\IStructureField $field) { $this->fields[$field->getName()] = $field; }
private static function checkDisabled(IStructureField $field) { if ($field->isDisabled()) { throw new Mesour\InvalidStateException(sprintf('Can not change data for disabled field `%s`.', $field->getName())); } }