Sortierung eines Dropdownwidgets in Symfony ändern (Doctrine)

Frameworks sind toll. Man kann in vielen tausend Zeilen das tun, wozu man früher nur ein paar Statements gebraucht hat… Oder war es umgekehrt? Hier etwas Symfony spezifisches, das mir ein paar gefärbte Haare gekostet hat, weil ich sie mir ausreissen musste.

Das Problem

Es sei gegeben eine dreistufige Hierarchie: Kategorien → Fächer → Kurse. Es sind ganz saubere 1:n-Beziehungen: Jedes Fach gehört zu einer Kategorie und ein Kurs ist genau ein durchgeführtes Fach.

Folgt man dem (wirklich guten) Symfony-Tutorial, so wird an Tag 3 ganz unten gezeigt, wie aus der Tabellendefinition automatisch ein Formular generiert wird. Clevererweise werden für 1:n-Beziehungen Dropdowns generiert.

Wenn ein neuer Kurs generiert wird, so soll man angeben können, was für ein Fach er unterrichtet. Standardmässig werden Fächer wie folgt angezeigt:

  1. Ein Kategorienkürzel („I“ für Informatik, „A“ für Ausdruckstanz (haha), …)
  2. Einer „Nummer“ (normalerweise „01“ bis „15“ oder so)
  3. Dem Namen des Fachs

Das Fach braucht für seine Darstellung also das Kürzel aus dem Kategorien-Model (bin ich der Einzige der bei Models immer grinsen muss?).

Das generierte Dropdown zeigt die Namen der Fächer falsch und alles Kreuz und Rüben durcheinander an. Ha, nun ist guter Rat teuer.

dropdownstart

Lösung

Namen der Fächer

Das geht noch relativ einfach: Jedes Model besitzt eine __toString() Methode, die überschrieben werden kann:

# File: lib/model/doctrine/modelnamefach.class.php
[...]
  public function __toString() {
        return sprintf('%s %s %s', $this->FreifachNgKategorie->getKuerzel(), $this->getNummer(), $this->getName());
  }
[...]

Und tatsächlich:

dropdownbefore

Sortierung

Ich hätte mir eigentlich gewünscht, für jedes Model eine Defaultsortierung angeben zu können. Aber da nicht Weihnachten ist, werden meine Wünsche nicht erfüllt. Da hilft nur Quellcodestudium und glückliches Zusammenpuzzeln der Doctrine Anleitung, dem Symfony-Doctrine Buch und der API-Dokumentation (scrollen bis Doctrine): Beispiele gibts leider fast keine.

Nungut: Das Formular wird automatisch generiert (lib/form/doctrine/base/), darum sollte hier nur wer was ändern, der per Stunde bezahlt wird und das nach jeder Generierung wieder neu tun kann :). Für uns Andere müssen wir das Choice in der Kinderklasse hacken und eine table_method reinbringen, die die Einträge nach unserem Gusto liefert:

# File: lib/form/doctrine/modelnamekurs.class.php
[...]
  public function configure()  {
      $this->setWidget('freifach_id', new sfWidgetFormDoctrineChoice(array('model' => 'FreifachNgFreifach', 'table_method' => 'retrieveFreifachOrderedByCategory')));
  }
[...]

Diese table_method muss auch noch codiert werden. Und das in der Tabellenklasse der Fächer (dochdoch, wenn man sich das überlegt ist es ganz logisch *irres_grinsen*).

# File: lib/model/freifachmodelnameTable.class.php
[...]
    function retrieveFreifachOrderedByCategory() {
        $q=Doctrine_Query::create()->from('FreifachNgFreifach f')->innerJoin('f.FreifachNgKategorie k')->orderby('k.kuerzel, f.nummer, f.name');
        //echo $q->getSql();
        return $q;
    }
[...]

Toll, und dann klappts auch mit dem Dropdown:

dropdownordered

UWA Widgets coden

Web 2.0, Just Do It…

Je besser man etwas kennt, desto besser kann man darüber lästern… Ich habe beschlossen, mich ganz praktisch durch das Tal der Tränen zu kämpfen und mich auf dieser Wanderung mit den technischen Teilen von Web 2.0 herumzuschlagen. Wie fühlt sich Ajax an? Wieviel Schatten spendet der DOM-Tree? XML oder JSON, JavaScript und APIs sollten die Dämonen auf meinem Weg sein.

Das Resultat

Das Resultat kann im Ecosystem angesehen und installiert werden. Es ist ein Widget, das Adressen über tel.search.ch sucht.
Tel.search.ch bietet ein geniales, gut dokumentiertes REST API an.

Ein paar Screenies?
So siehts in Netvibes aus:
Das tel.search.ch Widget in Netvibes

So in iGoogle:
Das tel.search.ch Widget in iGoogle

