Skip to content

Symfony2 Tipps und Tricks (2)

Alle Beiträge dieser Serie sind unter dem Tag sf2tt zu finden.

Weiter geht's also mit meiner kleinen Reihe "Symfony2 Tipps und Tricks". Heutiges Thema sind Formulare und Subformulare, auch bekannt als Embedded Forms, und insbesondere deren Validierung. Lest vorher am besten auch das Cookbook-Kapitel "How to Embed a Collection of Forms"(http://symfony.com/doc/current/cookbook/form/form_collections.html), um eine noch bessere Vorstellung von den ineinander geschachtelten Formularen zu bekommen.

Die Problemstellung

Häufig dienen Formulare der Bearbeitung von Daten, die aus der Datenbank kommen. Das geht auch sehr einfach, indem man eine Entity in ein entsprechendes Formular hineingibt. Allerdings muss die Entity ja nicht zwingend über ORM einer DB-Tabelle entsprechen. Entities können auch einfache Objekt sein, die Daten enhalten. Das kann schon mal sinnvoll sein, wenn man Werte aus vielen DB-Feldern zusammenziehen und anzeigen möchte.

Wie im Handbuch beispielhaft gezeigt, wird der Formtyp CategoryType ins Formular TaskType "eingebettet". Entsprechend ist Category ein Attribut von Task. Was aber, wenn statt Category ein Array von Kategorien möglich ist? Dann reicht der vorgeschlagene Constraint @Assert\Type(type="Acme\TaskBundle\Entity\Category") nicht aus bzw. die Validierung schlägt fehl, weil ja ein Array von Category-Objekten erwartet wird.

Die Lösung

Hier kommt der Valid Constraint ins Spiel. Denn sollen alle Entities Category im Array zusammen mit Task über das Formular TaskType (und das Subformular CategoryType) validiert werden, muss gewährleistet sein, dass die Validierung auch für diese greift. Das geschieht leider nicht automatisch, sondern erst, wenn das explizit verlangt wird.

namespace Sperrobjekt\Sf2ttBundle\Entity;</p>

<p>use Doctrine\ORM\Mapping as ORM,
    Sperrobjekt\Sf2ttBundle\Entity\Category;</p>

<p>/**
 * @ORM\Table(name="task")
 * @ORM\Entity
 <em>/
class Task
{
    /**
     * Array mit Kategorien vom Typ Category
     *
     * @var Category[]
     *
     * @Assert\Valid()
     */

    protected $categories;
    /</em> ... */
}

Damit wird auch das Unterformular bzw. die entsprechende Entity ganz normal validiert. Idealerweise werden Validierungsfehler noch mittels error_bubbling an das "obere" Formular durchgereicht.

Ich hoffe, das war verständlich beschrieben, und meine Lösung ist auch korrekt. Jedenfalls funktioniert es für mich damit. Ich bin aber immer für Verbesserungsvorschläge in den Kommentaren offen; schließlich gibt es auch bei Symfony2 meistens nicht nur einen Weg zum Ziel ;-)

Symfony2 Tipps und Tricks (1)

Ende letzten Jahres habe ich mein erstes Projekt mit dem (immer noch) relativ jungen PHP-Framework Symfony2 begonnen und war schnell davon begeistert. Symfony2 bringt einige für die PHP-Welt sehr moderne Eigenschaften mit, etwa das Arbeiten mit Annotations, Dependency Injection, Scaffolding, Datenvalidierung über Constraints und ein eigenes Caching-System (vieles davon ähnelt nebenbei bemerkt Django). Weil Symfony2 heute schon produktiv einsetzbar ist, ist es den anderen beiden großen PHP-Frameworks, Zend2 und FLOW3, um eine Nasenlänge voraus.

Symfony2 Tipps und Tricks

Viele Features sind äußerst angenehm, und ich möchte sie nicht mehr missen. Anderes ist gewöhnungsbedürftig, und es dauerte jeweils seine Zeit, bis ich herausgefunden hatte, wie es zu realisieren ist - und mögen es auch nur Kleinigkeiten gewesen sein. Diese Aspekte möchte ich hier im Blog in einer kleinen Serie festhalten, die ich "Symfony2 Tipps und Tricks" (sf2tt) genannt habe; sei es, damit andere davon profitieren können, sei es, damit ich selbst meine Kniffe schnell wiederfinden kann. Wenn ich übrigens Symfony2 sage, meine ich manchmal auch Doctrine2 (das standardmäßige ORM-Layer), Twig (die standardmäßige Template-Engine) oder ähnliche enge verbandelte Komponenten.

Deshalb geht es jetzt auch los mit einem Tipp zu Doctrine2 ;-)

"Symfony2 Tipps und Tricks (1)" vollständig lesen

LinuxTag 2012

Beim LinuxTag 2012

Früher™ habe ich öfter von Veranstaltungen, insbesondere Barcamps, live gebloggt. Gerade bin ich auf dem LinuxTag 2012 in Berlin und habe Lust, diese alte Gewohnheit wieder aufleben zu lassen. Also, ohne viel weitere Vorrede, hier mein Kurzbericht vom letzten Tag des LinuxTag, der wiederum der erste Tag für mich ist - gestern habe ich es leider nicht rechtzeitig geschafft.

