Snoop an argument from another action in TYPO3 plugin

Often times we have several plugins on a page that need to know the value of an action submitted to that page. The issue is that the message can only be directed to one plugin at a time. A common case would be a search field that is reused across the site, posting to a result list plugin. Now you want that searched value to be present in every search field – for example you have duplicates because of an output in a mobile menu.

Here is a nice and clean way without destroying the clean structure of your plugin action to retrieve the value of a foreign plugin action for your own action.

public function initialize<myActionName>Action()
{
if(!$this->request->hasArgument('<myActionArgument>')){
$foreignPluginArguments = \TYPO3\CMS\Core\Utility\GeneralUtility::_POST('<otherActionPluginName>');
if(!empty($foreignPluginArguments['<otherActionPluginName>'])){
$this->request->setArgument('<myActionArgument>', $post['<otherActionPluginName>']);
}
}
}

Here in this example we’ve used a POST action, but the same can be done for GET, just replace _POST with _GET. If you want to be more flexible how you retrieve the value you can also be bold an use _GP.

As long as your own action uses an argument of the same type, the TYPO3 framework will handle objects and validate them as usual. Your own action stay untouched by the interception.

Use a Generator to batch process TYPO3 repository entries

When processing too many entries in a TYPO3 extbase repository, you end up running out of memory because the persistenceManager clings to every processed entry, unless you clearState your way out of this mess. To work around this issue you can batch process the entries you are processing by making your nice list iteration ugly.

Generator to the rescue. Instead of doing the same work over and over again, obfuscating your clean code you can write a generic Repository-Trait that you can use for every occasion where you have to batch process all entries in your repository.

trait Batchable
{
    /**
     * @param int $batchSize
     * @param bool $clearState
     * @return \Generator
     */
    public function findAllBatched($batchSize, $clearState = true)
    {
        $count  = $this->findAll()->count();
        $offset = 0;

        if ($count > 0) {
            while ($count > $offset) {
                $objects = $this->findAllSelective($batchSize, $offset);

                foreach ($objects as $object) {
                    yield $object;
                }

                $offset += $batchSize;

                if ($clearState) {
                    $this->persistenceManager->persistAll();
                    $this->persistenceManager->clearState();
                }
            }
        }
    }

    /**
     * @param int $limit
     * @param int $offset
     * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface
     */
    public function findAllSelective($limit = null, $offset = null)
    {
        $query = $this->createQuery();

        if (isset($limit)) {
            $query->setLimit($limit);
        }
        if (isset($offset)) {
            $query->setOffset($offset);
        }

        return $query->execute();
    }
}

This can be further improved by providing a callback instead of using the findAllSelective specifically giving you the ability to batch-process every kind of database query, but I leave this in a more simple state for this example.

Now all you have to do — including adding the use statement for the Trait to your Repository — to process every single entry in your whole repository without running the risk of running out of memory is:

foreach($this->myRepository->findAllBatched(50) as $entry){
    // Do horrible, horrible things to the poor $entry
}

Create hreflang tags in TYPO3 with FLUID

I was looking for a clean, simple and performant way to generate hreflang tags in the TYPO3 headerData. Most methods I’ve found online concentrate on generating the tags by using a Typoscript language HMENU. Since our team at Koch Kommunikation has switched over to using MenuProcessor instead of HMENU a while ago, I wanted to find a FLUID based approach and came up with the following.

Adding hreflang to headerData

page.headerData{
    104 = FLUIDTEMPLATE
    104 {
        file = EXT:your_distribution/Resources/Private/Templates/HrefLang.html
    }
}

Option A: Reusing your MenuProcessor based language menu

Assuming you already have a MenuProcessor which generates a language menu for you, you can pass that to the headerData FLUID-Template.

page.headerData.104.dataProcessing.10 < page.10.dataProcessing.30

Option B: Creating a MenuProcessor language menu

If you don’t have a language menu already, you can create one.

