4. Worum geht’s eigentlich?
Austausch von Belegdaten im Extranet:
Zahlungsfälligkeiten
Kontoauszüge
Belege & Buchungshilfe
Zahlungsavise
Umsatzstatistik
Belege stehen als pdf/ZIP-Datei zur Verfügung.
Alle Daten: drucken, exportieren, herunterladen
5. Was war los?
Viele Requests
Spalten ausblenden
Sortieren
Geschwindigkeit (5 bis 35 Sekunden)
Alte Programmierung (piBase)
Nicht mehr wartbar
Schnuckelig → groß → größer → kaputt
6. Das Projekt
Ehrlich: Kunde wünschte Extbase
Implementierung neuer Features
Flüssigeres Arbeiten (Geschwindigkeit)
Weniger SOAP-Abfragen
Besseres Dokumentenmanagement (pdf/zip)
9. KE: QueryObjekt
class Tx_KeZr_Persistence_Query extends
Tx_Extbase_Persistence_Query {
protected $groupBy = array();
public function setGroupBy(array $columns) {
$this->groupBy = $columns;
return $this;
}
10. KE: Typo3DbBackend
class Tx_KeZr_Persistence_Storage_Typo3DbBackend
extends
Tx_Extbase_Persistence_Storage_Typo3DbBackend {
public function
parseQuery(Tx_Extbase_Persistence_QueryInterfac
e $query, array &$parameters) {
...
$this->parseGroupBy($query->getGroupBy(),
$source, $sql);
...
}
public function buildQuery(array $sql) {
...
if (!empty($sql['groupBy'])) {
12. Cache-Objekt
public function __construct() {
parent::__construct();
$this->initializeCache();
}
public function initializeCache() {
t3lib_cache::initializeCachingFramework();
try {
$this->cache = $GLOBALS['typo3CacheManager']-
>getCache('keZr');
14. Soap-Objekt
public function SfGetSuppliers($dNr,
$enableColHeader = false) {
$this->initialize();
if(!empty($dNr)) {
if($this->cache->has('suppliers' . $dNr)) {
return $this->cache->get('suppliers' .
$dNr);
} else {
$parameters = array(
new SoapParam($this->getPassPhrase(),
15. Fluid Probleme
f:format.date mit @timestamp
Datum verschiebt sich um eine Stunde
f:format.currency
Ein leerer String benötigt 24ms
Ein Floatwert wie 0.00 benötigt 1ms
16. Fluid ViewHelper
DurationViewHelper
Wie lange (in ms) benötigt ein Fluidabschnitt?
GetValueOfObjectViewHelper
Da {invoice.{field}} nicht geht.
Timestamp2DateTimeViewHelper
@timestamp erzeugt falsche Datumswerte
SumColsViewHelper
Summiere bestimmte Felder in einem Array/Objekt
19. FED ViewHelper
SwitchViewHelper
+1000 um den in den Fluidcore zu integrieren
IfViewHelper
Alles möglich: &&, ||, Stringvergleiche
ExplodeViewHelper
CSV ==> Array
20. AJAX
Danke an Alex Kellner
http://pastebin.com/pdYZLjGn
Configuration erstellen
Neuer Bootstrap
Action und Controller angeben
Extbasebasiert weitercoden...
22. OOP
Jeder erdenkliche Bereich hat ein eigenes Objekt
Zeilen pro Methode drastisch reduziert
Teilweise sogar mit TDD (phpUnit)
Used the extbase way
Teilbereiche 3mal neu programmiert
Alle Views erben von einer abstrakten Klasse
Alle Repositories erben von abstrakter Klasse
23. Modelle
Trotz 1 Tabelle 13 Modelle
Für jede Gruppierung ein Modell
Filter mit Selectboxen
Modelle bauen sich gegenseitig auf (extends)
24. Sicherheit
Used the extbase way (Validatoren)
Per TS konfigurierbare Filter pro View
Inkl. DB-Abfrage
download {
varType = string
queryType = equals
required = 1
override = NULL
}
25. Sicherheit GET/POST
public function getConstraint($for, $value) {
$filterSettings = $this->settings['filter'];
$property = $filterSettings[$for]['property'] ? $filterSettings[$for]['property'] : $for;
if($filterSettings[$for]['required'] && empty($value) ||
$for == 'posStatus' && $value == '1') return false;
switch($filterSettings[$for]['varType']) {
case 'array':
if(!is_array($value)) throw new Tx_Extbase_Exception('The requested GET/POST var has the wrong var type',
1331648203);
break;
case 'int':
case 'integer':
$value = intval($value);
break;
case 'date':
if(!$value instanceof DateTime) {
$value = $this->date->createDateTimeFromString($value);
}
break;
case 'string':
case 'text':
if(is_string($value)) {
$value = htmlspecialchars($value);
}
break;
Default:
...
}
$query = $this->createQuery();
if($filterSettings[$for]['negate']) {
26. Dynamik
Jede Spalte pro Ansicht per TS konfigurierbar
Alternativ stdWrap zubuchbar
DirectReturn
Eigene Variablen definierbar
Class, enabled, isCurrency, isSumable
Jeder Filter als Partial verfügbar (TS)
27. Dynamik per TS
k_name1 {
enabled = 1
field = kName1
directReturn = 1
}
sum_nettobetrag {
enabled = 1
field = sumNettobetrag
isCurrency = 1
28. Usability
Ausgeblendete Spalten ohne Neuladen
Dank AJAX dauerhafte Speicherung
Sortieren ohne Neuladen
Ähnliche Filter werden übernommen
CSV-Export Dank JS (DataTables)
Schneller PDF-Export Dank PreCaching (Redis)
29. Wartung
Viele Arbeiten direkt über TS möglich (1223)
Dank Struktur schnelles Auffinden der richtigen
Stelle möglich
Einfache Erweiterbarkeit. 1 View = 1 Stunde
+ individuelle Anpassungen :-)
TDD
30. MySQL
Erstellung von 5 Indizies
35 Sekunden ==> 1,5 Sekunden
Filesorts vermieden bzw. konfiguriert
Analysiert mit set profiling=1
1 Woche MySQL-Konfiguration
Inkl. Strukturänderungen
Text ==> tinytext ==> varchar/char
Int ==> tinyint oder int(2)
32. Fazit
Die meisten Ansichten lassen sich in unter 3
Sekunden darstellen. Je nach Filter kann es bis
zu 8 Sekunden dauern
Die meisten Wartungsarbeiten lassen sich binnen
15-30 Minuten erledigen
Erweiterungen/Zusatzwünsche lassen sich Dank
Modularität und Struktur besser implementieren
33. Wir können Extbase!!!
1 Großprojekt
Mehrere kleine individuelle Extbaseextensions
3 Extbaseprofis und es werden mehr
Doku von Stefan Frömken wird Vorlage für
extbase.typo3.org
34. Danke ...
für's Zuhören
für Rückfragen
für Applaus
an die Community
an die TYPO3-Entwickler
an das Catering :-)
Magnus Schubert & Stefan Frömken | www.kennziffer.com GmbH