/** * Populate owner to target entity based on integration configuration and entity's ownership type * * @param object $entity * @param Integration $integration */ public function populateChannelOwner($entity, Integration $integration) { $defaultUserOwner = $integration->getDefaultUserOwner(); $className = ClassUtils::getClass($entity); $doctrineMetadata = $this->getEm()->getClassMetadata($className); $ownershipMetadata = $this->getMetadata($className); if ($defaultUserOwner && $ownershipMetadata->isBasicLevelOwned()) { $defaultUserOwner = $this->ensureNotDetached($defaultUserOwner); $doctrineMetadata->setFieldValue($entity, $ownershipMetadata->getOwnerFieldName(), $defaultUserOwner); } $defaultOrganization = $integration->getOrganization(); if ($defaultOrganization && $ownershipMetadata->getGlobalOwnerFieldName()) { $defaultOrganization = $this->ensureNotDetached($defaultOrganization); $doctrineMetadata->setFieldValue($entity, $ownershipMetadata->getGlobalOwnerFieldName(), $defaultOrganization); } }
/** * Process form * * @param Integration $entity * * @return bool */ public function process(Integration $entity) { $userOwner = $entity->getDefaultUserOwner(); $isNewEntity = !$entity->getId(); $this->form->setData($entity); if (in_array($this->request->getMethod(), array('POST', 'PUT'))) { $oldState = $this->getIntegration($entity); $this->form->submit($this->request); if (!$this->request->get(self::UPDATE_MARKER, false) && $this->form->isValid()) { $this->em->persist($entity); $this->em->flush(); if (!$isNewEntity && null === $userOwner && $userOwner !== $entity->getDefaultUserOwner()) { $this->eventDispatcher->dispatch(DefaultOwnerSetEvent::NAME, new DefaultOwnerSetEvent($entity)); } if (!$isNewEntity && $oldState) { $this->eventDispatcher->dispatch(IntegrationUpdateEvent::NAME, new IntegrationUpdateEvent($entity, $oldState)); } return true; } } return false; }
/** * @dataProvider defaultIntegrationOwnerProvider * * @param Integration $integration * @param string $ownerType * @param bool $expectedReload * @param bool $expectedSet * @param bool $expectedSetOrganization */ public function testPopulateChannelOwner(Integration $integration, $ownerType, $expectedReload, $expectedSet, $expectedSetOrganization = false) { $entity = new \stdClass(); $owner = $integration->getDefaultUserOwner(); $organization = $integration->getOrganization(); $doctrineMetadata = $this->getMockBuilder('Doctrine\\ORM\\Mapping\\ClassMetadataInfo')->disableOriginalConstructor()->getMock(); $this->em->expects($this->any())->method('getClassMetadata')->will($this->returnValue($doctrineMetadata)); if ($expectedReload) { $this->uow->expects($this->once())->method('getEntityState')->with($this->identicalTo($owner))->will($this->returnValue(UnitOfWork::STATE_DETACHED)); $this->em->expects($this->once())->method('find')->with($this->equalTo(get_class($owner)))->will($this->returnValue($owner)); } $ownerMetadata = new OwnershipMetadata($ownerType, self::USER_OWNER_FIELD_NAME, self::USER_OWNER_COLUMN_NAME, self::ORGANIZATION_FIELD_NAME); $this->metadataProvider->expects($this->any())->method('getMetadata')->with(get_class($entity))->will($this->returnValue($ownerMetadata)); if ($expectedSet) { $doctrineMetadata->expects($this->once())->method('setFieldValue')->with($this->identicalTo($entity), self::USER_OWNER_FIELD_NAME, $this->identicalTo($owner)); } elseif ($expectedSetOrganization) { $doctrineMetadata->expects($this->once())->method('setFieldValue')->with($this->identicalTo($entity), self::ORGANIZATION_FIELD_NAME, $this->identicalTo($organization)); } else { $doctrineMetadata->expects($this->never())->method('setFieldValue'); } $this->helper->populateChannelOwner($entity, $integration); }
/** * @return User */ public function getDefaultUserOwner() { return $this->integration->getDefaultUserOwner(); }