page.headerData.104 {
    dataProcessing {
	10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
	10 {
		special = language
                // List of language ids that should be checked and outputted in hreflang
                addQueryString = 1
                addQueryString {
                    exclude = id, L, cHash
                    method = GET
                }
		special.value = 0,1,3
		as = language
	}
    }
}

The FLUID Template

The FLUID-Template code below will generate a hreflang tag for all languages of the present document, that have an existing translation. I am using the language file of the distribution to generate the correct locale for the given language id, but you can choose any method you like. We usually have to handle four languages and have standardized the ids, their handling etc.

<html xmlns:f="https://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">
    <f:for each="{language}" as="langItem">
        <f:if condition="{langItem.available}">
            <link rel="alternate" hreflang="{f:translate(key:'LLL:EXT:your_distribution/Resources/Private/Language/locallang.xlf:language.{langItem.languageUid}.locale')}" href="{langItem.link}" />
        </f:if>
    </f:for>
</html>

That is all there is to it. Now your TYPO3 will generate the appropriate hreflang tags for the page it displays.

EDIT: changed the condition to only show other languages to show all and added addQueryString to the language menu, so the link will include parameters for plugins like news etc. – thanks for the notice by Sebastian Klein

Cimmeria – Gedichtübersetzung Robert E. Howard

Cimmeria

Ich erinnere mich
Wie dunkle Wälder über den Abhängen düsterer Berge lagen;
Der grauen Wolken ewig bleiernes Gewölbe;
Der trüben Ströme, die tonlos dahinflossen,
Und der einsamen Winde, die Gebirgspässe hinabflüsterten.

Horizont an Horizont folgend, Berge nach Bergen,
Abhang hinter Abhang, jeder verdunkelt durch düstre Bäume,
so lag unser hagres Land. Wenn also ein Mann empor stieg
Einen schroffen Gipfel und schaute, sah sein Auge aus dem Schatten
nur endlosen Horizont – Berge nach Bergen,
Abhang hinter Abhang, jeder vermummt wie seine Brüder.

Es war ein graues Land, scheinbar erfüllt von
Allen Winden und Wolken und Träumen, die die Sonne scheuen,
Mit nackten Ästen, knarrend in einsamen Winden,
Und den finstren Waldgebieten, die alles einnahmen,
Nichteinmal erleuchtet durchs seltene, trübe Sonnenlicht
Das kauernde Schatten aus Menschen formte; sie nannten es
Cimmeria, Land der Schatten und ewiger Nacht.

Es war so lange her und so weit fort
Ich habe vergessen bei welchem Namen man mich rief.
Die Axt und stein-bewehrter Speer sind wie ein Traum,
Und Jagd und Kriege sind Schatten. Ich entsinne mich
Nur der Ruhe dieses finstren Landes;
Der Wolken, die sich ewig über Hügeln erstreckten,
Der Düsternis der ewigen Wälder.
Cimmeria, Land der Schatten und der Nacht.

Oh Seele mein, geboren aus düstren Bergen,
Den Wolken und Winden und Geistern, die die Sonne scheuen.
Wie vieler Tode bedarf es, um mich endlich
Dieses Erbes zu entledigen, das mich in graue
Kleider von Geistern hüllt? Ich erkunde mein Herz und entdecke
Cimmeria, Land der Schatten und der Nacht.

Conan 2d20 rules introduction with an animated story video

I am a fellow role-player and Conan fan, so it should come as no surprise that I was following the Kickstarter campaign for the Mödiphiüs Conan 2d20 roleplaying game.

The Kickstarter campaign for Mödiphius’ Conan 2d20 Roleplaying has been on a roll since it’s beginning, barbariously slaying stretch goals left and right. But I felt something was missing from the campaign, a visual introduction to the quick and savage rules of the Conan 2d20 system. To illustrate the world aspect of the Hyborian Age I’ve used Screenshots from the first quest of the MMORPG Age of Conan, animated and underpinned by a narrator telling a short story.

