public function _typecastSaveField(Field $f, $value)
{
// work only on copied value not real one !!!
$v = is_object($value) ? clone $value : $value;
switch ($f->type) {
case 'boolean':
// if enum is not set, then simply cast value to integer
if (!isset($f->enum) || !$f->enum) {
$v = (int) $v;
break;
}
// if enum is set, first lets see if it matches one of those precisely
if ($v === $f->enum[1]) {
$v = true;
} elseif ($v === $f->enum[0]) {
$v = false;
}
// finally, convert into appropriate value
$v = $v ? $f->enum[1] : $f->enum[0];
break;
case 'date':
case 'datetime':
case 'time':
$dt_class = isset($f->dateTimeClass) ? $f->dateTimeClass : 'DateTime';
$tz_class = isset($f->dateTimeZoneClass) ? $f->dateTimeZoneClass : 'DateTimeZone';
if ($v instanceof $dt_class) {
$format = ['date' => 'Y-m-d', 'datetime' => 'Y-m-d H:i:s', 'time' => 'H:i:s'];
$format = $f->persist_format ?: $format[$f->type];
// datetime only - set to persisting timezone
if ($f->type == 'datetime' && isset($f->persist_timezone)) {
$v->setTimezone(new $tz_class($f->persist_timezone));
}
$v = $v->format($format);
}
break;
case 'array':
case 'object':
// don't encode if we already use some kind of serialization
$v = $f->serialize ? $v : json_encode($v);
break;
}
return $v;
}