entityType)) { $name = get_class($this); if (preg_match('@\\\\([\w]+)$@', $name, $matches)) { $name = $matches[1]; } if ($name != 'Record') { $this->entityType = Util::normilizeScopeName($name); } } $this->entityName = $this->entityType; } public function setEntityType($entityType) { $this->entityType = $entityType; $this->entityName = $entityType; } public function getEntityType() { return $this->entityType; } protected function getServiceFactory() { return $this->injections['serviceFactory']; } protected function getSelectManagerFactory() { return $this->injections['selectManagerFactory']; } protected function getAcl() { return $this->injections['acl']; } protected function getFileManager() { return $this->injections['fileManager']; } protected function getPreferences() { return $this->injections['preferences']; } protected function getMetadata() { return $this->injections['metadata']; } protected function getRepository() { return $this->getEntityManager()->getRepository($this->entityType); } protected function getRecordService($name) { if ($this->getServiceFactory()->checkExists($name)) { $service = $this->getServiceFactory()->create($name); } else { $service = $this->getServiceFactory()->create('Record'); $service->setEntityType($name); } return $service; } protected function prepareEntity($entity) { } public function getEntity($id = null) { $entity = $this->getRepository()->get($id); if (!empty($entity) && !empty($id)) { $this->loadAdditionalFields($entity); if (!$this->getAcl()->check($entity, 'read')) { throw new Forbidden(); } } if (!empty($entity)) { $this->prepareEntityForOutput($entity); } return $entity; } protected function getStreamService() { if (empty($this->streamService)) { $this->streamService = $this->getServiceFactory()->create('Stream'); } return $this->streamService; } protected function loadIsFollowed(Entity $entity) { if ($this->getStreamService()->checkIsFollowed($entity)) { $entity->set('isFollowed', true); } else { $entity->set('isFollowed', false); } } protected function loadFollowers(Entity $entity) { if ($this->getMetadata()->get("scopes.".$entity->getEntityType().".stream")) { $data = $this->getStreamService()->getEntityFollowers($entity, 0, self::FOLLOWERS_LIMIT); if ($data) { $entity->set('followersIds', $data['idList']); $entity->set('followersNames', $data['nameMap']); } } } protected function loadIsEditable(Entity $entity) { $entity->set('isEditable', $this->getAcl()->check($entity, 'edit')); } protected function loadLinkMultipleFields(Entity $entity) { $fieldDefs = $this->getMetadata()->get('entityDefs.' . $entity->getEntityType() . '.fields', array()); foreach ($fieldDefs as $field => $defs) { if (isset($defs['type']) && in_array($defs['type'], ['linkMultiple', 'attachmentMultiple']) && empty($defs['noLoad'])) { $columns = null; if (!empty($defs['columns'])) { $columns = $defs['columns']; } $entity->loadLinkMultipleField($field, $columns); } } } protected function loadParentNameFields(Entity $entity) { $fieldDefs = $this->getMetadata()->get('entityDefs.' . $entity->getEntityType() . '.fields', array()); foreach ($fieldDefs as $field => $defs) { if (isset($defs['type']) && $defs['type'] == 'linkParent') { $id = $entity->get($field . 'Id'); $scope = $entity->get($field . 'Type'); if ($scope) { if ($foreignEntity = $this->getEntityManager()->getEntity($scope, $id)) { $entity->set($field . 'Name', $foreignEntity->get('name')); } } } } } protected function loadNotJoinedLinkFields(Entity $entity) { $linkDefs = $this->getMetadata()->get('entityDefs.' . $entity->getEntityType() . '.links', array()); foreach ($linkDefs as $link => $defs) { if (isset($defs['type']) && $defs['type'] == 'belongsTo') { if (!empty($defs['noJoin']) && !empty($defs['entity'])) { $nameField = $link . 'Name'; $idField = $link . 'Id'; if ($entity->hasField($nameField) && $entity->hasField($idField)) { $id = $entity->get($idField); } $scope = $defs['entity']; if (!empty($scope) && $foreignEntity = $this->getEntityManager()->getEntity($scope, $id)) { $entity->set($nameField, $foreignEntity->get('name')); } } } } } public function loadAdditionalFields(Entity $entity) { $this->loadLinkMultipleFields($entity); $this->loadParentNameFields($entity); $this->loadIsFollowed($entity); $this->loadFollowers($entity); $this->loadEmailAddressField($entity); $this->loadPhoneNumberField($entity); $this->loadNotJoinedLinkFields($entity); $this->loadIsEditable($entity); } public function loadAdditionalFieldsForList(Entity $entity) { $this->loadParentNameFields($entity); } protected function loadEmailAddressField(Entity $entity) { $fieldDefs = $this->getMetadata()->get('entityDefs.' . $entity->getEntityType() . '.fields', array()); if (!empty($fieldDefs['emailAddress']) && $fieldDefs['emailAddress']['type'] == 'email') { $dataFieldName = 'emailAddressData'; $entity->set($dataFieldName, $this->getEntityManager()->getRepository('EmailAddress')->getEmailAddressData($entity)); } } protected function loadPhoneNumberField(Entity $entity) { $fieldDefs = $this->getMetadata()->get('entityDefs.' . $entity->getEntityType() . '.fields', array()); if (!empty($fieldDefs['phoneNumber']) && $fieldDefs['phoneNumber']['type'] == 'phone') { $dataFieldName = 'phoneNumberData'; $entity->set($dataFieldName, $this->getEntityManager()->getRepository('PhoneNumber')->getPhoneNumberData($entity)); } } protected function getSelectManager($entityType) { return $this->getSelectManagerFactory()->create($entityType); } protected function storeEntity(Entity $entity) { return $this->getRepository()->save($entity); } protected function isValid($entity) { $fieldDefs = $entity->getFields(); if ($entity->hasField('name') && !empty($fieldDefs['name']['required'])) { if (!$entity->get('name')) { return false; } } return true; } public function checkAssignment(Entity $entity) { if (!$this->isPermittedAssignedUser($entity)) { return false; } if (!$this->isPermittedTeams($entity)) { return false; } return true; } public function isPermittedAssignedUser(Entity $entity) { if (!$entity->hasField('assignedUserId')) { return true; } $assignedUserId = $entity->get('assignedUserId'); if (empty($assignedUserId)) { return true; } $assignmentPermission = $this->getAcl()->get('assignmentPermission'); if (empty($assignmentPermission) || $assignmentPermission === true || !in_array($assignmentPermission, ['team', 'no'])) { return true; } $toProcess = false; if (!$entity->isNew()) { if ($entity->isFieldChanged('assignedUserId')) { $toProcess = true; } } else { $toProcess = true; } if ($toProcess) { if ($assignmentPermission == 'no') { if ($this->getUser()->id != $assignedUserId) { return false; } } else if ($assignmentPermission == 'team') { $teamIds = $this->getUser()->get('teamsIds'); if (!$this->getEntityManager()->getRepository('User')->checkBelongsToAnyOfTeams($assignedUserId, $teamIds)) { return false; } } } return true; } public function isPermittedTeams(Entity $entity) { $assignmentPermission = $this->getAcl()->get('assignmentPermission'); if (empty($assignmentPermission) || $assignmentPermission === true || !in_array($assignmentPermission, ['team', 'no'])) { return true; } if (!$entity->hasField('teamsIds')) { return true; } $teamIds = $entity->get('teamsIds'); if (empty($teamIds)) { return true; } $newIds = []; if (!$entity->isNew()) { $existingIds = []; foreach ($entity->get('teams') as $team) { $existingIds[] = $team->id; } foreach ($teamIds as $id) { if (!in_array($id, $existingIds)) { $newIds[] = $id; } } } else { $newIds = $teamIds; } if (empty($newIds)) { return true; } $userTeamIds = $this->getUser()->get('teamsIds'); foreach ($newIds as $id) { if (!in_array($id, $userTeamIds)) { return false; } } return true; } protected function stripTags($string) { return strip_tags($string, '