Und so in der Sidebar von Windows Vista:
tel.search.ch UWA Widget in Windows Vista Sidebar

Weiterlesen

Voting Extrem: Netvoting.com

Dies ist ein von trigami vermittelter bezahlter Eintrag Hinweis: Dies ist ein von trigami vermittelter bezahlter Eintrag.

Ergänzung Juni 2009: Netvoting ist vom Netz… Ohne kommentar und nic…

Die Kampagne

Netvoting Diese Kampagne hat sehr geheimnisvoll begonnen. Es wurden Betatester für eine Web 2.0 Plattform gesucht, ohne genauere Auskünfte. Mit etwas Verspätung haben wir akzeptierten Tester einen Login erhalten und der Schleier um http://www.netvoting.com/ (Netvoting) wurde gelüftet. Während der ganzen Testdauer wurden stetig Dinge verbessert, dieser Bericht wird also eine Art Momentaufnahme darstellen.

Was ist Netvoting?

Netvoting ermöglicht es sogenannte Votings als Multiplechoicefragen zu erfassen und einer Kategorie (Lifestyle und Trends, Luxus, Musik, Erotik, …) zuzuordnen. Neben dem Erstellen eigener Votings können die Abstimmungen der anderen Members angesehen werden und selbstverständlich kann man auch daran teilnehmen. Es ist unglaublich auf was für Abstimmungsideen die User schon jetzt im Betabetrieb so kommen: Da wird gefragt, ob Burschenschaften rechts und ob Comics Kunst sind, ob der Po das schönste Körperteil einer Frau ist und ob man sich auf Weihnachten freut.

Was noch nicht funzt ist das Deaktivieren und Editieren von Votings. Vor allem für Falsschreibkönige die ständig die Wechselstaben verbuchseln wie ich einer bin ist das eher peinlich…

Technisches

Erstellen des Votings

Das Erstellen eines Votings geht erfreulich einfach von der Hand: Frage und Antworten eingeben, Einstellungen machen, taggen und kategorisieren und fertig (Betatesterkommenar: Es hat auf dieser Seite mindestens einen Schreibfehler: „eröffentlichen“ (ok, ich bin nicht so richtig qualifiziert um an Schreibfehlern herumzumäkeln 🙂 )).

Votings erstellen

Von diesem Zeitpunkt an ist das Voting auf Netvoting publiziert…

Publizieren auf der eigenen Seite

Mit einem Klick kann das Voting auf Plattformen wie iGoogle, Pageflakes, blogger.de, etc veröffentlicht werden. Vor dem Veröffentlichen kann optional ein Style ausgewählt oder mittels CSS selber definiert werden. Das ist eine gute Idee, leider funktioniert das noch nicht… Zum konkreten Einbetten gibt es 3 Möglichkeiten:

JavaScript (ja wo issn mein Style?):
Flash:

Oder ein Permalink: http://www.netvoting.com/de/welche-themen-interessieren-euch-am-meisten-in-einem-blog-2007

Ebenfalls kann/könnte man Widgets einbinden. Widgets beinhalten entweder konkret ausgewählte Votings oder wählen an Hand von verschiedenen Kriterien dynamisch aus. Leider sieht man an Hand dessen, dass man hier nichts sieht, dass es noch nicht funktioniert. Auch können hier keine Styles ausgewählt werden..(?)


Oberhalb sollte das Widget erscheinen…

Was auch noch nicht so richtig klappt ist die Erkennung von Mehrfachvotern, zumindest nicht bei Cookies. Hier kann man also fröhlich Schummeln…

Resultate

Die Resultate werden zusammengefasst dargestellt und einzeln aufgeteilt nach Registrierung, Geschlecht, Region und Altersstruktur. Leider können diese nicht kommasepariert exportiert werden und man ist für weitere Auswertungen aufs Abschreiben angewiesen. Eine geniale Idee ist der Resultate-RSS-Feed. Damit ist man sehr zeitnah über Fortgang des Votings informiert.

Netvoting Resultate

Community

Um die Votings herum wurde eine Community aufgebaut. Das ist gar nicht so abstrus wie es auf den ersten Blick klingt. Das Ganze beginnt mit dem sehr ausführlichen Profil. Darin werden Freunde verwaltet, Besucher des Profils angezeigt und das Eingeben von ziemlich vielen persönlichen Daten ist möglich. Ein Gästebuch gibts noch dazu. In Gruppen können sich Gleichgesinnte zusammenfinden für die dann eine Art Gruppenblog zur Verfügung steht.

Zusätzlich gibt es ein Ranking mit Awards. Dabei werden Votings, Kommentare, etc berücksichtigt.

