Jan
30

Behaviors - meine Best-of

Als Behaviors in CakePHP vorgestellt wurden - ja ist schon eine zeitlang her - konnte ich nicht wirklich viel damit anfangen, da ich die Vorteile nicht wirklich gesehen habe. Vielleicht lag es aber auch daran, dass die Dokumentation gefehlt hat, was sich inzwischen geändert hat oder weil die Beispiele mir unverständlich erschienen.

Inzwischen ist die Liste der veröffentlichten Behaviors in der Bakery ziemlich lang geworden. Ich habe über 40 - in Worten vierzig - Behaviors gezählt und das ist doch schon eine ziemlich lange Liste. Einige der Behaviors sind mittlerweile in den Core eingebaut worden, wie beispielsweise das CounterCache-Behavior (direkt in das Model) und das Containable Behavior. Ein Einsatz von Behaviors ist ja denkbar einfach und auch im Book recht gut beschrieben. Behaviors sind ja sowas wie die Komponenten der Controller und erweitern die Funktionalität des Models. Also werden sie auch im Model angewendet.

1
2
3
class Category extends AppModel {    
    var $name   = 'Category';    
    var $actsAs = array('Tree');}

So hier meine kleine Best-of-Liste:

  • Sluggable Behavior, das ja Sebastian schon vorgestellt, bzw. erweitert hat. Mittlerweile kann man hier auch Inflector::slug() nutzen.
  • Polymorphic Behavior von Andy Dawson (AD7six), das sehr nützlich ist, wenn man ein Modell mit mehreren anderen Modellen verknüpfen will. Beispielsweise lassen sich damit Notizen an andere Modell anhängen ohne, dass man mehrere Notizen bräuchte. Sehr kuhl.
  • Cipher-Behavior von Xemle, das einzelne Teile einer Tabelle, bzw. eines Models verschlüsselt und damit vor fremden Augen schützt.
  • Containable Behavior, wie ja bereits schon gesagt, steht es mittlerweile im Core zur Verfügung und gehört zu meinen absoluten Rennern, die bei der Optimierung von Model::find() Zugriffen helfen
  • Image Behavior, das ist ja auch schon kurz erwähnt hatte
  • NamedScope Behavior, das ich nicht in der Bakery gefunden habe, sondern via m3nt0r bei Joel Moss gefunden habe.

So das wäre erstmal meine kleine Liste. Ich hab noch ein paar auf der Pfanne, die ich noch verstellen werde, wenn ich ein wenig mehr damit gemacht habe. Hab ich ein wirklich gutes Behavior vergessen?

Jan
26

FileUploader in CakePHP für Bilder

FileUploader sind ja die Teile mit denen man in Web2.0 und auch sonstigen Anwendungen Bilder und ähnliches hochlädt. Vorgestern hab ich mich noch mit Sebastian drüber unterhalten und er meinte, er nutzt den phpThumb Helper aus der Bakery, weil der die Bilder einfach cached. Sprich, wenn ein neues Format gebraucht wird, dann wird über die phpThumb Bibliothek das neue Bild erzeugt und im Cache zwischengespeichert.

Der Aufruf sieht damit im View eigentlich ziemlich lässig aus:

1
     $thumbnail->show($options, $tag_options);

Allerdings muss man sich dazu noch selber merken, welche Bilder vorhanden sind und wie die heißen, sprich doch ein Model bemühen oder entsprechendes.

Selber benutze ich in meiner aktuellen Anwendung das image-Behavior, das einen komplett anderen Ansatz geht.
Als Behavior wird es im Model mit $actsAs aufgesetzt und erhält die notwendigen Parameter. D.h. im Falle des Image-Behaviors wird über den Parameter fields das Attribut in der Datenbanktabelle festgestellt - hier avatar - und dann werden die Parameter eingestellt für die unterschiedlichen Thumbnails, die das Behavior beim Speichern des Datensatzes generieren soll.

1
2
3
4
5
6
7
8
9
10
    var $actsAs = array(
        'Image'=>array(
		'fields'=>array(
			'avatar'=>array(
				'thumbnail'=>array('create'=>true),
				'resize'=>array('width'=>'55', 'height'=>'55','aspect'=>true),
				'versions'=>array(
					array('prefix'=>'s','width'=>'32','height'=>'32','aspect'=>true),
					array('prefix'=>'16','width'=>'16','height'=>'16','aspect'=>true)
		)))));

In meinem Fall wird also ein thumbmail erzeugt, eine resize auf 55px Kantenlänge vorgenommen und zusätzlich noch zwei Versionen erzeugt, einmal mit dem Prefix ’s’ und einer Kantenlänge von 32, sowie einem Prefix ‘16′ mit einer entsprechenden Kantenlänge.
In der Datenbank selbst wird nur das Feld avatar gespeichert, das den Dateinamen enthält, den man angibt. Alle anderen Felder werden virtuell erzeugt. Hier ein Beispiel wie der Datensatz nach einem $this->find zurückkommt:

1
2
3
4
5
6
7
            [avatar] => Array
                (
                    [path] => thumbs/Person/812/avatar.skypeavatar.jpeg
                    [thumb] => thumbs/Person/812/thumb_avatar.skypeavatar.jpeg
                    [s] => thumbs/Person/812/s_avatar.skypeavatar.jpeg
                    [16] => thumbs/Person/812/16_avatar.skypeavatar.jpeg
                )

Wie man schön sieht bekommt man also deutlich mehr Informationen über das vom Image-Behavior verarbeitete Bild zurück und kann damit entsprechend weiterarbeiten.

In der Bakery ist gerade ein neuer Beitrag über einen FileUploader schienen. Ist aber leider gerade nicht mehr online, weil er wahrscheinlich zum Editieren/Erweitern vom Autor verändert worden ist und erst neu freigeschaltet werden muss. Sah aber auch ganz interessant aus, weil er insbesondere die Möglichkeit vorgesehen hat, dass man ins Model speichern kann, aber nicht unbedingt muss. Ich werd den Link hier noch setzen, sobald der Artikel in der Bakery wieder zur Verfügung steht.

Welche Helper, Behaviors oder anderen Methoden verwendet ihr denn, um mit hochgeladenen Bildern umzugehen?

Jan
24

Sexy URLs mit CakePHP oder: das Sluggable-Behavior

Worum geht’s?

Hier möchte ich das Sluggable-Behavior vorstellen und zeigen, wie man es einbindet und auf den deutschen Sprachraum anpasst.

Warum das Ganze
Richtig hübsche und zudem suchmaschinenoptimierte URLs sehen meiner Meinung nach nicht aus wie “doma.in/artikel/view/32″ sondern eher wie “doma.in/artikel/ich-bin-ein-toller-artikel”. Auch wenn es in der Suchmaschinenoptimierung nur ein kleiner Faktor ist, so kann es der entscheidende Faktor sein. Der weit größere Vorteil einer solchen “spechenden URL” ist aber, dass sie in den Suchergebnissen auch häufiger angeklickt werden wird, da der Nutzer eine konkretere Vorstellung davon hat, was ihn erwartet.
more…

Oben