57 $this->dataMapCache = $this->cacheManager->getCache(
'extbase_datamapfactory_datamap');
69 $dataMap = $this->dataMapCache->get(str_replace(
'\\',
'%', $className));
70 if ($dataMap === FALSE) {
71 $dataMap = $this->buildDataMapInternal($className);
72 $this->dataMapCache->set(str_replace(
'\\',
'%', $className), $dataMap);
86 protected function buildDataMapInternal($className) {
87 if (!class_exists($className)) {
88 throw new \TYPO3\CMS\Extbase\Persistence\Generic\Exception\InvalidClassException(
'Could not find class definition for name "' . $className .
'". This could be caused by a mis-spelling of the class name in the class definition.');
91 $subclasses = array();
93 $columnMapping = array();
94 $frameworkConfiguration = $this->configurationManager->getConfiguration(\
TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
95 $classSettings = $frameworkConfiguration[
'persistence'][
'classes'][$className];
96 if ($classSettings !== NULL) {
97 if (isset($classSettings[
'subclasses']) && is_array($classSettings[
'subclasses'])) {
98 $subclasses = $this->
resolveSubclassesRecursive($frameworkConfiguration[
'persistence'][
'classes'], $classSettings[
'subclasses']);
100 if (isset($classSettings[
'mapping'][
'recordType']) && strlen($classSettings[
'mapping'][
'recordType']) > 0) {
101 $recordType = $classSettings[
'mapping'][
'recordType'];
103 if (isset($classSettings[
'mapping'][
'tableName']) && strlen($classSettings[
'mapping'][
'tableName']) > 0) {
104 $tableName = $classSettings[
'mapping'][
'tableName'];
106 $classHierarchy = array_merge(array($className), class_parents($className));
107 foreach ($classHierarchy as $currentClassName) {
108 if (in_array($currentClassName, array(
'TYPO3\\CMS\\Extbase\\DomainObject\\AbstractEntity',
'TYPO3\\CMS\\Extbase\\DomainObject\\AbstractValueObject'))) {
111 $currentClassSettings = $frameworkConfiguration[
'persistence'][
'classes'][$currentClassName];
112 if ($currentClassSettings !== NULL) {
113 if (isset($currentClassSettings[
'mapping'][
'columns']) && is_array($currentClassSettings[
'mapping'][
'columns'])) {
120 $dataMap = $this->objectManager->get(
'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Mapper\\DataMap', $className, $tableName, $recordType, $subclasses);
127 foreach ($tcaColumnsDefinition as $columnName => $columnDefinition) {
128 if (isset($columnDefinition[
'mapOnProperty'])) {
129 $propertyName = $columnDefinition[
'mapOnProperty'];
135 $propertyMetaData = $this->reflectionService->getClassSchema($className)->getProperty($propertyName);
136 $columnMap = $this->
setType($columnMap, $columnDefinition[
'config']);
137 $columnMap = $this->
setRelations($columnMap, $columnDefinition[
'config'], $propertyMetaData);
139 $dataMap->addColumnMap($columnMap);
151 $className = ltrim($className,
'\\');
152 if (strpos($className,
'\\') !== FALSE) {
153 $classNameParts = explode(
'\\', $className);
155 if (strpos($className,
'TYPO3\\CMS\\') === 0) {
156 $classPartsToSkip = 2;
158 $classPartsToSkip = 1;
160 $tableName =
'tx_' . strtolower(implode(
'_', array_slice($classNameParts, $classPartsToSkip)));
162 $tableName = strtolower($className);
176 $allSubclasses = array();
177 foreach ($subclasses as $subclass) {
178 $allSubclasses[] = $subclass;
179 if (isset($classesConfiguration[$subclass][
'subclasses']) && is_array($classesConfiguration[$subclass][
'subclasses'])) {
181 $allSubclasses = array_merge($allSubclasses, $childSubclasses);
184 return $allSubclasses;
194 return is_array(
$GLOBALS[
'TCA'][$tableName][
'ctrl']) ?
$GLOBALS[
'TCA'][$tableName][
'ctrl'] : NULL;
204 return is_array(
$GLOBALS[
'TCA'][$tableName][
'columns']) ?
$GLOBALS[
'TCA'][$tableName][
'columns'] : array();
213 $controlSection =
$GLOBALS[
'TCA'][$tableName][
'ctrl'];
214 $dataMap->setPageIdColumnName(
'pid');
215 if (isset($controlSection[
'tstamp'])) {
216 $dataMap->setModificationDateColumnName($controlSection[
'tstamp']);
218 if (isset($controlSection[
'crdate'])) {
219 $dataMap->setCreationDateColumnName($controlSection[
'crdate']);
221 if (isset($controlSection[
'cruser_id'])) {
222 $dataMap->setCreatorColumnName($controlSection[
'cruser_id']);
224 if (isset($controlSection[
'delete'])) {
225 $dataMap->setDeletedFlagColumnName($controlSection[
'delete']);
227 if (isset($controlSection[
'languageField'])) {
228 $dataMap->setLanguageIdColumnName($controlSection[
'languageField']);
230 if (isset($controlSection[
'transOrigPointerField'])) {
231 $dataMap->setTranslationOriginColumnName($controlSection[
'transOrigPointerField']);
233 if (isset($controlSection[
'type'])) {
234 $dataMap->setRecordTypeColumnName($controlSection[
'type']);
236 if (isset($controlSection[
'rootLevel'])) {
237 $dataMap->setRootLevel($controlSection[
'rootLevel']);
239 if (isset($controlSection[
'is_static'])) {
240 $dataMap->setIsStatic($controlSection[
'is_static']);
242 if (isset($controlSection[
'enablecolumns'][
'disabled'])) {
243 $dataMap->setDisabledFlagColumnName($controlSection[
'enablecolumns'][
'disabled']);
245 if (isset($controlSection[
'enablecolumns'][
'starttime'])) {
246 $dataMap->setStartTimeColumnName($controlSection[
'enablecolumns'][
'starttime']);
248 if (isset($controlSection[
'enablecolumns'][
'endtime'])) {
249 $dataMap->setEndTimeColumnName($controlSection[
'enablecolumns'][
'endtime']);
251 if (isset($controlSection[
'enablecolumns'][
'fe_group'])) {
252 $dataMap->setFrontEndUserGroupColumnName($controlSection[
'enablecolumns'][
'fe_group']);
265 $tableColumnType = (isset($columnConfiguration[
'type'])) ? $columnConfiguration[
'type'] : NULL;
266 $columnMap->
setType(\
TYPO3\CMS\Core\DataHandling\TableColumnType::cast($tableColumnType));
267 $tableColumnSubType = (isset($columnConfiguration[
'internal_type'])) ? $columnConfiguration[
'internal_type'] : NULL;
268 $columnMap->
setInternalType(\
TYPO3\CMS\Core\DataHandling\TableColumnSubType::cast($tableColumnSubType));
283 if (isset($columnConfiguration)) {
284 if (isset($columnConfiguration[
'MM'])) {
286 } elseif (isset($propertyMetaData[
'elementType'])) {
288 } elseif (isset($propertyMetaData[
'type']) && strpbrk($propertyMetaData[
'type'],
'_\\') !== FALSE) {
290 } elseif (isset($columnConfiguration[
'type']) && $columnConfiguration[
'type'] ===
'select' && isset($columnConfiguration[
'maxitems']) && $columnConfiguration[
'maxitems'] > 1) {
310 if (!empty($columnConfiguration[
'eval'])) {
312 $dateTimeEvaluations = array(
'date',
'datetime');
314 if (count(array_intersect($dateTimeEvaluations, $fieldEvaluations)) > 0 && !empty($columnConfiguration[
'dbType'])) {
337 if (is_array($columnConfiguration[
'foreign_match_fields'])) {
358 if (is_array($columnConfiguration[
'foreign_match_fields'])) {
374 if (isset($columnConfiguration[
'MM'])) {
379 if (is_array($columnConfiguration[
'MM_match_fields'])) {
382 if (is_array($columnConfiguration[
'MM_insert_fields'])) {
386 if (!empty($columnConfiguration[
'MM_opposite_field'])) {
396 throw new \TYPO3\CMS\Extbase\Persistence\Generic\Exception\UnsupportedRelationException(
'The given information to build a many-to-many-relation was not sufficient. Check your TCA definitions. mm-relations with IRRE must have at least a defined "MM" or "foreign_selector".', 1268817963);
413 return $this->objectManager->get(
'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Mapper\\ColumnMap', $columnName, $propertyName);
setRelationTablePageIdColumnName($relationTablePageIdColumnName)
const RELATION_HAS_AND_BELONGS_TO_MANY
setManyToManyRelation(ColumnMap $columnMap, $columnConfiguration)
resolveTableName($className)
static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=TRUE, $includeEmptyValues=TRUE, $enableUnsetFeature=TRUE)
setParentTableFieldName($parentTableFieldName)
resolveSubclassesRecursive(array $classesConfiguration, array $subclasses)
setFieldEvaluations(ColumnMap $columnMap, array $columnConfiguration=NULL)
setRelationTableMatchFields(array $relationTableMatchFields)
getColumnsDefinition($tableName)
setRelationTableName($relationTableName)
getControlSection($tableName)
setParentKeyFieldName($parentKeyFieldName)
addMetaDataColumnNames(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMap $dataMap, $tableName)
createColumnMap($columnName, $propertyName)
static underscoredToLowerCamelCase($string)
static trimExplode($delim, $string, $removeEmptyValues=FALSE, $limit=0)
setRelationTableWhereStatement($relationTableWhereStatement)
setOneToOneRelation(ColumnMap $columnMap, $columnConfiguration)
setDateTimeStorageFormat($dateTimeStorageFormat)
setRelationTableInsertFields(array $relationTableInsertFields)
setChildSortByFieldName($childSortByFieldName)
setChildKeyFieldName($childKeyFieldName)
setChildTableWhereStatement($childTableWhereStatement)
setChildTableName($childTableName)
if(!defined('TYPO3_MODE')) $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['logoff_pre_processing'][]
setTypeOfRelation($typeOfRelation)
setInternalType($internalType)
setRelations(ColumnMap $columnMap, $columnConfiguration, $propertyMetaData)
setOneToManyRelation(ColumnMap $columnMap, $columnConfiguration)
setType(ColumnMap $columnMap, $columnConfiguration)