Fluid – Sebastians Blog https://sgaul.de Neues aus den Softwareminen Fri, 19 Dec 2014 16:04:04 +0000 de-DE hourly 1 https://wordpress.org/?v=6.1.1 https://sgaul.de/wp-content/uploads/2019/02/cropped-sgaul-2-1-32x32.jpg Fluid – Sebastians Blog https://sgaul.de 32 32 Große Datenmengen mit Extbase verarbeiten https://sgaul.de/2011/11/17/grose-datenmengen-mit-extbase-verarbeiten/ https://sgaul.de/2011/11/17/grose-datenmengen-mit-extbase-verarbeiten/#comments Thu, 17 Nov 2011 16:21:04 +0000 https://sgaul.de/?p=728 Extbase ist an sich eine schöne Sache: Man kann mit relativ geringem Aufwand auch komplexe Anwendungen schreiben. Ein großes Problem ist jedoch die Effizienz. Das vollständige Auslesen von Objekten aus einer Datenbank in ein Array, um diese nachfolgend zu bearbeiten, ist speicherintensiv und merklich langsam. Möchte man einfach eine lange Liste an Logs ausgeben, fällt das besonders auf. Ich möchte hier einen eleganten Weg zeigen, wie man möglichst direkt jede Datenbankzeile in die Ausgabe schreibt.

Das Ziel

Wir möchten eine Liste von Logs im Browser anzeigen. Da Sortierung und Seiteneinteilung von Javascript übernommen werden, möchten wir direkt 1000 Zeilen der Datenbanktabelle in die HTML-Tabelle übertragen. Die Tabelle soll dabei möglichst schnell ausgeliefert werden.

Der Ablaufplan


  
    
    
    
      
    
    
      
    
    
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
  
  
  
    
      
        image/svg+xml
        
        
      
    
  
  
    
    Controller
    
    Fluid-Template
    
    ViewHelper
    
    IteratorRepository
    
    
    Table Data
    
    1
    
    2
    
    4
    
    5
    
      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    
    
    
    
    
    
    Table Row
    
    next()
    
    3
  

Nichts zu sehen? Zur PNG-Version.

Hinweis: Die Darstellung ist nicht ganz korrekt, da der Controller die gerenderten Daten des Templates zurückbekommt und diese in Richtung Ausgabe weiterleitet. Vielen Dank an Alex für diesen Hinweis.

Der Controller

Der Controller verliert in diesem Ansatz die Aufgabe, irgendwelche Daten für die Log-Tabelle zu besorgen. Er muss lediglich das entsprechende Template aufrufen und ggf. andere Jobs erledigen, die neben der Tabelle auf der Seite zu sehen sind.

Das Fluid-Template

Das Template gestaltet das Drum-Herum und ruft darin für die Log-Tabelle einen View-Helper auf. Zudem kann man als Inhalt des View-Helper-Tags ein Template vorgeben, in welchem der Helper nur Variablen ersetzen braucht. Hierfür muss man den allgemeinen Teil von dem trennen, der mit jeder Zeile wiederholt werden muss. Ein simpler Ansatz wäre etwa:


	
			
IDInhalt
%1$d%1$s

Das obige Variablenformat lässt sich dann direkt mit PHPs Sprintf-Funktion befüllen.

Der View-Helper

Dies ist die einzige Stelle, an der wie die kompletten Log-Daten zwischenspeichern. Dafür aber gleich im fertigen Ausgabeformat, so dass wir sie nicht noch einmal durcharbeiten müssen. Hierfür nehmen wir eine Singleton-Instanz des Iterator-Repositorys, iterieren über die einzelnen Zeilen der Datenbanktabelle und befüllen hiermit jeweils unser Template. Am Ende geben wir den so zusammengebauten Ausgabestring zurück.

Das Iterator-Repository

Das Repository implementiert das PHP-Iterator-Interface. Dies erlaubt es dem View-Helper, das Repository in einer Foreach-Schleife auszulesen. Der Rest ist relativ simpel: Beim Aufruf von rewind() und dem Konstruktor wird ein Query abgesetzt, das Result speichern wir in einem Klassenattribut, um es in anderen Methoden nutzen zu können.

$this->result = $GLOBALS['TYPO3_DB']->SELECTquery(/*...*/);

Hierbei sollte gleich darauf geachtet werden, dass möglichst viel Logik direkt in SQL erledigt wird. So kann man beispielsweise Datumsformate direkt im Query definieren.
Ein Aufruf von next() setzt ein Row-Attribut mittels

$this->row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($this->result);

Zu guter Letzt muss ein current() noch $this->row oder eine angepasste Variante davon zurückgeben.

Fazit

Die vorgegebenen Code-Schnipsel dienen der Verdeutlichung und sind nicht vollständig. Wenn man dem Ansatz jedoch folgt, kann man sehr direkt auf der Datenbank arbeiten, ohne die offizielle Vorgehensweise von Extbase wirklich zu verletzen.

]]>
https://sgaul.de/2011/11/17/grose-datenmengen-mit-extbase-verarbeiten/feed/ 6
Javascript und CSS in Extbase-Backend-Modul einbinden https://sgaul.de/2011/11/15/javascript-und-css-in-extbase-backend-modul-einbinden/ https://sgaul.de/2011/11/15/javascript-und-css-in-extbase-backend-modul-einbinden/#comments Tue, 15 Nov 2011 20:38:17 +0000 https://sgaul.de/?p=723 Leider sind Extbase und Fluid bis heute nicht wirklich flächendeckend dokumentiert und so ist es oft nicht gerade einfach auf eigentlich simple Fragen eine Antwort zu bekommen. So bietet Fluid für Typo-3-Backendmodule einen tollen Viewhelper, was dieser aber kann steht leider nirgendwo geschrieben.

BE-Gestaltung mit CSS-Datei

Um eine CSS-Datei einzubinden übergibt man dem Fluid-BE-Container einen weiteren Parameter:

<f:be.container
 addCssFile="{f:uri.resource(path:'CSS/style.css')}">
 <!-- Content -->
</f:be.container>  

Die obige Notation bindet dann Resources/Public/CSS/style.css aus eurem Extension-Verzeichnis ein.

Javascript

Mit Javascript geht es ebenso einfach:

<f:be.container
 addJsFile="{f:uri.resource(path:'js/scripts.js')}">
 <!-- Content -->
</f:be.container>

Der Code wird automatisch mit anderem JS zusammengefasst und komprimiert.

]]>
https://sgaul.de/2011/11/15/javascript-und-css-in-extbase-backend-modul-einbinden/feed/ 5