public function createSaveBundleFromString($saveBundleString) { $saveBundleArr = json_decode($saveBundleString); $saveBundle = new SaveBundle(); $saveBundle->setEntities($saveBundleArr->entities); return $saveBundle; }
public function saveChangesTemp(SaveBundle $saveBundle) { $entitiesModified = array(); $addedEntities = array(); foreach ($saveBundle->getEntities() as $i => $entityArr) { $entityAspect = $entityArr->entityAspect; unset($entityArr->entityAspect); $exploded = explode(':#', $entityAspect->entityTypeName); $className = strtr($exploded[1] . '\\' . $exploded[0], '.', '\\'); $meta = $this->entityManager->getClassMetadata($className); if (!$meta) { break; // - not continue, but break, because every entity should be valid } $repository = $this->entityManager->getRepository($className); $idProperty = isset($entityAspect->autoGeneratedKey->propertyName) ? $entityAspect->autoGeneratedKey->propertyName : $meta->identifier[0]; $idPropertyRefl = $meta->getReflectionProperty($idProperty); $idPropertyName = $idProperty; $idGetter = 'get' . ucfirst($idPropertyName); $idSetter = 'set' . ucfirst($idPropertyName); $idValue = $entityArr->{$idProperty}; if ($entityAspect->entityState == 'Added') { unset($entityArr->{$idProperty}); $entity = new $className(); } else { if (isset($entityArr->{$idProperty})) { $entity = $repository->find($entityArr->{$idProperty}); } } $associations = array(); if ($entityAspect->entityState == 'Modified' || $entityAspect->entityState == 'Added') { $processedProperties = array(); foreach ($meta->fieldMappings as $propertyName => $fieldMapping) { if (property_exists($entityArr, $propertyName)) { $setter = false; $propertyValue = $entityArr->{$propertyName}; try { $propertyValue = $this->convertToDoctrineValue($propertyValue, $fieldMapping ? $fieldMapping['type'] : 'string'); } catch (\Exception $e) { throw $e; } $this->setObjectValue($entity, $propertyName, $propertyValue, $setter); $processedProperties[] = $propertyName; } } foreach ($meta->associationMappings as $associationName => $associationFieldMapping) { $fkFieldName = $this->getForeignKeyFieldName($associationFieldMapping); if (!$fkFieldName) { $fkFieldName = $associationFieldMapping['fieldName'] . 'Id'; } if (property_exists($entityArr, $fkFieldName)) { $associationSetter = false; //('set' . ucfirst($associationFieldMapping['fieldName'])); $associations[$fkFieldName] = array('targetEntity' => $associationFieldMapping['targetEntity'], 'fieldName' => $associationFieldMapping['fieldName'], 'referencedFieldValue' => $entityArr->{$fkFieldName}, 'setter' => $associationSetter); if ($associationFieldMapping['isOwningSide'] && $associationFieldMapping['inversedBy'] && in_array((int) $associationFieldMapping['type'], array(ClassMetadata::ONE_TO_ONE, ClassMetadata::MANY_TO_ONE))) { $associations[$fkFieldName]['isScalarInverse'] = $associationFieldMapping['type'] === ClassMetadata::ONE_TO_ONE; $associations[$fkFieldName]['inversedBy'] = $associationFieldMapping['inversedBy']; } $processedProperties[] = $fkFieldName; } } foreach ($entityArr as $propertyName => $propertyValue) { if (in_array($propertyName, $processedProperties)) { continue; } $propertyType = $this->getPropertyType($meta, $propertyName); if ($propertyType === self::PROPERTY_TYPE_NONE) { continue; } $setter = false; //('set' . ucfirst($propertyName)); $propertyValue = $entityArr->{$propertyName}; $this->setObjectValue($entity, $propertyName, $propertyValue, $setter); } } else { if ($entityAspect->entityState == 'Deleted') { } else { // continue; // DONT continue for unchanged. Causes trouble on the client } } $entityModified = array('entity' => $entity, 'state' => $entityAspect->entityState, 'entityTypeName' => strtr($className, '\\', '.'), 'idGetter' => $idGetter, 'idSetter' => $idSetter, 'idValue' => $idValue ? $idValue : 0, 'associations' => isset($associations) && !empty($associations) ? $associations : false, 'persisted' => false, 'deleted' => false, 'validationErrors' => false); $entitiesModified[$this->getEntityClass($entityModified['entity']) . '_' . $entityModified['idValue']] = $entityModified; } $keyMappings = array(); $entities = array(); $validationErrors = false; if (!empty($entitiesModified)) { foreach ($entitiesModified as $key => $entityModified) { if ($entityModified['associations'] && !empty($entityModified['associations'])) { // exit; foreach ($entityModified['associations'] as $associationData) { $association = false; if (isset($entitiesModified[$associationData['targetEntity'] . '_' . $associationData['referencedFieldValue']])) { $association = $entitiesModified[$associationData['targetEntity'] . '_' . $associationData['referencedFieldValue']]['entity']; } else { if ($associationData['referencedFieldValue']) { $association = $this->entityManager->getReference($associationData['targetEntity'], $associationData['referencedFieldValue']); } else { if (array_key_exists('referencedFieldValue', $associationData)) { $association = null; } } } if ($association) { $this->setObjectValue($entityModified['entity'], $associationData['fieldName'], $association, $associationData['setter']); if (isset($associationData['inversedBy'])) { if ($associationData['isScalarInverse']) { $this->setObjectValue($association, $associationData['inversedBy'], $entityModified['entity']); } else { $inverseCollectionGetter = 'get' . $associationData['inversedBy']; if (method_exists($association, $inverseCollectionGetter)) { $inverseCollection = $association->{$inverseCollectionGetter}(); if (is_object($inverseCollection) && method_exists($inverseCollection, 'add')) { if ($entityModified['state'] == 'Added' && !$inverseCollection->contains($entityModified['entity'])) { $inverseCollection->add($entityModified['entity']); } } } } } } } } $entitiesModified[$key] = $entityModified; } foreach ($entitiesModified as $key => $entityModified) { if ($entityModified['state'] == 'Added' || $entityModified['state'] == 'Modified') { $errors = $this->validateEntity($entityModified['entity']); if ($errors && count($errors) > 0) { if (!is_array($validationErrors)) { $validationErrors = array(); } $validationErrors = array_merge($validationErrors, $this->formatErrors($errors, $entityModified['entity'], $entityModified['idValue'])); } if ($entityModified['entity']) { $this->entityManager->persist($entityModified['entity']); $entityModified['persisted'] = true; } } else { if ($entityModified['state'] == 'Deleted') { if ($entityModified['entity']) { $entityCopy = clone $entityModified['entity']; $this->entityManager->remove($entityModified['entity']); $entityModified['entity'] = $entityCopy; $entityModified['deleted'] = true; } } } } if ($validationErrors) { $this->entityManager->clear(); return array('Errors' => $validationErrors); } $this->entityManager->flush(); foreach ($entitiesModified as $entityModified) { if ($this->isProxyObject($entityModified['entity'])) { if (!$entityModified['entity']->__isInitialized()) { $entityModified['entity']->__load(); } } if ($entityModified['state'] == 'Added' && $entityModified['idValue'] && method_exists($entityModified['entity'], $entityModified['idGetter'])) { $realValue = $entityModified['entity']->{$entityModified['idGetter']}(); $tempValue = $entityModified['idValue']; if ($tempValue != $realValue) { $keyMappings[$this->getEntityClass($entityModified['entity']) . '_' . $tempValue] = array('TempValue' => $tempValue, 'RealValue' => $realValue, 'EntityTypeName' => $entityModified['entityTypeName']); } } $entities[] = $entityModified['entity']; } } $keyMappings = array_values($keyMappings); return array('Entities' => $entities, 'KeyMappings' => $keyMappings); }