If you were still on the fence about the project because of the rules, check out this video and you’ll get an easy, visual grasp of how simple the rules really are in practice compared to how complex they sound on paper. I hope you also enjoy the short video and leave a comment on the video.

Quo vadis HEMA? Historischer Schwertkampf die moderne Kampfkunst!

Seit fast einem Dreiviertel Jahr bin ich nun schon dem historischen Schwertkampf verfallen. Währenddessen habe ich die Vereinspräsenz überarbeitet, ein neues Logo gestaltet, diverse lustige facebook-Aktionen angestoßen, um den Verein weiter zu bewerben und im Verlauf der letzten Wochen einen kleinen Trailer für den Verein zusammengestellt, auf den ich schon ein bisschen stolz bin.

Es ist das erste Mal, das ich echte Kameraufnahmen gemacht und dann zu einem Gesamtwerk kombiniert habe. Dabei geholfen hat ein iMovie-Template, das schon Themen, Musik und die Text-Plates vorgefertigt geliefert hat. Ich habe also reichlich Aufnahmen gemacht und dann aus diesen vielen Aufnahmeschnipseln, die richtigen an die richtige Stelle im iMovie-Template geschoben, einen passend dramatischen Texte für die Plates verfasst, Ende und Anfang durch meine eigenen Plates ersetzt und voila, fertig ist der HEMA-Trailer für die Hohentwieler Klingenkunst.

Die historische Fechtkunst ist keineswegs ein antiquiertes Geprügel mit Blankwaffen, sondern in den meisten Vereinen, besonders in der Hohentwieler Klingenkunst am Bodensee, ist es eine moderne Kampfkunst, die nach allen Regeln der Kunst unterrichtet wird. Wir trainieren nicht in alten Fetzen, sondern wie man im Trailer unschwer erkennen kann in moderner Trainingskleidung in einer Turnhalle. Nichtsdestotrotz sind alle Techniken detailliert auf historische Vorbilder zurückzuführen und von erfahrenen Fechtern im Laufe der letzten dreißig Jahre rekonstruiert worden. Eine verloren geglaubte, europäische Kampfkunst wurde so wieder zum Leben erweckt und lädt uns alle ein ihre Wurzeln und damit unsere Wurzeln neu zu entdecken und zu begründen.

Wo wir Europäer verzweifelt versuchen den Weg des Bushido zu gehen, passt vielleicht gerade die europäische Kampfkunst aus dem Herzen unserer Heimat viel besser zu uns und wir finden auch so einen besseren Zugang zu ihr; denn wie jede Kampfkunst bildet auch das Fechten nach europäischem Vorbild den Charakter und dieser Aspekt war schon im Mittelalter essentieller Teil der Ausbildung an der Waffe. Es gehörte zum Guten Ton für jeden Jüngling – damals waren es größtenteils Männer, heutzutage sind natürlich gerne Frauen bei uns willkommen – Disziplin, Körperbeherrschung und geistige Flexibilität an der Waffe zu erlernen. Was damals galt ist auch heute noch gültig. Man entdeckt nicht nur ein Sportgerät, sondern lernt auch sich und sein Gegenüber besser kennen, man entdeckt sich selbst.

Rollenspiel oder rollen Spiel?

Ein interessanter Artikel auf Mhaires Blog hat mich dazu bewogen auch mal meine Meinung zum Thema “Regeln im Rollenspiel” niederzuschreiben. Seit ich zarte elf Jahre zähle, spiele ich nun schon diverse Rollenspielsysteme und habe mir über die Jahre immer wieder auch über die Systeme als solches viel Gedanken gemacht. Gamedesign außerhalb von Optimierungsversuchen und Min-Maxerei und diverse Artikel später, habe ich für mich folgende Schlussfolgerungen gezogen:

