/**
  * @param EmailCampaign $emailCampaign
  * @param object  $entity
  * @return EmailCampaignStatistics
  */
 public function getStatisticsRecord(EmailCampaign $emailCampaign, $entity)
 {
     $marketingList = $emailCampaign->getMarketingList();
     $entityId = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     /**
      * Cache was added because there is a case:
      * - 2 email campaigns linked to one marketing list
      * - statistic can created using batches (marketing list item connector will be used)
      *  and flush will be run once per N records creation
      * in this case same Marketing list entity will be received twice for one marketing list
      * and new MarketingListItem for same $marketingList and $entityId will be persisted twice.
      *
      * Marketing list name used as key for cache because Id can be empty and name is unique
      *
      */
     if (empty($this->marketingListItemCache[$marketingList->getName()][$entityId])) {
         // Mark marketing list item as contacted
         $this->marketingListItemCache[$marketingList->getName()][$entityId] = $this->marketingListItemConnector->getMarketingListItem($marketingList, $entityId);
     }
     /** @var MarketingListItem $marketingListItem */
     $marketingListItem = $this->marketingListItemCache[$marketingList->getName()][$entityId];
     $manager = $this->doctrineHelper->getEntityManager($this->entityName);
     $statisticsRecord = null;
     if ($marketingListItem->getId() !== null) {
         $statisticsRecord = $manager->getRepository($this->entityName)->findOneBy(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem]);
     }
     if (!$statisticsRecord) {
         $statisticsRecord = new EmailCampaignStatistics();
         $statisticsRecord->setEmailCampaign($emailCampaign)->setMarketingListItem($marketingListItem)->setOwner($emailCampaign->getOwner())->setOrganization($emailCampaign->getOrganization());
         $manager->persist($statisticsRecord);
     }
     return $statisticsRecord;
 }
 /**
  * {@inheritdoc}
  */
 public function batchUpdate(MassActionInterface $massAction, IterableResultInterface $results, array $data)
 {
     $this->entityName = $massAction->getOptions()->offsetGet('entityName');
     $this->fieldName = empty($data['mass_edit_field']) ? null : $data['mass_edit_field'];
     if (empty($this->fieldName)) {
         throw new \RuntimeException("Field name was not specified with option 'mass_edit_field'");
     }
     $this->identifierName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($this->entityName);
     $value = $data[$this->fieldName];
     $selectedIds = [];
     $entitiesCount = 0;
     $iteration = 0;
     $this->entityManager = $this->doctrineHelper->getEntityManager($this->entityName);
     $this->entityManager->beginTransaction();
     try {
         set_time_limit(0);
         foreach ($results as $result) {
             /** @var $result ResultRecordInterface */
             $selectedIds[] = $result->getValue($this->identifierName);
             $iteration++;
             if ($iteration % $this->batchSize == 0) {
                 $entitiesCount += $this->finishBatch($selectedIds, $value);
             }
         }
         if ($iteration % $this->batchSize > 0) {
             $entitiesCount += $this->finishBatch($selectedIds, $value);
         }
         $this->entityManager->commit();
     } catch (\Exception $e) {
         $this->entityManager->rollback();
         throw $e;
     }
     return $entitiesCount;
 }
예제 #3
0
 /**
  * @param FormEvent $event
  */
 public function postSetData(FormEvent $event)
 {
     $form = $event->getForm();
     if ($form->getParent() || !$form->has($this->fieldName)) {
         return;
     }
     $isEntityExists = false;
     $entity = $event->getData();
     if ($entity) {
         if (!is_object($entity)) {
             return;
         }
         $entityClass = ClassUtils::getClass($entity);
         if (!$this->doctrineHelper->isManageableEntity($entityClass)) {
             return;
         }
         $entityIdentifier = $this->doctrineHelper->getEntityManager($entityClass)->getClassMetadata($entityClass)->getIdentifierValues($entity);
         $isEntityExists = !empty($entityIdentifier);
     }
     // if entity exists and assign is not granted - replace field with disabled text field,
     // otherwise - set default owner value
     if ($isEntityExists) {
         $this->replaceOwnerField($form);
     } else {
         $this->setPredefinedOwner($form);
     }
 }
