public function save($data)
{
$vpid = $data[$this->entityInfo->vpidColumnName];
if (!$vpid) {
return null;
}
if ($this->entityInfo->usesGeneratedVpids) {
// to avoid merge conflicts
unset($data[$this->entityInfo->idColumnName]);
}
$data = $this->removeUnwantedColumns($data);
if (!$this->shouldBeSaved($data)) {
return null;
}
$filename = $this->getEntityFilename($vpid);
$oldSerializedEntity = "";
$isExistingEntity = $this->exists($vpid);
if ($isExistingEntity) {
$oldSerializedEntity = file_get_contents($filename);
}
$oldEntity = $this->deserializeEntity($oldSerializedEntity);
$diff = EntityUtils::getDiff($oldEntity, $data);
if (count($diff) > 0) {
$newEntity = array_merge($oldEntity, $diff);
$newEntity = array_filter($newEntity, function ($value) {
return $value !== false;
});
FileSystem::mkdir(dirname($this->getEntityFilename($vpid)));
file_put_contents($filename, $this->serializeEntity($vpid, $newEntity));
return $this->createChangeInfo($oldEntity, $newEntity, !$isExistingEntity ? 'create' : 'edit');
} else {
return null;
}
}