TYPO3 und das Problem der Kern-Erweiterungen

TYPO3 ist bekanntlich ein mächtiges und extrem flexibles Content Management System auf Enterprise-Level. Geträu dem Motto »was nicht passt, wird passend gemacht« steht es prinzipiell jedem Entwickler frei sich mit eigenen Programmierungen einzubringen. Die Möglichkeiten sind auch hier vielfältig und können je nach persönlichem Erfahrungslevel gesteigert werden. Das geht vom einfachen Melden eines Fehler im Bugtracker über das Testen eines Bugfixes oder das eigenständige Lösen des Problems bis hin zu eigenen Erweiterungen am TYPO3-Kern.
Mit jedem Schritt steigen auch die Anforderungen an den Entwickler um ein gewisses Qualitätslevel sicher zu stellen.

team digital beteiligt sich schon lange an der aktiven Weiterentwicklung von TYPO3. Bei einem aktuellen Kundenprojekt ist es erforderlich Daten aus einer Datenbank zu holen, wenn eine bestimmte Domain aufgerufen wird. Zur leichteren Verwaltung im Backend wird hierbei der Domainrecord der jeweiligen Seite vom TYPO3 herangezogen. Über die Frontend-API wird leider keine UID des Domain-Datensatzes geliefert.

Es lag also nahe, diese eigentlich als »Nobrainer« anzusehende Sache direkt im Kern beheben zu lassen. Auf Grund verschiedener Umstände wird die von uns entwickelte und getestete Erweiterung nicht in den Kern aufgenommen. Sieist erstmal auf ungewisse Zeit nach hinten verschoben worden.

Wie so oft führen aber auch hier viele Wege nach Rom. Wir wählten einen anderen Lösungsansatz um einerseits mit der Entwicklung voran zu schreiten und um uns andererseits nicht die Updatefähigkeit des gesamten Systems zerstören.

Im Controller wird eine neue Instanz der abgewandelten TSFE-Klasse gebildet:

public function showAction(\TeamDigital\Extkey\Domain\Model\Journey $journey) {
  $TSFE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TeamDigital\Extkey\Utility\TypoScriptFrontendController2', $GLOBALS['TYPO3_CONF_VARS'], 0, 0);
  ...
}

Unsere abgewandelte Klasse erweitert schließlich einfach die entsprechende Methode der Elternklasse und schon haben wir unsere benötigte UID des Domain-Records.

class TypoScriptFrontendController2 extends \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController {

 /**
 * Fetches/returns the cached contents of the sys_domain database table.
 *
 * @return array Domain data
 */
 protected function getSysDomainCache() {
 $entryIdentifier = 'core-database-sys_domain-complete';
 /** @var $runtimeCache \TYPO3\CMS\Core\Cache\Frontend\AbstractFrontend */
 $runtimeCache = $GLOBALS['typo3CacheManager']->getCache('cache_runtime');

 $sysDomainData = array();
 if ($runtimeCache->has($entryIdentifier)) {
 $sysDomainData = $runtimeCache->get($entryIdentifier);
 } else {
 $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
 'uid, pid, domainName, forced',
 'sys_domain',
 'redirectTo=\'\' ' . $GLOBALS['TSFE']->sys_page->enableFields('sys_domain'),
 '',
 'sorting ASC'
 );

 while (FALSE !== ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result))) {
 // if there is already an entry for this pid, check if we should overwrite it
 if (isset($sysDomainData[$row['pid']])) {
 // there is already a "forced" entry, which must not be overwritten
 if ($sysDomainData[$row['pid']]['forced']) {
 continue;
 }

 // there is alread a NOT-forced entry and the current one is also NOT-forced, thus keep the old
 if (!$sysDomainData[$row['pid']]['forced'] && !$row['forced']) {
 continue;
 }
 }

 // as we passed all previous checks, we save this domain for the current pid
 $sysDomainData[$row['pid']] = array(
 'uid' => $row['uid'],
 'pid' => $row['pid'],
 'domainName' => rtrim($row['domainName'], '/'),
 'forced' => $row['forced'],
 );
 }
 $runtimeCache->set($entryIdentifier, $sysDomainData);
 $GLOBALS['TYPO3_DB']->sql_free_result($result);
 }
 return $sysDomainData;
 }
}

Die Änderungen sind jetzt in der TYPO3-Erweiterung gekapselt und das Kernsystem bleibt sauber und updatefähig. Es hätte einfacher sein können, aber so ist es eine saubere Lösung. Der Entwickler ist zufrieden und der Kunde natürlich auch. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.