예제 #4
0
 /**
  * {@inheritdoc}
  */
 public function merge(FieldData $fieldData)
 {
     $entityData = $fieldData->getEntityData();
     $masterEntity = $entityData->getMasterEntity();
     $sourceEntity = $fieldData->getSourceEntity();
     if ($masterEntity->getId() !== $sourceEntity->getId()) {
         $queryBuilder = $this->doctrineHelper->getEntityRepository('OroNoteBundle:Note')->getBaseAssociatedNotesQB(ClassUtils::getRealClass($masterEntity), $masterEntity->getId());
         $notes = $queryBuilder->getQuery()->getResult();
         if (!empty($notes)) {
             $entityManager = $this->doctrineHelper->getEntityManager(current($notes));
             foreach ($notes as $note) {
                 $entityManager->remove($note);
             }
         }
         $queryBuilder = $this->doctrineHelper->getEntityRepository('OroNoteBundle:Note')->getBaseAssociatedNotesQB(ClassUtils::getRealClass($masterEntity), $sourceEntity->getId());
         $notes = $queryBuilder->getQuery()->getResult();
         if (!empty($notes)) {
             foreach ($notes as $note) {
                 $note->setTarget($masterEntity);
             }
         }
         $fieldMetadata = $fieldData->getMetadata();
         $activityClass = $fieldMetadata->get('type');
         $entityClass = ClassUtils::getRealClass($sourceEntity);
         $queryBuilder = $this->doctrineHelper->getEntityRepository(ActivityList::ENTITY_NAME)->getActivityListQueryBuilderByActivityClass($entityClass, $sourceEntity->getId(), $activityClass);
         $activityListItems = $queryBuilder->getQuery()->getResult();
         $activityIds = ArrayUtils::arrayColumn($activityListItems, 'id');
         $this->activityListManager->replaceActivityTargetWithPlainQuery($activityIds, $entityClass, $sourceEntity->getId(), $masterEntity->getId());
     }
 }
예제 #5
0
 /**
  * {@inheritdoc}
  */
 public function guessColumnOptions($columnName, $entityName, $column)
 {
     $entityManager = $this->doctrineHelper->getEntityManager($entityName);
     $metadata = $entityManager->getClassMetadata($entityName);
     $result = [];
     if ($metadata->hasField($columnName) && !$metadata->hasAssociation($columnName)) {
         $result[Configuration::BASE_CONFIG_KEY] = [Configuration::CONFIG_ENABLE_KEY => true];
     }
     return $result;
 }
 /**
  * Link new product with category from source product
  *
  * @param ProductDuplicateAfterEvent $event
  */
 public function onDuplicateAfter(ProductDuplicateAfterEvent $event)
 {
     $product = $event->getProduct();
     $sourceProduct = $event->getSourceProduct();
     $category = $this->getCategoryRepository()->findOneByProduct($sourceProduct);
     if ($category !== null) {
         $category->addProduct($product);
         $objectManager = $this->doctrineHelper->getEntityManager($this->categoryClass);
         $objectManager->flush();
     }
 }
예제 #7
0
 /**
  * @param mixed $userId
  * @return EmailOrigin[]
  */
 public function getEmailOrigins($userId)
 {
     if (null === $this->emailOrigins) {
         if ($userId) {
             $user = $this->doctrineHelper->getEntityManager($this->userClass)->getRepository($this->userClass)->find($userId);
             $this->emailOrigins = $user->getEmailOrigins();
         } else {
             $this->emailOrigins = [];
         }
     }
     return $this->emailOrigins;
 }
