Kategorie: Programmierung

Custom content post procession for TYPO3

Compress or pretty print HTML output by your own

There are many HTML compression extensions for TYPO3 in the TER. Many of them aren't maintained anymore or just have a huge overhead, you will mostly not need for anything. So why not build a content compression by your own?

It's pretty easy to implement. Basically it just require the use of two Hooks from tslib/class.tslib_fe.php. The Hooks are called contentPostProc-all and contentPostProc-output. The first one handles normal pages with cached output, the second one does the same, just for uncached pages with COA or USER_INT objects. This Hooks will be bind to a class and function of your choice in ext_localconf.php of your extension.

read more ...

Zend Mail has problems with multiple BCC recipients

Reason and Workaround

In a project, we've discovered some strange behavior of Zend\Mail while trying to send a single message to multiple bcc recipients. If addressed multiple bcc (or even cc) recipients, only the first one would get the message delivered by the mail server. It took us quite a long time to figure it out and found a solution.

What Zend\Mail does

Well, to understand what Zend-Mail does in background let's assume a simple Message object, like this:

use Zend\Mail;

$mail = new Mail\Message();
$mail->setFrom('test@example.org', 'Sender\'s name');
$mail->addTo('daniel@example.com', 'Name of recipient');
$mail->setSubject('Test Subject');
$mail->setBody('This is the text of the email.');


$transport = new Mail\Transport\Sendmail();
read more ...

How to create an internal URI in TYPO3

Sometimes you want to generate TYPO3 internal URIs programmatically. Now you could try to create the URL manually on your own, or use the UriBuilder class. This handy tool is pretty neat to create any kind of internal URI. In a controller this class is available by $this->getControllerContext()->getUriBuilder(). If you want to use the UriBuilder somewhere else, you need to load an instance of the class by the ObjectManager.

$objectManager = 
$uriBuilder =

When you have access to an instance of the builder, it's pretty straight forward from now on. The class has a bunch of simple setters, to control the generation of the URI. Best practice is to reset all the options of the builder on start of every new URI creation.

read more ...

Overwrite the default layout in TYPO3

I'm pretty sure that many people search for this thing already. So did I. It took me quite a lot time to figure out, how to overwrite the default template in TYPO3 8.7. This layout comes with some annoying wrappings, like the new frames. So you may want to remove them too. When you know how, it's really easy to do. Just add a small part to your TypoScript setup.

lib {
  contentElement {
    layoutRootPaths {
      10 = EXT:page/Resources/Private/Layouts
read more ...

How to fully revert the most recent git commit

without using rebase

Sometimes, when I was too stupid to change the git configuration and pushed a commit with the wrong credentials again, I need to revert the most recent commit completely. And every time I have to do this, I need to search for the correct command.

So, for a short note: with the command below the last commit will be erased completely. Unlike a rebase, the commit can't be found in any branch from now on. More information can be found in this great post on Stack Overflow.

git reset --hard HEAD~1

Just great for all kind of mistakes. ;)


Counter Node für Node-RED


Es gibt wirklich unzählige Nodes als Erweiterung für Node-Red. Was es bisher aber nicht gab, war ein einfacher Zähler für Nachrichten-Pakete. Und genau sowas habe ich für mein Projekt benötigt. Also was blieb mir anderes über, als kurzer Hand eine solche Node selber zu schreiben?! ;)

Die Node ist mittlerweile öffentlich auf GitHub, npm und über die offizielle Node-Sammlung verfügbar und kann somit wie jede andere Node installiert werden.

npm install node-red-contrib-counter
read more ...

Why is the 'load' event not beeing executed after updating to jQuery 3?

The problem can be occur when using/switching to jQuery 3. It's because all ready states in the new jQuery 3 are now fully asynchron. This means, that there is no given order for your code to be executed.

Because of this, it could happen, that load is been triggered **before** your ready state has been executed. When your ready function now finally gets triggered, your load listener is too late and will not be executed.

read more ...

PHP: yield is here!

Und gibt uns so viel mehr zurück ...

Was freue ich mich über das Feature in php 5.5: yield! Gut, klingt jetzt erst mal als Wort nicht sonderlich spannend. Es ist zugegeben auch nicht sehr umfangreich, aber für mich als Entwickler ist die Möglichkeit eine super Ergänzung.

Was macht man normalerweise, wenn man eine Liste an eine andere Funktion übergeben will? In gefühlt 98% der Fälle wird ein mit einer Schleife ein Array erstellt, in einem 1% macht man vielleicht ein Objekt draus und im übrigen Prozent der Fälle überlegt man es vielleicht doch anders zu machen. Der Nachteil ist natürlich generell, dass ein Array oder Objekt im Speicher liegt. Habe ich also Daten, die ich dann noch in ein Array/Object umpacke, um es in einem bestimmten Format an eine andere Funktion zu übergeben, habe ich gleich wieder neue Daten im Speicher liegen. Und jetzt kommt yield ins Spiel!

Mit der neuen Rückgabeart kann prinzipiell return ersetzt werden, yield gibt dann sequenziell Daten zurück. In Schleifen verwendet können so einfach, und vor allem ohne den Speicher zu belasten, Daten zurückgegeben und weiter verarbeiten.

read more ...

Lazy 0.1.16 erschienen

Die neuste Version meines Plugins Lazy für jQuery ist vorhin auf GitHub erschienen. Die Changelog dazu ist eher überschaubar. Neben einer etwas ausführlicheren Beschreibung auf GitHub kam hauptsächlich ein neues Feature dazu, welches hoffentlich praktisch ist.

Mit dem neuen Callback onFinishedAll wurde ein neues Event hinzugefügt, welches einmalig nach dem laden aller Bilder aufgerufen wird. Hierbei spielt es keine Rolle, ob alle Bilder korrekt geladen, oder Teile nur fehlerhaft geladen werden konnten.

  onFinishedAll: function() {
    console.log('we're finished here!');
read more ...