Ich sitze momentan im Vortrag Free Your Android! von Torsten Grote. Android ist ja nicht so frei, wie viele es sich wünschen, weil Google da (natürlich) teilweise etwas dagegen hat. Durch diese FSFE-Kampagne soll daran etwas geändert werden. Ein erster Schritt ist die Installation von F-Droid, einem FOSS-Repository für Android, über das Open Source-Apps installiert werden können.

Weiter geht es mit einer Einführung zu Django von Markus Zapke-Gründemann. Interessiert mich schon lange, und man muss auch öfter mal über seinen PHP-Tellerrand schauen. Außerdem ist Python ja sowieso recht cool ;-) Nachdem wir uns zunächst Ponies angesehen haben, geht es um das Model-Template-View-Modell des Rapid Application Development Frameworks. Und schließlich bzw. endlich gibt's auch etwas Code zu sehen :-) Ich muss sagen, vieles von Django findet sich auch in Symfony2 wieder!

Interessant auch: GeoDjango.

"LinuxTag 2012" vollständig lesen

Recursive Drawing

Vor einer Woche ist GIMP 2.8 mit dem von vielen ersehnten Ein-Fenster-Modus (und jeder Menge weiterer toller Features) erschienen. Aber das nur am Rande, denn hier soll es um ein innovatives Grafikexperiment gehen, das im Browser stattfindet.

Recursive Drawing ist ein beeindruckendes Zeichentool auf HTML5-Basis. Sprichwörtlich mit wenigen Mausklicks ist es möglich, sehr interessante Effekte zu erzielen. Ohne überhaupt selbst zu versuchen, das Prinzip dahinter zu erklären, verweise ich auf das folgende Video:

Recursive Drawing from Sundialtone on Vimeo.

Am besten probiert ihr das Tool im Anschluss einfach selbst aus. Leider lassen sich die erzeugten Kunstwerke aktuell weder speichern noch exportieren oder verlinken. Aber da der hauptsächlich auf CoffeeScript basierende Quellcode auf Github liegt, dürfte das nur eine Frage der Zeit sein.

Danke an @krahe fürs Finden.

Turrican Soundtrack Anthology

Dieser Post wäre auch was für mein Musik-Blog, denn schließlich geht es um das gelungene Crowdfunding einer aufwändigen Orchester-Einspielung musikalischer Klassiker. Andererseits: Bei diesen Klassikern handelt es sich um den Soundtrack zum legendären Computerspiel Turrican (II), beim Komponisten um keinen geringeren als den von vielen Gamern verehrten Chris Hülsbeck. Wer in den Achtzigern und frühen Neunzigern auf dem C64 bzw. dem Amiga Spiele wie The Great Giana Sisters, The Secret of Monkey Island oder eben die Turrican-Serie gezockt hat, dürfte auch Hülsbecks Soundtracks zu schätzen gelernt haben.

Jetzt arbeitet Chris Hülsbeck an einem musikalischen Comeback von "Turrican".

Beinahe 20 Jahre nach der Veröffentlichung des letzten Teils der Serie präsentiert er sein neues Projekt: die »Turrican Soundtrack Anthology«. Dahinter verbirgt sich ein aufwändig gestaltetes Box-Set mit mindestens drei CDs als limitierte Sammleredition, auf denen komplett neu eingespielte Versionen von nahezu allen Melodien der Reihe enthalten sein sollen. Darunter befinden sich Klassiker wie »Concerto for Laser and Enemies«, »Metal Stars«, »Hall of Heroes«, sowie erstmals sämtliche Titel- und Abspannmusiken in voller Länge.

Die Songs werden jedoch nicht nur "einfach so" neu eingespielt, sondern sollen zusätzlich auch in Orchester-Versionen vom WDR Rundfunkorchester Köln aufgenommen werden. Zur Finanzierung starte Hülsbeck, der mittlerweile in den USA lebt, Mitte April eine Crowdfunding-Aktion bei Kickstarter - die in weniger als zwei Wochen erfolgreich war. Bei einer Restlaufzeit von, Stand heute, 29 Tagen haben jetzt schon 1.381 Unterstützer knapp 100.000 US$ zugesagt.

Natürlich ist Crowdfunding kein Selbstläufer, gerade was Musik-Projekte angeht, aber in diesem Fall hat es wunderbar funktioniert. Ehrlich gesagt, es hätte mich gewundert, wäre das nicht der Fall gewesen. Die Kids, die vor 25 Jahren diese Games gespielt haben, sind heute um die 40 Jahre alt und müssen nicht mehr vom Taschengeld ihrer Eltern leben. Dazu kommt eine wahrscheinliche starke emotionale Bindung zu den Computerspielen ihrer Jugend. Und auch ich finde das alles höchst erfreulich. Deshalb jetzt hier als Vorgeschmack: die Turrican Titelmelodie aus dem Jahre 1993!

[via Hyperland]