예제 #8
0
 /**
  * Check ACL for resource.
  *
  * @param mixed $context
  * @return boolean
  */
 protected function isConditionAllowed($context)
 {
     $attributes = $this->contextAccessor->getValue($context, $this->attributes);
     $objectOrClass = $this->contextAccessor->getValue($context, $this->objectOrClass);
     if (is_object($objectOrClass)) {
         $unitOfWork = $this->doctrineHelper->getEntityManager($objectOrClass)->getUnitOfWork();
         if (!$unitOfWork->isInIdentityMap($objectOrClass) || $unitOfWork->isScheduledForInsert($objectOrClass)) {
             $objectOrClass = 'Entity:' . $this->doctrineHelper->getEntityClass($objectOrClass);
         }
     }
     return $this->securityFacade->isGranted($attributes, $objectOrClass);
 }
 /**
  * {@inheritdoc}
  */
 protected function createSubordinateIterator($staticSegment)
 {
     $vars = $this->provider->provideExtendedMergeVars($staticSegment->getMarketingList());
     $varNames = array_map(function ($each) {
         return $each['name'];
     }, $vars);
     $qb = $this->doctrineHelper->getEntityManager($this->extendedMergeVarClassName)->getRepository($this->extendedMergeVarClassName)->createQueryBuilder('extendedMergeVar');
     $qb->select(['extendedMergeVar.id', $staticSegment->getId() . ' static_segment_id', 'extendedMergeVar.name', $qb->expr()->literal(ExtendedMergeVar::STATE_REMOVE) . ' state']);
     $qb->where($qb->expr()->andX($qb->expr()->eq('extendedMergeVar.staticSegment', ':staticSegment'), $qb->expr()->notIn('extendedMergeVar.name', ':vars'), $qb->expr()->neq('extendedMergeVar.state', ':state')))->setParameter('staticSegment', $staticSegment)->setParameter('vars', $varNames)->setParameter('state', ExtendedMergeVar::STATE_DROPPED);
     $bufferedIterator = new BufferedQueryResultIterator($qb);
     $bufferedIterator->setHydrationMode(AbstractQuery::HYDRATE_ARRAY)->setReverse(true);
     return $bufferedIterator;
 }
 /**
  * Copy product prices
  *
  * @param ProductDuplicateAfterEvent $event
  */
 public function onDuplicateAfter(ProductDuplicateAfterEvent $event)
 {
     $product = $event->getProduct();
     $sourceProduct = $event->getSourceProduct();
     $productPrices = $this->getProductPriceRepository()->getPricesByProduct($sourceProduct);
     $objectManager = $this->doctrineHelper->getEntityManager($this->productPriceClass);
     foreach ($productPrices as $productPrice) {
         $productPriceCopy = clone $productPrice;
         $productPriceCopy->setProduct($product);
         $objectManager->persist($productPriceCopy);
     }
     $objectManager->flush();
 }
예제 #11
0
 /**
  * {@inheritdoc}
  */
 public function write(array $items)
 {
     $entityManager = $this->doctrineHelper->getEntityManager($this->getClassName($items));
     foreach ($items as $item) {
         $entityManager->persist($item);
         $this->detachFixer->fixEntityAssociationFields($item, 1);
     }
     $entityManager->flush();
     $configuration = $this->getConfig();
     if (empty($configuration[self::SKIP_CLEAR])) {
         $entityManager->clear();
     }
 }
예제 #12
0
 /**
  * @param object $entity
  * @param bool   $allowCreate
  *
  * @return FieldsChanges
  */
 protected function getOrCreateFieldsChanges($entity, $allowCreate = true)
 {
     $className = $this->doctrineHelper->getEntityClass($entity);
     $identifier = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     $em = $this->doctrineHelper->getEntityManager($this->className);
     $fieldChanges = $em->getRepository($this->className)->findOneBy(['entityClass' => $className, 'entityId' => $identifier]);
     if ($fieldChanges || !$fieldChanges && !$allowCreate) {
         return $fieldChanges;
     }
     $fieldChanges = $this->doctrineHelper->createEntityInstance($this->className)->setEntityClass($className)->setEntityId($identifier);
     $em->persist($fieldChanges);
     return $fieldChanges;
 }
 /**
  * @param array $item
  * @return QueryBuilder
  */
 protected function createQueryBuilder(array $item)
 {
     $em = $this->doctrineHelper->getEntityManager($this->entityName);
     $identifierFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($this->entityName);
     $qb = $em->createQueryBuilder();
     $qb->select('COUNT(e.' . $identifierFieldName . ') as itemsCount')->from($this->entityName, 'e');
     if (array_key_exists($this->field, $item)) {
         $qb->andWhere($qb->expr()->notIn('e.' . $this->field, ':items'))->setParameter('items', (array) $item[$this->field]);
     }
     // Workaround to limit by channel. Channel is not available in second step context.
     if (array_key_exists('channel', $item)) {
         $qb->andWhere($qb->expr()->eq('e.channel', ':channel'))->setParameter('channel', $item['channel']);
     }
     return $qb;
 }
 /**
  * @param ProcessHandleEvent $event
  *
  * @throws \Exception
  */
 public function onProcessHandleAfter(ProcessHandleEvent $event)
 {
     $entity = $event->getProcessData()->get('data');
     if (!$entity instanceof MemberActivity) {
         return;
     }
     $this->processCollectorListener->setEnabled(false);
     try {
         $this->doctrineHelper->getEntityManager($entity)->flush($entity);
     } catch (\Exception $e) {
         $this->processCollectorListener->setEnabled(true);
         throw $e;
     }
     $this->processCollectorListener->setEnabled(true);
 }
