Alle Artikel mit dem Schlagwort: Codeschnipsel

jQuery-Rezept: Textfelder automatisch vervollständigen

Problem Es gibt zwei HTML-Eingabefeld-Typen, bei denen ein Anwender einen Wert aus einer Liste bestehender Werte auswählen kann: Radio Buttons und Selects. Radio Buttons sind für Listen mit bis zu acht Einträgen sinnvoll, während Selects bis zu 30 oder 150 Einträgen noch gut anwendbar sind – abhängig von der Art der Daten. Wenn der Anwender aber auch einen neuen Wert eintragen kann, helfen sie nicht weiter – meist wird ihnen dann ein Feld »Andere« beigestellt. Wird die Liste richtig groß – 500 oder sogar 500.000 Einträge, dann sind auch sie nicht mehr verwendbar. Lösung Das Autocomplete-Widget von jQuery UI kann die verschiedenen Situationen abdecken, in denen ein Select nicht ausreichend ist. Im einfachsten Fall sind die anzuzeigenden Daten in einem JavaScript-Array verfügbar: Wählen Sie einen Monat aus: var months = [’Januar’, ’Februar’, ’März’, ’April’, ’Mai’, ’Juni’, ’Juli’, ’August’, ’September’, ’Oktober’, ’November’, ’Dezember’]; $(“#month”).autocomplete({ source: months }); Hier wenden wir das Autocomplete-Plugin auf ein Eingabefeld für einen Monat an, wobei die Daten in einem einfachen JavaScript-Array bereitgestellt werden. Sind die Daten noch nicht auf Client-Seite vorhanden, …

PHP 5: Standard-Datenstrukturen nicht neu erfinden – Queues, Stacks und Co.

Problem Sie benötigen in Ihrem Programm Datenstrukturen, die PHP nicht out-of-the-box bietet (z.B. Stack, Linked-List oder Queue). Sie könnten diese  mithilfe von Arrays als eigene Klasse implementieren, sind sich aber nicht sicher, ob Sie dabei nicht unnötig das Rad neu erfinden. Lösung Seit PHP 5.3 bietet die Standard PHP Library (SPL) einige dieser Datenstrukturen an. Die Klasse SplStack implementiert eine LIFO-Datenstruktur (Last-In-First-Out) und somit eine Datenstruktur, die sich wie ein Stack (engl. für Stapel) verhält: $stack = new SplStack(); $stack->push(‘a’); $stack->push(‘b’); $stack->push(‘c’); echo $stack->pop().”\n”; echo $stack->pop().”\n”; echo $stack->pop().”\n”; c b a Die Klassen SplHeap, SplMinHeap und SplMaxHeap implementieren eine Heap-Datenstruktur.SplHeap ist dabei eine abstrakte Klasse und kann nicht direkt instantiiert werden. In einem Heap werden die einzelnen Elemente anhand ihrer Schlüsselwerte in einer Baumstruktur abgelegt. SplMinHeap und SplMaxHeap implementieren jeweils die von SplHeap als abstrakt deklarierte Funktion compare(). SplMinHeap legt die hinzugefügten Elemente in aufsteigend sortierter Reihenfolge ab, SplMaxHeap dagegen in absteigend sortierter Reihenfolge: $heap = new SplMaxHeap(); $heap->insert(‘b’); $heap->insert(‘a’); $heap->insert(‘c’); echo $heap->extract().”\n”; echo $heap->extract().”\n”; echo $heap->extract().”\n”; c b a $heap = new SplMinHeap(); $heap->insert(‘b’); …

PHP 5: Callback-Funktionen mit einem Zustandsgedächtnis programmieren

Problem Sie benötigen eine Callback-Funktion. Eine einfache Funktion (z.B. ein Closure oder eine Lambda-Funktion) reicht aber für Ihre Zwecke nicht aus, da die Callback-Funktion einen eigenen Zustand halten – also ein Zustandsgedächtnis haben – soll. Lösung Seit PHP 5.3 haben Sie die Möglichkeit, von Funktionsobjekten Gebrauch zu machen. Dabei handelt es sich um Objekte, die wie Funktionen behandelt und demnach also auch wie Funktionen aufgerufen werden können: class Funktor { public function __invoke($wert) { print $wert . “\n”; } } $f = new Funktor; $f(‘Hallo Welt!’); Hallo Welt! Diskussion In Rezept 6.12 haben Sie gesehen, wie Lambda-Funktionen verwendet werden können, um z.B. ein Array mit der Funktion usort() zu sortieren. Diese Funktionen werden oft als Callback-Funktionen oder kurz Callbacks bezeichnet. Ein solches Callback übergibt man an eine beliebige Funktion, und diese ruft es mit diversen Parameterwerten auf. Die usort()-Funktion ruft ein Callback beispielsweise mit zwei Werten auf, die miteinander verglichen werden sollen. Die Callback-Funktion ist dabei nicht in der Lage, einen Zustand über mehrere Aufrufe hinweg zu halten. Einfach formuliert, könnte man sagen, sie hat …

PHP 5: Mit Namespaces Kollisionen zwischen Klassennamen verhindern

Problem Sie nutzen in Ihrer Applikation diverse Bibliotheken oder Frameworks und wollen Konflikte zwischen eigenen Klassen und Framework-Klassen mit identischen Namen vermeiden. Sie möchten dabei aber nicht den in PHP häufig angewandten Kompromiss eingehen und den Klassennamen verkomplizieren (z.B. MeinProjekt_MeineTeilanwendung_Meine-Klasse). Lösung Durch die Verwendung von Namespaces, die ab PHP 5.3 zur Verfügung stehen, können Sie eine saubere Trennung der Namensräume erreichen, ohne den Klassennamen künstlich zu verkomplizieren. Das folgende Codebeispiel zeigt, wie das aussehen könnte: namespace net\php\pear\Date { class DateTime { public function __construct() { print __CLASS__ . ” created\n”; } } } namespace de\oreilly\phpckbk { class DateTime { public function __construct() { print __CLASS__ . ” created\n”; } } $oreillyDateTime      = new DateTime(); use net\php\pear\Date; $pearDateTime         = new Date\DateTime(); $phpDateTime          = new \DateTime(); print_r($phpDateTime); } Wie Sie sehen, werden im gezeigten Codebeispiel drei Klassen mit identischem Namen (DateTime) verwendet. Wir selbst bewegen uns im Namensraum de\oreilly\phpckbk und haben dort die Klasse DateTime definiert. Diese kann also ohne weitere Namensraumangabe instantiiert werden. Durch Angeben des entsprechenden Namensraums können wir genauso einfach …

CSS-Sprechstunde für Power-User – Attribute: Der Selektor der Zukunft

Wenn es um die Gestaltung von Formularen geht, hauen einen Typ-Selektoren nicht unbedingt vom Hocker. Schließlich wird für Textfelder, Radiobuttons, Checkboxen, Passwortfelder und Buttons das gleiche HTML-Tag benutzt: <input>. Eine Breitenangabe von 200 Pixeln mag für ein Textfeld sinnvoll sein, Ihre Checkboxen sollen aber vermutlich nicht ganz so groß ausfallen. Das heißt, Sie können nicht einfach schreiben: input { width: 200px; }. Momentan besteht die verlässlichste Methode darin, Textfelder mit einer eigenen Klasse zu markieren, z.B.  <input type=”text” class=”textfeld” name=”email” />. Über den entsprechenden Klassen-Selektor können dann eigene Stilregeln definiert werden. Vermutlich schon bald können Sie allerdings den Attribut-Selektor für diese Aufgabe verwenden, der wesentlich mehr Möglichkeiten bietet. Ein Attribut-Selektor wählt ein HTML-Element anhand seines Attributs aus. Bei <input>-Tags bestimmt der Wert des Attributs type, welche Art von Formularelement tatsächlich erzeugt wird. Für ein Textfeld ist dies beispielsweise der Wert text. Um den Hintergrund für alle einzeiligen Textfelder blau einzufärben, könnten Sie die folgende Regel verwenden: input[type=”text”] { background-color: blue; } Wenn Sie den Attributwert im obigen Beispiel von text in submit ändern, wird stattdessen …