Auch wenn es für mich beim Rollenspiel nicht nur ums Spiel mit der Rolle, sondern auch das rollende Spiel mit dem Würfel geht, so stehe ich eindeutig auf der regelarmen Seite des Ufers.

Heruntergebrochen auf das Gamedesign bzw. den Grund, ist die Ursache für die Einführung eines Würfels keineswegs eine Frage der Simulation, wie die DSA-Fanatiker meist hervorheben, oder eine möglichst “realistische” (ich kriege diese Anführungszeichen nicht weg, egal wie sehr ich auch im Kopf radiere) Darstellung der Welt; sie ist ein zufallsbasierter Sozialpuffer zwischen den Spielern und dem Meister. Diese vielseitigen Helferlein sorgen am Ende nur für einen Sündenbock, den Zufall.

Natürlich ruft der Meister oder die Situation an sich zu einer Probe auf – wodurch, wie dem aufmerksamen Spieler sicher schon aufgefallen ist, das ganze Simulieren sowieso flöten geht, da der Meister den Zeitpunkt bestimmt/beeinflusst – aber da der Meister die Situation vollständig konstruiert, kann er alles so einfach oder schwer machen wie er es will. Um Fairness geht es also per Definition schon mal nicht. Um Simulation auch nicht, da der Meister die Welt nicht erwürfelt bzw. simuliert.

Wenn man durch ehrliche Reflexion mal an diesem Punkt angekommen ist, wird es auch klar, wieso ein Regelwerk eben nicht versuchen muss die Welt bis aufs Atom herunter mit Wahrscheinlichkeiten und unwahrscheinlich komplizierten Würfelproben zu versehen. Das Regelwerk muss nur an entsprechenden Stellen so wenig Puffer wie möglich, aber so viel wie nötig zwischen die Spieler und den Meister stopfen. Ein Regelwerk, das diesem Ziel gerecht wird nennt man dann spielbar.

Auf der anderen Seite haben wir Systeme – ich schaue dich mit stierem Blick an DSA Regelwerk – die sich im Zahlen und Ausnahmenwirrwarr verlieren. Bei denen ein Abend selbst mit erfahrensten Regelkennern zur Nachschlagorgie und Regelfuchserei wird. Ein System, das schon statistisch die Spielfiguren zu hilflosen Trotteln degradiert, bei dem der Meister durch das einfache Verlangen einer Probe auch bei erfahrenen Helden ein Scheitern erschreckend wahrscheinlich provozieren kann.

Ich habe DSA weit über zehn Jahre leidenschaftlich gespielt. Die Regeln standen uns dabei immer maximal im Weg, sie haben jeden Spielabend aufs Neue für alle zur Tortur werden lassen. Wir kannten es nicht anders; wir fügten uns der allgegenwärtigen Gewalt der Bücher und Regeln, geführt von einem Regelextremisten wie er im Buche steht.

Dann kamen die anderen Systeme. Neugierig schaute man über den Tellerrand hinaus, man schnupperte, schnüffelte und bekam da diesen Duft in die Nase, dieses Aroma von Spielbarkeit, von Spielfluss; Regelwerke von Systemen wie Vampire, Shadowrun, Savage Worlds und vielen anderen stellten schon im eigentlichen Regelwerk die Regeln hintenan. Man musste sich tatsächlich erst durch seitenweise atmosphärische Texte lesen, bevor einen die ersten Zahlen belästigten. Ich habe seit dieser Zeit nicht mehr zurück gesehen.

Aventurien ist immer noch meine rollenspielerische Herkunft und die Sicht auf Fantasy, alle fantastischen Kreaturen ist durch keinen Welthintergrund mehr geprägt. Diese Prägung macht es mir auch jedesmal wieder schwer, wenn ich an die Abende zurück denke, die großartigen Abenteuer, die komplexe Welt – nicht die Regeln – die mich als Kind verzauberten. Aventurien ist ohne Frage die detaillierteste Spielwelt aller Zeiten und bietet so viele Ecken und Kanten, dass man sich nicht nur ein Leben lang darin vergraben, sondern auch spannend daran reiben kann. Jede Minute, die diese wundervolle Spielwelt von pseudokomplexen (denn komplex sind sie nur durch Ausnahmen, nicht durch strukturelle Komplexität) Regelwerken genötigt wird sind verlorene Minuten an wertvoller Spiel- und Lebenszeit.