예제 #15
0
파일: RFMBuilder.php 프로젝트: heoffice/crm
 /**
  * @param Channel $channel
  * @param array $values
  * @throws \Doctrine\DBAL\ConnectionException
  * @throws \Exception
  */
 protected function updateValues(Channel $channel, array $values)
 {
     if (count($values) === 0) {
         return;
     }
     $entityFQCN = $channel->getCustomerIdentity();
     $em = $this->doctrineHelper->getEntityManager($entityFQCN);
     $idField = $this->doctrineHelper->getSingleEntityIdentifierFieldName($entityFQCN);
     $connection = $em->getConnection();
     $connection->beginTransaction();
     try {
         foreach ($values as $id => $value) {
             $qb = $em->createQueryBuilder();
             $qb->update($entityFQCN, 'e');
             foreach ($value as $metricName => $metricValue) {
                 $qb->set('e.' . $metricName, ':' . $metricName);
                 $qb->setParameter($metricName, $metricValue);
             }
             $qb->where($qb->expr()->eq('e.' . $idField, ':id'));
             $qb->setParameter('id', $id);
             $qb->getQuery()->execute();
         }
         $connection->commit();
     } catch (\Exception $e) {
         $connection->rollBack();
         throw $e;
     }
 }
예제 #16
0
 /**
  * @param FormInterface $form
  * @param object $entity
  * @return bool
  * @throws \Exception
  */
 protected function saveForm(FormInterface $form, $entity)
 {
     $event = new FormProcessEvent($form, $entity);
     $this->eventDispatcher->dispatch(Events::BEFORE_FORM_DATA_SET, $event);
     if ($event->isFormProcessInterrupted()) {
         return false;
     }
     $form->setData($entity);
     if (in_array($this->request->getMethod(), array('POST', 'PUT'))) {
         $event = new FormProcessEvent($form, $entity);
         $this->eventDispatcher->dispatch(Events::BEFORE_FORM_SUBMIT, $event);
         if ($event->isFormProcessInterrupted()) {
             return false;
         }
         $form->submit($this->request);
         if ($form->isValid()) {
             $manager = $this->doctrineHelper->getEntityManager($entity);
             $manager->beginTransaction();
             try {
                 $manager->persist($entity);
                 $this->eventDispatcher->dispatch(Events::BEFORE_FLUSH, new AfterFormProcessEvent($form, $entity));
                 $manager->flush();
                 $this->eventDispatcher->dispatch(Events::AFTER_FLUSH, new AfterFormProcessEvent($form, $entity));
                 $manager->commit();
             } catch (\Exception $e) {
                 $manager->rollback();
                 throw $e;
             }
             return true;
         }
     }
     return false;
 }
 /**
  * {@inheritdoc}
  */
 public function getData(ActivityList $activityListEntity)
 {
     /** @var Email $email */
     $email = $headEmail = $this->doctrineRegistryLink->getService()->getRepository($activityListEntity->getRelatedActivityClass())->find($activityListEntity->getRelatedActivityId());
     if ($email->isHead() && $email->getThread()) {
         $headEmail = $this->emailThreadProvider->getHeadEmail($this->doctrineHelper->getEntityManager($activityListEntity->getRelatedActivityClass()), $email);
     }
     $data = ['ownerName' => $email->getFromName(), 'ownerLink' => null, 'entityId' => $email->getId(), 'headOwnerName' => $headEmail->getFromName(), 'headSubject' => $headEmail->getSubject(), 'headSentAt' => $headEmail->getSentAt()->format('c'), 'isHead' => $email->isHead() && $email->getThread(), 'treadId' => $email->getThread() ? $email->getThread()->getId() : null];
     if ($email->getThread()) {
         $emails = $email->getThread()->getEmails();
         // if there are just two email - add replayedEmailId to use on client side
         if (count($emails) === 2) {
             $data['replayedEmailId'] = $emails[0]->getId();
         }
     }
     if ($email->getFromEmailAddress()->getHasOwner()) {
         $owner = $email->getFromEmailAddress()->getOwner();
         $data['headOwnerName'] = $data['ownerName'] = $this->entityNameResolver->getName($owner);
         $route = $this->configManager->getEntityMetadata(ClassUtils::getClass($owner))->getRoute('view');
         $securityFacade = $this->securityFacadeLink->getService();
         if (null !== $route && $securityFacade->isGranted('VIEW', $owner)) {
             $id = $this->doctrineHelper->getSingleEntityIdentifier($owner);
             try {
                 $data['ownerLink'] = $this->router->generate($route, ['id' => $id]);
             } catch (RouteNotFoundException $e) {
                 // Do not set owner link if route is not found.
             }
         }
     }
     return $data;
 }
