/**
  * @param int $calendarId
  *
  * @return array
  */
 public function getItems($calendarId)
 {
     $selectItems = [];
     $intCasts = [];
     $metadata = $this->getMetadata();
     $fields = $this->getFields();
     foreach ($fields as $fieldName => $fieldType) {
         $underlyingFieldType = $this->fieldTypeHelper->getUnderlyingType($fieldType);
         if ($this->fieldTypeHelper->isRelation($underlyingFieldType)) {
             $selectItems[] = sprintf('IDENTITY(o.%1$s) AS %1$s', $fieldName);
             if ($metadata->hasAssociation($fieldName)) {
                 $assocType = $this->doctrineHelper->getSingleEntityIdentifierFieldType($metadata->getAssociationTargetClass($fieldName), false);
                 if ($assocType === 'integer') {
                     $intCasts[] = $fieldName;
                 }
             }
         } else {
             $selectItems[] = 'o.' . $fieldName;
         }
     }
     $repo = $this->doctrineHelper->getEntityRepository(self::CALENDAR_PROPERTY_CLASS);
     $qb = $repo->createQueryBuilder('o')->select(implode(',', $selectItems))->where('o.targetCalendar = :calendar_id')->setParameter('calendar_id', $calendarId)->orderBy('o.id');
     $result = $qb->getQuery()->getArrayResult();
     // normalize integer foreign keys due Doctrine IDENTITY function always returns a string
     if ($intCasts) {
         foreach ($result as &$item) {
             foreach ($intCasts as $fieldName) {
                 if (isset($item[$fieldName]) && is_string($item[$fieldName])) {
                     $item[$fieldName] = (int) $item[$fieldName];
                 }
             }
         }
     }
     return $result;
 }
 /**
  * Adds entity fields to $result
  *
  * @param array         $result
  * @param string        $className
  * @param bool          $applyExclusions
  * @param bool          $translate
  */
 protected function addFields(array &$result, $className, $applyExclusions, $translate)
 {
     $metadata = $this->getMetadataFor($className);
     // add regular fields
     $configs = $this->extendConfigProvider->getConfigs($className);
     foreach ($configs as $fieldConfig) {
         /** @var FieldConfigId $fieldConfigId */
         $fieldConfigId = $fieldConfig->getId();
         $fieldName = $fieldConfigId->getFieldName();
         $fieldType = $this->fieldTypeHelper->getUnderlyingType($fieldConfigId->getFieldType());
         if ($this->fieldTypeHelper->isRelation($fieldType)) {
             // skip because this field is relation
             continue;
         }
         if (isset($result[$fieldName])) {
             // skip because a field with this name is already added, it could be a virtual field
             continue;
         }
         if (!$this->entityConfigProvider->hasConfig($className, $fieldName)) {
             // skip non configurable field
             continue;
         }
         if ($this->isIgnoredField($metadata, $fieldName)) {
             continue;
         }
         if ($fieldConfig->is('is_deleted')) {
             continue;
         }
         if ($applyExclusions && $this->exclusionProvider->isIgnoredField($metadata, $fieldName)) {
             continue;
         }
         $this->addField($result, $fieldName, $fieldConfigId->getFieldType(), $this->getFieldLabel($metadata, $fieldName), $metadata->isIdentifier($fieldName), $translate);
     }
 }
 /**
  * Determines whether the index for the given field is needed or not.
  * All relation type fields should be excluded.
  * Index requirement is determined by visibility of a field on a grid.
  *
  * @param string $className
  * @param string $fieldName
  * @param string $fieldType
  *
  * @return bool
  */
 protected function isIndexRequired($className, $fieldName, $fieldType)
 {
     $underlyingType = $this->fieldTypeHelper->getUnderlyingType($fieldType);
     if (!$this->fieldTypeHelper->isRelation($underlyingType)) {
         $datagridConfigProvider = $this->configManager->getProvider('datagrid');
         if ($datagridConfigProvider->hasConfig($className, $fieldName)) {
             $datagridConfig = $datagridConfigProvider->getConfig($className, $fieldName);
             return $datagridConfig->get('is_visible', false, false);
         }
     }
     return false;
 }
 /**
  * @param string $columnName
  * @param array $options
  * @param string $className
  * @param Table $table
  */
 protected function buildIndex($columnName, $options, $className, $table)
 {
     $columnType = $this->fieldTypeHelper->getUnderlyingType($options[ExtendOptionsManager::TYPE_OPTION]);
     if ($this->fieldTypeHelper->isRelation($columnType) || in_array($columnType, [Type::TEXT])) {
         return;
     }
     $indexName = $this->nameGenerator->generateIndexNameForExtendFieldVisibleInGrid($className, $columnName);
     if ($this->isEnabled($options) && $this->isExtended($options) && !$table->hasIndex($indexName)) {
         $table->addIndex([$columnName], $indexName);
     } elseif (!$this->isEnabled($options) && $table->hasIndex($indexName)) {
         $table->dropIndex($indexName);
     }
 }
示例#5
0
 /**
  * Return "false" if can't find config for field, "null" if field type is unknown for given field
  * or array with config data for given field
  *
  * @param ClassMetadata $metadata
  * @param $field
  * @return array|bool
  */
 protected function guessAttributeParametersScalarField(ClassMetadata $metadata, $field)
 {
     if ($metadata->hasField($field)) {
         $doctrineType = $metadata->getTypeOfField($field);
         if (!isset($this->doctrineTypeMapping[$doctrineType])) {
             return null;
         }
         return $this->formatResult($this->getLabel($metadata->getName(), $field), $this->doctrineTypeMapping[$doctrineType]['type'], $this->doctrineTypeMapping[$doctrineType]['options']);
     } elseif ($this->entityConfigProvider->hasConfig($metadata->getName(), $field)) {
         $entityConfig = $this->entityConfigProvider->getConfig($metadata->getName(), $field);
         $fieldType = $entityConfig->getId()->getFieldType();
         if (!FieldTypeHelper::isRelation($fieldType)) {
             return $this->formatResult($entityConfig->get('label'), $this->doctrineTypeMapping[$fieldType]['type'], $this->doctrineTypeMapping[$fieldType]['options']);
         }
     }
     return false;
 }
示例#6
0
 /**
  * @dataProvider relationCHeckTestProvider
  */
 public function testIsRelation($fieldType, $expected)
 {
     $this->assertSame($expected, FieldTypeHelper::isRelation($fieldType));
 }