Exemplo n.º 1
0
 /**
  * @param string $columnName
  * @param array $joinIds
  */
 protected function addColumnAliasesForVirtualRelation($columnName, array $joinIds)
 {
     if (!empty($this->virtualColumnExpressions[$columnName])) {
         return;
     }
     if (!$this->virtualRelationsJoins) {
         return;
     }
     $hasVirtualRelation = false;
     foreach ($joinIds as $columnJoinId) {
         $hasVirtualRelation = $hasVirtualRelation || array_search($columnJoinId, $this->virtualRelationsJoins);
     }
     if (!$hasVirtualRelation) {
         return;
     }
     $parentJoinId = $this->getParentJoinIdentifier($this->joinIdHelper->buildColumnJoinIdentifier($columnName));
     $fieldName = $this->getFieldName($parentJoinId);
     $className = $this->getEntityClassName($parentJoinId);
     if ($this->virtualRelationProvider->isVirtualRelation($className, $fieldName)) {
         $tableAlias = $this->aliases[$this->virtualRelationProvider->getTargetJoinAlias($className, $fieldName, $this->getFieldName($columnName))];
     } else {
         $joinId = end($joinIds);
         $tableAlias = $this->tableAliases[$joinId];
     }
     $this->virtualColumnExpressions[$columnName] = sprintf('%s.%s', $tableAlias, $this->getFieldName($columnName));
 }
 /**
  * @param array $expected
  *
  * @dataProvider getFieldsWithVirtualRelationsAndEnumsDataProvider
  */
 public function testGetFieldsWithVirtualRelationsAndEnums(array $expected)
 {
     $className = 'Acme\\Entity\\Test';
     $config = [$className => ['config' => ['label' => 'Test Label', 'plural_label' => 'Test Plural Label', 'icon' => 'icon-test'], 'fields' => ['field1' => ['type' => 'integer', 'identifier' => true, 'config' => ['label' => 'Field 1']]], 'relations' => ['rel1' => ['target_class' => 'Acme\\EnumValue1', 'type' => 'ref-one', 'config' => ['label' => 'Enum Field']], 'rel2' => ['target_class' => 'Acme\\EnumValue2', 'type' => 'ref-many', 'config' => ['label' => 'Multi Enum Field']]]]];
     $this->prepare($config);
     $this->virtualFieldProvider->expects($this->once())->method('getVirtualFields')->with($className)->will($this->returnValue(['rel1', 'rel2']));
     $this->virtualRelationProvider->expects($this->once())->method('getVirtualRelations')->with($className)->will($this->returnValue(['virtual_relation' => ['relation_type' => 'oneToMany', 'related_entity_name' => 'OtherEntity', 'query' => ['select' => ['select expression'], 'join' => ['join expression']]]]));
     $this->virtualFieldProvider->expects($this->exactly(2))->method('getVirtualFieldQuery')->will($this->returnValueMap([[$className, 'rel1', ['select' => ['return_type' => 'enum', 'filter_by_id' => true]]], [$className, 'rel2', ['select' => ['return_type' => 'multiEnum', 'filter_by_id' => true]]]]));
     $result = $this->provider->getFields('Acme:Test', true, true);
     $this->assertEquals($expected, $result);
 }
 /**
  * Adds entity virtual fields to $result
  *
  * @param array  $result
  * @param string $className
  * @param bool $withEntityDetails
  * @param bool $applyExclusions
  * @param bool $translate
  */
 protected function addVirtualRelations(array &$result, $className, $withEntityDetails, $applyExclusions, $translate)
 {
     if (!$this->virtualRelationProvider) {
         return;
     }
     $metadata = $this->getMetadataFor($className);
     $virtualRelations = $this->virtualRelationProvider->getVirtualRelations($className);
     foreach ($virtualRelations as $associationName => $virtualRelation) {
         if ($applyExclusions && $this->exclusionProvider->isIgnoredField($metadata, $associationName)) {
             continue;
         }
         $fieldType = $virtualRelation['relation_type'];
         $targetClassName = $this->entityClassResolver->getEntityClass($virtualRelation['related_entity_name']);
         $label = !empty($virtualRelation['label']) ? $virtualRelation['label'] : $this->getFieldLabel($metadata, $associationName);
         $this->addRelation($result, $associationName, $fieldType, $label, $this->getRelationType($fieldType), $targetClassName, $withEntityDetails, $translate);
     }
 }
Exemplo n.º 4
0
 protected function loadVirtualFields()
 {
     $entities = $this->cache->getEntities();
     foreach ($entities as $className => $entityData) {
         $virtualFields = $this->virtualFieldProvider->getVirtualFields($className);
         if (!empty($virtualFields)) {
             foreach ($virtualFields as $fieldName) {
                 if (null === $this->cache->getConfigurable($className, $fieldName)) {
                     $this->cache->saveConfigurable(false, $className, $fieldName);
                 }
             }
         }
         $virtualRelations = $this->virtualRelationProvider->getVirtualRelations($className);
         if (!empty($virtualRelations)) {
             foreach ($virtualRelations as $fieldName => $config) {
                 if (null === $this->cache->getConfigurable($className, $fieldName)) {
                     $this->cache->saveConfigurable(false, $className, $fieldName);
                 }
             }
         }
     }
 }