예제 #18
0
 public function testGetEntityManagerNotManageableEntity()
 {
     $class = 'ItemStubProxy';
     $this->setExpectedException('Oro\\Bundle\\EntityBundle\\Exception\\NotManageableEntityException', sprintf('Entity class "%s" is not manageable', $class));
     $this->registry->expects($this->once())->method('getManagerForClass')->with($class)->will($this->returnValue(null));
     $this->doctrineHelper->getEntityManager($class);
 }
예제 #19
0
 /**
  * @return EntityManager
  */
 protected function getEntityManager()
 {
     if (null === $this->em) {
         $this->em = $this->doctrineHelper->getEntityManager('OroEmailBundle:Email');
     }
     return $this->em;
 }
예제 #20
0
 public function testManagersCache()
 {
     $this->registry->expects($this->exactly(2))->method('getManagerForClass')->willReturn($this->onConsecutiveCalls($this->em, null));
     $this->doctrineHelper->getEntityManager('\\stdClass');
     $this->doctrineHelper->getEntityManager('\\stdClass');
     $this->doctrineHelper->getEntityManager(new TestEntity(), false);
     $this->doctrineHelper->getEntityManager(new TestEntity(), false);
 }
예제 #21
0
 /**
  * @param object $entity
  */
 public function resetIdentifier($entity)
 {
     $entityName = ClassUtils::getClass($entity);
     /** @var EntityManager $entityManager */
     $entityManager = $this->doctrineHelper->getEntityManager($entityName);
     $identifierField = $this->getIdentifierFieldName($entityName);
     $entityManager->getClassMetadata($entityName)->setIdentifierValues($entity, [$identifierField => null]);
 }
 /**
  * @param EmailCampaign $emailCampaign
  * @param object  $entity
  * @return EmailCampaignStatistics
  */
 public function getStatisticsRecord(EmailCampaign $emailCampaign, $entity)
 {
     $marketingList = $emailCampaign->getMarketingList();
     $entityId = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     // Mark marketing list item as contacted
     $marketingListItem = $this->marketingListItemConnector->getMarketingListItem($marketingList, $entityId);
     $manager = $this->doctrineHelper->getEntityManager($this->entityName);
     $statisticsRecord = null;
     if ($marketingListItem->getId() !== null) {
         $statisticsRecord = $manager->getRepository($this->entityName)->findOneBy(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem]);
     }
     if (!$statisticsRecord) {
         $statisticsRecord = new EmailCampaignStatistics();
         $statisticsRecord->setEmailCampaign($emailCampaign)->setMarketingListItem($marketingListItem)->setOwner($emailCampaign->getOwner())->setOrganization($emailCampaign->getOrganization());
         $manager->persist($statisticsRecord);
     }
     return $statisticsRecord;
 }
예제 #23
0
 /**
  * @param FormInterface $form
  * @param array $categories
  */
 protected function addRFMTypes(FormInterface $form, array $categories)
 {
     foreach (RFMMetricCategory::$types as $type) {
         $typeCategories = array_filter($categories, function (RFMMetricCategory $category) use($type) {
             return $category->getCategoryType() === $type;
         });
         $collection = new PersistentCollection($this->doctrineHelper->getEntityManager($this->rfmCategoryClass), $this->doctrineHelper->getEntityMetadata($this->rfmCategoryClass), new ArrayCollection($typeCategories));
         $collection->takeSnapshot();
         $constraint = new CategoriesConstraint();
         $constraint->setType($type);
         $form->add($type, RFMCategorySettingsType::NAME, [RFMCategorySettingsType::TYPE_OPTION => $type, 'label' => sprintf('orocrm.analytics.form.%s.label', $type), 'tooltip' => sprintf('orocrm.analytics.%s.tooltip', $type), 'mapped' => false, 'required' => false, 'error_bubbling' => false, 'is_increasing' => $type === RFMMetricCategory::TYPE_RECENCY, 'constraints' => [$constraint], 'data' => $collection]);
     }
 }
예제 #24
0
 /**
  * @param string $entity
  * @param string $keyField
  * @param string $labelField
  *
  * @return array
  */
 protected function getChoices($entity, $keyField, $labelField)
 {
     $entityManager = $this->doctrineHelper->getEntityManager($entity);
     $queryBuilder = $entityManager->getRepository($entity)->createQueryBuilder('e');
     //select only id and label fields
     $queryBuilder->select("e.{$keyField}, e.{$labelField}");
     $result = $this->aclHelper->apply($queryBuilder)->getResult();
     $choices = [];
     foreach ($result as $item) {
         $choices[$item[$keyField]] = $item[$labelField];
     }
     return $choices;
 }
