Alternativen MySql-View für Listen-Datensatz • MySql-View führt Daten aus mehreren Tabellen zusammen • Ergebnis ist eine Virtuelle Tabelle • Nutzbar wie normale Tabellen
Alternativen MySql-View für Listen-Datensatz Controller tx_mebigdataexample_domain_model_booklist - B.uid - B.pid - B.title - B.description - R.uid AS ref_uid - F.identifier AS file_id sys_file_refenrence AS R - uid sys_file AS F - identifier tx_mebigdataexample_domain_model_book AS B - uid - title - description - …
MySql-View für Listen-Datensatz # # Table structure for table 'tx_mebigdataexample_domain_model_booklist' # CREATE VIEW tx_mebigdataexample_domain_model_booklist AS SELECT b.uid, b.pid, b.title, b.description, sys_file_reference.uid as ref_uid, sys_file.identifier as file_id FROM tx_mebigdataexample_domain_model_book as b INNER JOIN sys_file_reference ON b.uid = sys_file_reference.uid_foreign INNER JOIN sys_file ON sys_file_reference.uid_local = sys_file.uid WHERE sys_file_reference.tablenames = 'tx_mebigdataexample_domain_model_book' group by b.uid order by b.sorting, sys_file_reference.sorting_foreign Anlage des Views
MySql-View für Listen-Datensatz Wildcard für Haupttabelle • automatisiert alle Spalten der Ursprungstabelle integriert • „images“ Spalte mit Anzahl der Bilder
MySql-View für Listen-Datensatz # # Table structure for table 'tx_mebigdataexample_domain_model_booklist' # CREATE VIEW tx_mebigdataexample_domain_model_booklist AS SELECT b.*, sys_file_reference.uid as ref_uid, sys_file.identifier as file_id FROM tx_mebigdataexample_domain_model_book as b INNER JOIN sys_file_reference ON b.uid = sys_file_reference.uid_foreign INNER JOIN sys_file ON sys_file_reference.uid_local = sys_file.uid WHERE sys_file_reference.tablenames = 'tx_mebigdataexample_domain_model_book' group by b.uid order by b.sorting, sys_file_reference.sorting_foreign Anlage des Views mit allen Spalten der Haupttabelle
MySql-View für Listen-Datensatz /** * Extract of the MySQL view repository */ class BooklistRepository extends Repository { private const ALLOWED_METHOD_PREFIX = 'find'; public function __call($methodName, $arguments) { if (self::ALLOWED_METHOD_PREFIX !== substr($methodName, 0, 4)) { throw new \BadMethodCallException( sprintf( 'You called method "%s". Only find methods are allowed!', $methodName ) ); } parent::__call($methodName, $arguments); } } Auszug aus dem Repository
Doctrine Doctrine • Datenbankabstraktionsschicht seit TYPO3 Version 8/9 integriert • Nutzung komplett unabhängig von der Repository-Struktur die Extbase bietet • Einsatz des QueryBuilders • Unabhängig vom jeweiligen Datenbank-System • Ergebnisse kommen als einfache Arrays zurück
Alternativen List-Model • Eigenes Model für Listen und Filteransichten • Weniger Abhängigkeiten bzw. Verzweigungen in der Objekt- Struktur • Beschränkung auf alle Informationen die in der Ansicht notwendig sind
List-Model use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings; /** * Repository for list entry */ class BookListEntryRepository extends Repository { public function initializeObject() { /** @var $querySettings Typo3QuerySettings */ $querySettings = $this->objectManager>get(Typo3QuerySettings::class); $querySettings->setLanguageMode('strict')->setRespectStoragePage(false); $this->setDefaultQuerySettings($querySettings); } } Auszug aus Repository
Caching Framework • Cache-Systeme Memcached, Database, Redis, … • Key/Value Zuweisung zwischen Cache-Identifikator und Wert • Weiterhin Tags und Lifetime als Parameter konfigurierbar Weiterführende Werkzeuge
Caching Framework protected function getCachedMagic() { $cacheIdentifier = $this->calculateCacheIdentifier(); $cache = GeneralUtility::makeInstance( \TYPO3\CMS\Core\Cache\CacheManager::class )->getCache('myext_mycache'); // If $entry is null, it hasn't been cached. Calculate the value and store it: if (($entry = $cache->get($cacheIdentifier)) === FALSE) { $entry = $this->calculateMagic(); // [calculate lifetime and assigned tags] // Save value in cache $cache->set($cacheIdentifier, $entry, $tags, $lifetime); } return $entry; } Einfacher Zugriff auf den Cache
Generierung des „Cache Identifier“ • Um „Cache Flooding“ zu vermeiden, sollten zur Generierung des Identifiers nur die Parameter hinzugezogen werden, die Einfluss auf den Inhalt des Cache-Eintrags haben Caching Framework