Beim Anschauen anderer Profile liegen Licht und Schatten sehr nahe beieinander: Man sieht die Anzahl übereinstimmender Votings mit der Person. Hier wäre eine Art „Nachbarschaftsfunktion“ schön, welche die Mitglieder mit den meisten Übereinstimmungen auflistet. Weniger schön ist es, dass man hier genauen Einblick erhält was die Person abgestimmt hat! Ja gehts denn noch? Und ich merk das erst nachdem ich die Erotikkategorie durchgestimmt habe? Upps, *blush*.

Fazit

Eine schöne Sache! Ich mag Tools die sich auf etwas konzentrieren und dies richtig tun. Vielleicht werde ich in Zukunft hier öfters kleine Votings platzieren, aber erst wenn alles funktioniert.

PHP-UWA Widget Library

[lang_de]Update Jan 2011: Die PHP-UWA-Library wurde völlig überarbeitet und funktioniert nun mit der aktuellen IFrame-Methode. Das Prinzip bleibt das Gleiche, die Aufrufe sind leicht anders: Projekt auf oncode.info.[/lang_de]
[lang_en]Update Jan 2011: The PHP-Update library has been completely rewritten and does now support the current IFrame-Method. The principles are still the same, but the API has changed quite a bit: Projekt auf oncode.info.[/lang_en]
[lang_de]

Widgets und Web 2.0

Universal Widget ArchitectureWidgets sind kleine Miniapplikationen, die übersichtlich wichtige Daten anzeigen oder kleinere Funktionen ausführen. Es gibt sie für Windows Vista, Mac, iPhone sowie Webbasiert für iGoogle, Yahoo!, Netvibes und so weiter und so fort. Um die Entwicklung zu forcieren, stellt nun Netvibes ein Rahmenwerk vor, das die Entwicklung von Widgets für alle diese Plattformen vereinfachen soll: Die Universal Widget Architecture. Die Widgets, die nach diesem Standard programmiert sind, sollen unter allen diesen Plattformen laufen…[/lang_de]
[lang_en]

Widgets and Web 2.0

Universal Widget ArchitectureWidgets are little miniapplications which show data in a clearly arranged way or perform a more or less simple task for the user. Widgets are present on Windows Vista, Mac, iPhone and also in a webbased form for iGoogle, Yahoo!, Netvibes and many other portals. To give a boost to widget development, Netvibes presented a new framework which shall facilate the coding of widgets. The child is called Universal Widget Architecture. Widgets coded with the help of this framework should work on all the mentioned plattforms.[/lang_en]

[lang_de]

UWA Standard

Ein Widget im UWA-Standard ist ein XML-Dokument. Es enthält Metadaten, Einstellungen und den aktiven Teil, geschrieben in Javascript. Besonders die Einstellungen sind interessant, denn über diese können widgetspezifische Parameter angepasst werden. Einige Toolfunktionen runden das UWA-Paket ab.[/lang_de]
[lang_en]

UWA Standard

A widged, coded with UWA is basically a XML-Dokument. It contains metadata, settings and the active part, written in Javascript. Especially the Preferences are of interest, because they are dynamic and allow widgetspecific settings. There are also some convenience-functions in the UWA-library.[/lang_en]

[lang_de]Die UWA-Spezifikation hat ihre eigene Homepage und ist gut dokumentiert. Es gibt Beispiele, ein Code-Skelett mit Erklärung, ein Schritt-für-Schritt Tutorial, ein Forum und sogar ein Cheat-Sheet. Der Einstieg wird einem wirklich so einfach wie möglich gemacht.[/lang_de]
[lang_en]The UWA specification has its own homepage and is very well documented. There are examples, a code-skeleton with explanations, a step-by-step tutorial, a forum and even a cheat-sheet. The start is very easy with such a lot of documentation.[/lang_en]

[lang_de]

Widget Repository

Fertige Widgets können im Widget Repository (Ecosystem) der Öffentlichkeit zur Verfügung gestellt werden. Von diesem System aus können die Widgets zu den verschiedenen Plattformen mittels Mausklick hinzugefügt werden. Im Repository hat es auch noch Widgets, die nach dem veralteten Mini-API Standard funktionieren, diese werden jedoch (hoffentlich) bald verschwinden.[/lang_de]
[lang_en]

Widget Repository

Finished and released widgets can be made available for the public and published in the Widget Repository (Ecosystem). Widgets ion this website can be added to the different platforms with a single (or double) click). There are some widgets in the repository which are coded in the deprecated Mini-API standard, but these will dissappear soon (hopefully).[/lang_en]

[lang_de]

Implementationen

Das klingt echt faszinierend und schreit danach, genutzt zu werden. Widgets selbst werde ich später implementieren, als erstes wollte ich sie wirklich für eigene Projekte nutzbar machen. Dafür habe ich eine kleine PHP- Klasse entworfen und sie grosskotzig PHP-UWA Widget Library genannt. Mit ihr ist die Handhabung von Widgets ziemlich einfach. Etwas ambitionierter ist das Parsing der widgetabhängigen Einstellungen.[/lang_de]
[lang_en]