예제 #25
0
 /**
  * @param FormInterface $form
  * @param object $entity
  * @return bool
  */
 protected function saveForm(FormInterface $form, $entity)
 {
     $form->setData($entity);
     if (in_array($this->request->getMethod(), array('POST', 'PUT'))) {
         $form->submit($this->request);
         if ($form->isValid()) {
             $manager = $this->doctrineHelper->getEntityManager($entity);
             $manager->persist($entity);
             $manager->flush();
             return true;
         }
     }
     return false;
 }
 /**
  * {@inheritdoc}
  */
 public function getData(ActivityList $activityListEntity)
 {
     /** @var Email $email */
     $email = $headEmail = $this->doctrineRegistryLink->getService()->getRepository($activityListEntity->getRelatedActivityClass())->find($activityListEntity->getRelatedActivityId());
     if ($email->isHead() && $email->getThread()) {
         $headEmail = $this->emailThreadProvider->getHeadEmail($this->doctrineHelper->getEntityManager($activityListEntity->getRelatedActivityClass()), $email);
     }
     $data = ['ownerName' => $email->getFromName(), 'ownerLink' => null, 'entityId' => $email->getId(), 'headOwnerName' => $headEmail->getFromName(), 'headSubject' => $headEmail->getSubject(), 'headSentAt' => $headEmail->getSentAt()->format('c'), 'isHead' => $email->isHead() && $email->getThread(), 'treadId' => $email->getThread() ? $email->getThread()->getId() : null];
     $data = $this->setReplaedEmailId($email, $data);
     if ($email->getFromEmailAddress()->getHasOwner()) {
         $owner = $email->getFromEmailAddress()->getOwner();
         $data['headOwnerName'] = $data['ownerName'] = $this->entityNameResolver->getName($owner);
         $data = $this->setOwnerLink($owner, $data);
     }
     return $data;
 }
예제 #27
0
 /**
  * @param Product $product
  * @param Product $productCopy
  */
 protected function cloneChildObjects(Product $product, Product $productCopy)
 {
     foreach ($product->getUnitPrecisions() as $unitPrecision) {
         $productCopy->addUnitPrecision(clone $unitPrecision);
     }
     if ($imageFile = $product->getImage()) {
         $imageFileCopy = $this->attachmentManager->copyAttachmentFile($imageFile);
         $productCopy->setImage($imageFileCopy);
     }
     $attachments = $this->attachmentProvider->getEntityAttachments($product);
     foreach ($attachments as $attachment) {
         $attachmentCopy = clone $attachment;
         $attachmentFileCopy = $this->attachmentManager->copyAttachmentFile($attachment->getFile());
         $attachmentCopy->setFile($attachmentFileCopy);
         $attachmentCopy->setTarget($productCopy);
         $this->doctrineHelper->getEntityManager($attachmentCopy)->persist($attachmentCopy);
     }
 }
