/** * Resolve relations as defined in TCA and add them to the provided $pageRecord array. * * @param int $uid Page id * @param array $pageRecord Array with page data to add relation data to. * @throws \RuntimeException * @return array $pageRecord with additional relations */ protected function enrichWithRelationFields($uid, array $pageRecord) { $pageOverlayFields = GeneralUtility::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['FE']['pageOverlayFields']); foreach ($GLOBALS['TCA']['pages']['columns'] as $column => $configuration) { if ($this->columnHasRelationToResolve($configuration)) { $configuration = $configuration['config']; if ($configuration['MM']) { /** @var $loadDBGroup \TYPO3\CMS\Core\Database\RelationHandler */ $loadDBGroup = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\RelationHandler::class); $loadDBGroup->start($pageRecord[$column], isset($configuration['allowed']) ? $configuration['allowed'] : $configuration['foreign_table'], $configuration['MM'], $uid, 'pages', $configuration); $relatedUids = isset($loadDBGroup->tableArray[$configuration['foreign_table']]) ? $loadDBGroup->tableArray[$configuration['foreign_table']] : array(); } else { $columnIsOverlaid = in_array($column, $pageOverlayFields, true); $table = $configuration['foreign_table']; $field = $configuration['foreign_field']; $whereClauseParts = array($field . ' = ' . (int) ($columnIsOverlaid ? $uid : $pageRecord['uid'])); if (isset($configuration['foreign_match_fields']) && is_array($configuration['foreign_match_fields'])) { foreach ($configuration['foreign_match_fields'] as $field => $value) { $whereClauseParts[] = $field . ' = ' . $this->databaseConnection->fullQuoteStr($value, $table); } } if (isset($configuration['foreign_table_field'])) { if ((int) $this->languageUid > 0 && $columnIsOverlaid) { $whereClauseParts[] = trim($configuration['foreign_table_field']) . ' = \'pages_language_overlay\''; } else { $whereClauseParts[] = trim($configuration['foreign_table_field']) . ' = \'pages\''; } } if (isset($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'])) { $whereClauseParts[] = $table . '.' . $GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'] . ' = 0'; } $whereClause = implode(' AND ', $whereClauseParts); $whereClause .= $this->pageContext->deleteClause($table); $orderBy = isset($configuration['foreign_sortby']) ? $configuration['foreign_sortby'] : ''; $rows = $this->databaseConnection->exec_SELECTgetRows('uid', $table, $whereClause, '', $orderBy); if (!is_array($rows)) { throw new \RuntimeException('Could to resolve related records for page ' . $uid . ' and foreign_table ' . htmlspecialchars($configuration['foreign_table']), 1343589452); } $relatedUids = array(); foreach ($rows as $row) { $relatedUids[] = $row['uid']; } } $pageRecord[$column] = implode(',', $relatedUids); } } return $pageRecord; }
/** * Resolve relations as defined in TCA and add them to the provided $pageRecord array. * * @param integer $uid Page id * @param array $pageRecord Array with page data to add relation data to. * @throws \RuntimeException * @return array $pageRecord with additional relations */ protected function enrichWithRelationFields($uid, array $pageRecord) { foreach ($GLOBALS['TCA']['pages']['columns'] as $column => $configuration) { if ($this->columnHasRelationToResolve($configuration)) { $configuration = $configuration['config']; if ($configuration['MM']) { /** @var $loadDBGroup \TYPO3\CMS\Core\Database\RelationHandler */ $loadDBGroup = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\RelationHandler'); $loadDBGroup->start($pageRecord[$column], $configuration['foreign_table'], $configuration['MM'], $uid, 'pages', $configuration); $relatedUids = $loadDBGroup->tableArray[$configuration['foreign_table']]; } elseif ($configuration['foreign_field']) { $table = $configuration['foreign_table']; $field = $configuration['foreign_field']; $whereClauseParts = array($field . ' = ' . intval($uid)); if (isset($configuration['foreign_match_fields']) && is_array($configuration['foreign_match_fields'])) { foreach ($configuration['foreign_match_fields'] as $field => $value) { $whereClauseParts[] = $field . ' = ' . $GLOBALS['TYPO3_DB']->fullQuoteStr($value, $table); } } if (isset($configuration['foreign_table_field'])) { if (intval($this->languageUid) > 0) { $whereClauseParts[] = trim($configuration['foreign_table_field']) . ' = \'pages_language_overlay\''; } else { $whereClauseParts[] = trim($configuration['foreign_table_field']) . ' = \'pages\''; } } $whereClause = implode(' AND ', $whereClauseParts); $whereClause .= $this->pageContext->deleteClause($table); $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid', $table, $whereClause); if (!is_array($rows)) { throw new \RuntimeException('Could to resolve related records for page ' . $uid . ' and foreign_table ' . htmlspecialchars($configuration['foreign_table']), 1343589452); } $relatedUids = array(); foreach ($rows as $row) { $relatedUids[] = $row['uid']; } } $pageRecord[$column] = implode(',', $relatedUids); } } return $pageRecord; }