Implementations

That sounded fascinating and must have a use somewhere… I will implement some widgets later, I needed to make these widgets usable in our own projects first. So I wrote a little PHP-class which I called pretentious PHP-UWA Widget Library.Handling widged should be easy, using this class. A little bit more ambitious is the handling of widget dependend preferences.[/lang_en]

[lang_de]Ein Minimalbeispiel ist im Download-Paket dabei und kann auch online aufgerufen werden.[/lang_de]
[lang_en]A minimal example is included in the download-package and can also be checked online.[/lang_en]

PHP-UWA Widget Library Example

[lang_de]Ein Widget anzuzeigen geht recht fix:[/lang_de]
[lang_en]Displaying a widget should be straight forward:[/lang_en]

<?php
require_once('uwawidget.php');
$uwawidget=new uwawidget('http://www.netvibes.com/api/uwa/examples/digg.xhtml');
echo $uwawidget->getWidgetHTML();
?>

[lang_de]Informationen über das Widget (sobald die URL angegeben wurde) geben die folgenden zwei Methoden:[/lang_de]
[lang_en]There are two classmembers which can give more information about the widget:[/lang_en]

getMetaData()
[lang_de]Metadaten wie Autor, Keywords, Beschreibung, … Siehe Doku.[/lang_de][lang_en]Metadaten like author, keywörds, description, … See the docu.[/lang_en]
getAdditionalData()
[lang_de]Zusätzliche Daten wie Icon, Stylesheet, …[/lang_de][lang_en]Additional info like icons, stylesheets, …[/lang_en]

[lang_de]Grundsätzlich gibt folgende Einstellungsbereiche:[/lang_de][lang_en]Basically, there are the following sections for settings:[/lang_en]

general
[lang_de]Die URL zum Widget.[/lang_de][lang_en]The widgets URL.[/lang_en]
configuration
[lang_de]Anzeigeparameter, die in der Doku beschrieben sind.[/lang_de][lang_en]Displayparameters, which described in the docs.[/lang_en]
preferences
[lang_de]Widgetabhängige Einstellungen, die ebenfalls in der Doku erwähnt sind.[/lang_de][lang_en]Widget dependent preferences, also mentioned in the docs[/lang_en]

[lang_de]Zu allen diesen Einstellungen gibt es folgende Methoden:[/lang_de][lang_en]For all these settings, there are the following classmembers:[/lang_en]

[lang_de]Setters und Getters[/lang_de][lang_en]Setters and Getters[/lang_en]
setModuleUrl(), setConfiguration(), setPreferences()
getModuleUrl(), getConfiguration(), getPreferences()
getSettingsFormData($section)
[lang_de]Gibt die Settings in einem lesefreundlichen Array wieder, aus welchem ziemlich einfach ein Form generiert werden kann. $section ist dabei "general", "configuration" oder "preferences"[/lang_de][lang_en]Returns the settings in a friendly array, from which a form can be generated. $section can be "general", "configuration" or "preferences"[/lang_en]
getSettingsHTML($section)
[lang_de]Gibt die Settings in Array der Form "Label" => "HTML" zurück. $section ist dabei "general", "configuration" oder "preferences"[/lang_de][lang_en]Returns the settings in an array with the format "Label" => "HTML". $section can be "general", "configuration" or "preferences"[/lang_en]

[lang_de]Zum Test habe ich Moodleblock erstellt, welcher nun die Darstellung von UWA-Widgets innerhalb des LMS erlaubt. Heyo, WordPress, Xoops, etc-Coderz, wie wärs bei Euch mit einer UWA Integration???[lang_de]
[lang_en]For a test, I coded a Moodle block, which allows to use UWA Widgets inside the LMS. Heyo, WordPress, Xoops, etc-Coderz, how about an integration of the Widgets in your system???[/lang_en]

[lang_de]Beispiele vom Moodleblock:[lang_de]
[lang_en]Examples from the Moodle block:[/lang_en]

Moodle UWA Calculator Moodle UWA Converter Moodle UWA Translator
Moodle UWA Google Notes Moodle UWA Spider Moodle UWA ToDo
[lang_de]Die Konfiguration unter Moodle:[/lang_de][lang_en]The configuration in Moodle:[/lang_en]
Widget settings in Moodle

[lang_de]

Ui, fast…

…wäre ich schneller als das aktuelle c’t gewesen, welches eine gute aber knappe Einführung in UWA-Widgets enthält.[/lang_de]
[lang_en]

Uh, almost…

…I was almost faster than the german computer magazine c’t which has a short bit good introduction into UWA-Widgets.[/lang_en]