예제 #28
0
 /**
  * Returns a query builder that could be used for fetching the list of entities
  * associated with $associationOwnerClass entities found by $filters and $joins
  *
  * @param string      $associationTargetClass The FQCN of the entity that is the owning side of the association
  * @param mixed|null  $filters                Criteria is used to filter entities which are association owners
  *                                            e.g. ['age' => 20, ...] or \Doctrine\Common\Collections\Criteria
  * @param array|null  $joins                  Additional associations required to filter owning side entities
  * @param array       $associationOwners      The list of fields responsible to store associations between
  *                                            the given target and association owners
  *                                            Array format: [owner_entity_class => field_name]
  * @param int         $limit                  The maximum number of items per page
  * @param int         $page                   The page number
  * @param string|null $orderBy                The ordering expression for the result
  *
  * @return SqlQueryBuilder
  */
 public function getMultiAssociationOwnersQueryBuilder($associationTargetClass, $filters, $joins, $associationOwners, $limit = null, $page = null, $orderBy = null)
 {
     $em = $this->doctrineHelper->getEntityManager($associationTargetClass);
     $criteria = $this->doctrineHelper->normalizeCriteria($filters);
     $selectStmt = null;
     $subQueries = [];
     $targetIdFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($associationTargetClass);
     foreach ($associationOwners as $ownerClass => $fieldName) {
         // dispatch oro_api.request.get_list.before event
         $event = new GetListBefore($this->cloneCriteria($criteria), $associationTargetClass);
         $this->eventDispatcher->dispatch(GetListBefore::NAME, $event);
         $subCriteria = $event->getCriteria();
         $nameExpr = $this->entityNameResolver->getNameDQL($ownerClass, 'e');
         $subQb = $em->getRepository($ownerClass)->createQueryBuilder('e')->select(sprintf('target.%s AS id, e.id AS entityId, \'%s\' AS entityClass, ' . ($nameExpr ?: '\'\'') . ' AS entityTitle', $targetIdFieldName, str_replace('\'', '\'\'', $ownerClass)))->innerJoin('e.' . $fieldName, 'target');
         $this->doctrineHelper->applyJoins($subQb, $joins);
         // fix of doctrine error with Same Field, Multiple Values, Criteria and QueryBuilder
         // http://www.doctrine-project.org/jira/browse/DDC-2798
         // TODO revert changes when doctrine version >= 2.5 in scope of BAP-5577
         QueryBuilderHelper::addCriteria($subQb, $subCriteria);
         // $subQb->addCriteria($criteria);
         $subQuery = $subQb->getQuery();
         $subQueries[] = QueryUtils::getExecutableSql($subQuery);
         if (empty($selectStmt)) {
             $mapping = QueryUtils::parseQuery($subQuery)->getResultSetMapping();
             $selectStmt = sprintf('entity.%s AS id, entity.%s AS entity, entity.%s AS title', QueryUtils::getColumnNameByAlias($mapping, 'entityId'), QueryUtils::getColumnNameByAlias($mapping, 'entityClass'), QueryUtils::getColumnNameByAlias($mapping, 'entityTitle'));
         }
     }
     $rsm = new ResultSetMapping();
     $rsm->addScalarResult('id', 'id', Type::INTEGER)->addScalarResult('entity', 'entity')->addScalarResult('title', 'title');
     $qb = new SqlQueryBuilder($em, $rsm);
     $qb->select($selectStmt)->from('(' . implode(' UNION ALL ', $subQueries) . ')', 'entity');
     if (null !== $limit) {
         $qb->setMaxResults($limit);
         if (null !== $page) {
             $qb->setFirstResult($this->doctrineHelper->getPageOffset($page, $limit));
         }
     }
     if ($orderBy) {
         $qb->orderBy($orderBy);
     }
     return $qb;
 }
예제 #29
0
 /**
  * This method should be used for fast changing data in 'relation' tables, because
  * it uses Plain SQL for updating data in tables.
  * Currently there is no another way for updating big amount of data: with Doctrine way
  * it takes a lot of time(because of big amount of operations with objects, event listeners etc.);
  * with DQL currently it impossible to build query, because DQL works only with entities, but
  * 'relation' tables are not entities. For example: there is 'relation'
  * table 'oro_rel_c3990ba6b28b6f38c460bc' and it has activitylist_id and account_id columns,
  * in fact to solve initial issue with big amount of data we need update only account_id column
  * with new values.
  *
  * @param array       $activityIds
  * @param string      $targetClass
  * @param integer     $oldTargetId
  * @param integer     $newTargetId
  * @param null|string $activityClass
  *
  * @return $this
  *
  * @throws \Doctrine\DBAL\DBALException
  * @throws \Doctrine\ORM\Mapping\MappingException
  */
 public function replaceActivityTargetWithPlainQuery(array $activityIds, $targetClass, $oldTargetId, $newTargetId, $activityClass = null)
 {
     if (is_null($activityClass)) {
         $associationName = $this->getActivityListAssociationName($targetClass);
         $entityClass = ActivityList::ENTITY_NAME;
     } else {
         $associationName = $this->getActivityAssociationName($targetClass);
         $entityClass = $activityClass;
     }
     $entityMetadata = $this->doctrineHelper->getEntityMetadata($entityClass);
     if (!empty($activityIds) && $entityMetadata->hasAssociation($associationName)) {
         $association = $entityMetadata->getAssociationMapping($associationName);
         $tableName = $association['joinTable']['name'];
         $activityField = current(array_keys($association['relationToSourceKeyColumns']));
         $targetField = current(array_keys($association['relationToTargetKeyColumns']));
         $where = "WHERE {$targetField} = :sourceEntityId AND {$activityField} IN(" . implode(',', $activityIds) . ")";
         $dbConnection = $this->doctrineHelper->getEntityManager(ActivityList::ENTITY_NAME)->getConnection()->prepare("UPDATE {$tableName} SET {$targetField} = :masterEntityId {$where}");
         $dbConnection->bindValue('masterEntityId', $newTargetId);
         $dbConnection->bindValue('sourceEntityId', $oldTargetId);
         $dbConnection->execute();
     }
     return $this;
 }