Ich hoffe, auch wenn die Hoffnung nur noch gering ist, dass DSA 5 wenigstens einen Babyschritt in die richtige Richtung nimmt und das System endlich entschlackt, oder ich habe die Hoffnung auf weitere vergnügliche Stunden mit DSA, in der Welt von Aventurien verloren.

Shadowrun Returns – Cyberpunk und Fantasy

In letzter Zeit versuche ich wieder einen Weg ins Pen & Paper Rollenspiel zu finden. Leider gibt es nur wenige Spieler in der Gegend, mit denen ich gerne spielen würde. Ich werde langsam einfach alt und stelle es mir komisch vor mit jungen Studenten zu spielen. Vor allem hätten die wohl mehr Zeit als ich. Aus diesem Grund widme ich mich erneut der Let’s Playerei nach einer sechs-monatigen Pause.

Wie schon vor sechs Monaten geplant wollte ich gerne das Rollenspiel Shadowrun Returns spielen, da es wirklich toll geschrieben ist, Shadowrun eine wirklich spannende Welt bietet und ich auf Old-School Rollenspiele stehe. Leider verzögerte sich die Übersetzung ins Deutsche um mehrere Monate. Inzwischen hat praktisch jeder Let’s Player schon zugeschlagen, das Spiel gespielt und die Zuschauer haben kein Interesse mehr. Trotzdem wollte ich warten, bis die deutsche Übersetzung vorhanden ist, da ich mir die Zeit nehmen wollte und das ganze Spiel vorspielen wollte mit Sprachausgabe.

Normale Let’s Plays stellen schon eine Herausforderung dar, aber on-the-fly Charaktere erdenken und ihnen eine möglichst konsistente Stimme zu verleihen war eine echte Herausforderung. So habe ich das Spiel in zwei langen Sitzungen am Wochenende durchgespielt und aufgenommen. Das Ergebnis, den Anfang der gesamten Reihe könnt ihr hier begutachten:

Let’s Play! Eine neue Aufgabe!

Lasst uns spielen! Eine Aufforderung aber auch eine Bitte. Lasst uns bitte spielen. Hindert uns nicht daran. Wir spielen und wollen es auch weiter tun. Gemeinsam.

In den letzten Jahren hat sich die Let’s Play Gemeinde stark vergrößert, getrieben zum einen von der Aufmerksamkeit, der Öffentlichkeit des Ganzen und zum anderen von der scheinbaren Goldgrube für Youtube-Partner. Wie auch beim Microstock-Hype, hält sich der wahre finanzielle Nutzen in deutlich ausgezeichneten Grenzen, die weit von dem entfernt sind, was sich glänzende, geldgierige Augen versprechen. Was also motiviert so viele Youtuber Tag ein, Tag aus ihre Videos hochzuladen, Zeit und Geld zu investieren und sich in der Community zu beteiligen?

Seit einem Monat bin ich dabei. Seit einem Monat versuche ich mein bestes und veröffentliche regelmäßig Let’s Plays auf Youtube. Und seit einem Monat weiß ich warum es so viele von uns gibt. Es macht einfach Spaß. Vielleicht sogar noch ein bisschen mehr Spaß, als die Spiele einfach nur so zu spielen. Erinnerungen an Szenen in den Spielen bleiben länger im Gedächtnis und bei manchen Spielen lacht man hinterher zusammen mit seinen Zusehern in den Kommentaren über aberwitzige Situationen. Zuschauer schreiben einem PMs mit Verbesserungsvorschlägen, Lob, Anregungen und Anfragen zur Zusammenarbeit. Die Feedback-Loop Rückmeldeschleife motiviert einen weiterzumachen, weiterzuspielen und sich und seine Videos weiter zu verbessern. Bei kaum einem Spiel geht das so gut wie bei Minecraft.