예제 #30
0
 /**
  * Returns a query builder that could be used for fetching the list of owner side entities
  * the specified $associationTargetClass associated with.
  * The $filters and $joins could be used to filter entities
  *
  * The resulting query would be something like this:
  * <code>
  * SELECT entity.entityId AS id, entity.entityClass AS entity, entity.entityTitle AS title FROM (
  *      SELECT [DISTINCT]
  *          target.id AS id,
  *          e.id AS entityId,
  *          {first_owner_entity_class} AS entityClass,
  *          {first_owner_title} AS entityTitle
  *      FROM {first_owner_entity_class} AS e
  *          INNER JOIN e.{target_field_name_for_first_owner} AS target
  *          {joins}
  *      WHERE {filters}
  *      UNION ALL
  *      SELECT [DISTINCT]
  *          target.id AS id,
  *          e.id AS entityId,
  *          {second_owner_entity_class} AS entityClass,
  *          {second_owner_title} AS entityTitle
  *      FROM {second_owner_entity_class} AS e
  *          INNER JOIN e.{target_field_name_for_second_owner} AS target
  *          {joins}
  *      WHERE {filters}
  *      UNION ALL
  *      ... select statements for other owners
  * ) entity
  * ORDER BY {orderBy}
  * LIMIT {limit} OFFSET {(page - 1) * limit}
  * </code>
  *
  * @param string        $associationTargetClass The FQCN of the entity that is the target side of the association
  * @param mixed|null    $filters                Criteria is used to filter entities which are association owners
  *                                              e.g. ['age' => 20, ...] or \Doctrine\Common\Collections\Criteria
  * @param array|null    $joins                  Additional associations required to filter owning side entities
  * @param array         $associationOwners      The list of fields responsible to store associations between
  *                                              the given target and association owners
  *                                              Array format: [owner_entity_class => field_name]
  * @param int|null      $limit                  The maximum number of items per page
  * @param int|null      $page                   The page number
  * @param string|null   $orderBy                The ordering expression for the result
  * @param callable|null $callback               A callback function which can be used to modify child queries
  *                                              function (QueryBuilder $qb, $ownerEntityClass)
  *
  * @return SqlQueryBuilder
  */
 public function getMultiAssociationOwnersQueryBuilder($associationTargetClass, $filters, $joins, $associationOwners, $limit = null, $page = null, $orderBy = null, $callback = null)
 {
     $em = $this->doctrineHelper->getEntityManager($associationTargetClass);
     $criteria = QueryUtils::normalizeCriteria($filters);
     $selectStmt = null;
     $subQueries = [];
     $targetIdFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($associationTargetClass);
     foreach ($associationOwners as $ownerClass => $fieldName) {
         $nameExpr = $this->entityNameResolver->getNameDQL($ownerClass, 'e');
         $subQb = $em->getRepository($ownerClass)->createQueryBuilder('e')->select(sprintf('target.%s AS id, e.id AS entityId, \'%s\' AS entityClass, ' . ($nameExpr ?: '\'\'') . ' AS entityTitle', $targetIdFieldName, str_replace('\'', '\'\'', $ownerClass)))->innerJoin('e.' . $fieldName, 'target');
         QueryUtils::applyJoins($subQb, $joins);
         $subQb->addCriteria($criteria);
         if (null !== $callback && is_callable($callback)) {
             call_user_func($callback, $subQb, $ownerClass);
         }
         $subQuery = $this->getAclHelper()->apply($subQb);
         $subQueries[] = QueryUtils::getExecutableSql($subQuery);
         if (empty($selectStmt)) {
             $mapping = QueryUtils::parseQuery($subQuery)->getResultSetMapping();
             $selectStmt = sprintf('entity.%s AS id, entity.%s AS entity, entity.%s AS title', QueryUtils::getColumnNameByAlias($mapping, 'entityId'), QueryUtils::getColumnNameByAlias($mapping, 'entityClass'), QueryUtils::getColumnNameByAlias($mapping, 'entityTitle'));
         }
     }
     $rsm = new ResultSetMapping();
     $rsm->addScalarResult('id', 'id', Type::INTEGER)->addScalarResult('entity', 'entity')->addScalarResult('title', 'title');
     $qb = new SqlQueryBuilder($em, $rsm);
     $qb->select($selectStmt)->from('(' . implode(' UNION ALL ', $subQueries) . ')', 'entity');
     if (null !== $limit) {
         $qb->setMaxResults($limit);
         if (null !== $page) {
             $qb->setFirstResult(QueryUtils::getPageOffset($page, $limit));
         }
     }
     if ($orderBy) {
         $qb->orderBy($orderBy);
     }
     return $qb;
 }