Zwar gibt es Let’s Plays zu jeder Art von Spiel, jedoch eignen sich gerade Freiformspiele zu dieser Form des kreativen Ausdrucks. Dort kann man nicht nur im Spiel selbst die eigene, verwirrte Persönlichkeit zum Ausdruck bringen, sondern ist auch im Kommentar und in der Gestaltung der Folgen frei genug, um das immer wieder gleiche Spiel so unterschiedlich zu gestalten, wie die Persönlichkeiten der Menschen dahinter. Zwar wird in diesem Fall ein Gruft-Let’sPlay von Minecraft mit einem ewig jammernden, schwarz geschminkten Gesellen weniger Erfolg haben, da die meisten LP-Zuschauer doch vor allem unterhalten werden wollen, aber der Freiraum zur Gestaltung ist doch enorm. Aus diesem Grund habe auch ich mich Minecraft gewidmet und folge damit nicht nur einem “Trend”, sondern vor allem den eigenen Vorlieben. Ich spiele Minecraft schon seit der frühen Pre-Alpha und bin seit über zwei Jahren auch großer Fan von unterschiedlichsten Minecraft LPs auf Youtube. (Gronkh, Vareide, AntVenom, usw.)

“Wenn sich eine Tür schließt, dann öffnet sich irgendwo ein Fenster”

Was macht man, wenn man gar nicht weiß, welches Fenster sich öffnen soll; wenn es zu viele Fenster gibt und hinter keinem versteckt sich die Aufgabe, nach der man gesucht hat? Im Verlauf der letzten Jahre hat sich mein Job zu meiner Berufung entwickelt und alles andere in meinem Leben verdrängt. Selbst das Computerspielen trat in den Hintergrund. Nachdem mir nach fast fünf Jahren bei Funcom und der überraschenden Entlassung (wirtschaftliche Gründe), irgendwie die Aufgabe genommen wurde, und mein persönliches Glück nicht nur durch die Arbeitslosigkeit einen großen Knick gemacht hat, bin ich jetzt wieder auf eine andere Weise Teil der Spielergemeinde (und Arbeitergemeinde, dank Anstellung seit dem 1. Februar). Nur diesmal auf Seiten der Teilnehmer. Da Teilnehmer von Teilen kommt, werde ich meinen Wirrkopf und tolle Spiele mit euch teilen.

If Apple copied the Swiss railway clock design, they didn’t do it well

Since these news have been filling the Swiss newspapers, I thought I’d take a look at the topic in a little more detail. SFR claims, that Apple stole their iconic design of the simple, rudimentary Swiss railway clock designed in the 1940’s. I’d say if they did, they didn’t do it well.

The similarities

  • White background
  • Black numbering
  • Red second hand, with a dot at the tip

The differences

  • Length of hands
  • Width of hands
  • Thickness of minute strokes
  • Length of minute strokes
  • Shape of hands
  • Difference in hands thickness

Why do I say they didn’t copy it well? The differences that they didn’t copy are what make the Swiss clock so well designed for its purpose. The hands are subtly shaped to point in the pointing direction, while the Apple version are perfectly straight, not guiding the eye. The hour hand is thicker, so the eye immediately finds it. The minute strokes are thick, so they can be read from afar and the hands are longer and reach farther into the minute markings, so there is never any doubt what stroke they are pointing too.

All in all Apple didn’t copy all those qualities of the original, they just used a generic basic clock design, that’s been around for ages and put it on the phone app. They didn’t apply even remotely the same attention to detail the original designer did. If they stole the design, they should get a better eye doctor, because they kind of missed all the important usability points of the original design.