25.12.2008 - CakePHP 1.2 ist nun stable!

Und ein neuer Cheatsheet samt TextMate Bundle ist auch dabei :)

Fröhliche Weihnachten!

Ankündigung gibt es dort
Download gibt es hier

Ein neues Lieblingsfeature von mir!

Wer schon mal mit der AuthComponent zu tun hatte kennt sicherlich den Begriff „scope“, womit man festlegen kann welche Bedienung ein Benutzer erfüllen muss damit er sich einloggen kann. Für all die die es nicht Wissen, hier eine Kurzfassung in Bezug auf das Thema dieses Beitrags: Ein „Scope“ ist eine definierte Eingrenzung von Daten. „Named“ bedeutet, dass wir dieser Eingrenzung einen Namen geben.
Read the rest of this entry »

Wenn man das debug_kit Plugin benutzt und dann ThemeView benutzen will gibt es ein kleines Problem: Das debug_kit kommt mit einem eigenem View und überschreibt somit die im AppController definierte Eigenschaft.

Wer also Themes aktivieren will muss sich dem debug_kit entledigen. Hat ein wenig gedauert bis ich den Grund gefunden habe, aber ein wenig manuelles Debugging in “beforeRender” brachte Licht ins Dunkel. Hoffe ich kann mit der Info einigen ein paar Kopfschmerzen ersparen ;-)

—– English —–
If you are using the debug_kit plugin and you want to enable themes in your CakePHP application you will run into a problem. debug_kit comes with a own view and overwrites whatever $view you’ve setup in your controllers. So if you wonder why ThemeView is not working, just delete the debug_kit and it will work. I haven’t looked at the debug_kit code yet, but i guess there is no workaround to this.

Tutorials:
theming-with-cakephp
theming-your-cakephp-apps-v12
Themes Section/cookbook

—–

UPDATE: Ich habe Mark, den Autor des Plugins, darüber informiert und er schrieb mir heute zurück, dass es doch gemeinsam kompatibel sein sollte.

“[...]From the tests I did as long as $view is set in the controller before your action ie. in your beforeFilter() you should be fine.[...]“

Ich hab meinen Hoster gewechselt und bin jetzt auf Media Temple. Ich muss sagen das die Seite sich gefühlt schneller aufbaut als zuvor und die Features von MT wirklich super sind.

Vor allem interessiert mich aber noch der MySQL GridContainer. Für Web-Anwendungen sicherlich nicht schlecht. Der ganze Umzug verlief eigentlich reibungslos. CakePHP und Zend Framework hab ich direkt als PHP Include angelegt und die Apps kommen super damit klar. Backup Cron Job, SSL, Mails als IMAP und POP, alles kein Thema. Am besten find ich dass ich volle Kontrolle über die DNS Zone Files habe. Dafür habe ich bisher zahlen müssen.

Kurzum: Ich kann es wirklich empfehlen und der Service ist super. Zur Zeit warte ich noch auf eine Bestätigung für einen kostenlosen Ruby-on-Rails GridContainer, der mir ohne zu Fragen angeboten wurde. Falls ihr auch etwas mehr Power braucht und mit dem Gedanken spielt zu wechseln oder euch MT anspricht nutz meinen Link. Dann hab ich auch noch was davon. ;)

Yeah.. OpenSource!

Ich habe durch Zufall noch eine alte Amazon Komponente gefunden die ich bisher nicht veröffentlich habe. Da ich mich ja auf GitHub niederlasse, habe ich die mal kurz überarbeitet und meinem cake-bits Repository hinzugefügt.

Link:
http://github.com/m3nt0r/cake-bits/tree/master/components/amazon.php

Gucken, und ...

PHP:
  1. // some controller ...
  2.     var $components = array('Amazon');
  3.  
  4.     function beforeFilter() {
  5.         $this->Amazon->setAccessKey( Configure::read('App.APIs.AmazonKey') );
  6.         $this->Amazon->setAssociateTag( Configure::read('App.APIs.AmazonTag') );
  7.     }
  8.     function index() {
  9.         $items = $this->Amazon->itemSearch('DVD', 'Title', 'Small,Offers');
  10.         if (!$items) {
  11.             pr ($this->Amazon->getLastErrors()); // pop some errors
  12.         } else {
  13.             $this->set('items', $items);
  14.         }
  15.     }
  16.     function view($asin) {
  17.         $item = $this->Amazon->itemLookup( $asin );
  18.         if (!$item) {
  19.             pr ($this->Amazon->getLastErrors()); // pop some errors
  20.         } else {
  21.             $this->set('item', $item);
  22.         }
  23.     }

Das wäre das eine... Das andere ist der remote shopping cart.

... kaufen!

PHP:
  1. // some other controller ...
  2.     function add() {
  3.         if ($this->data) {
  4.             $this->Amazon->cartThem(array(
  5.                 array(
  6.                     'quantity' => $this->data['Cart']['quantity'],
  7.                     'offerId' => $this->data['Cart']['offerId']
  8.                 ) // ... could be a larger collection. no prob.
  9.             ));
  10.             $this->redirect(aa('action', 'view'));
  11.         }
  12.     }
  13.     function edit() {
  14.         if ($this->data) {
  15.             $item_id = $this->data['Cart']['cartItemId'];
  16.             $quantity = $this->data['Cart']['quantity'];
  17.             $this->Amazon->cartUpdate($item_id, $quantity);
  18.             $this->redirect(aa('action', 'view'));
  19.         }
  20.     }
  21.     function view() {
  22.         $this->set('cart', $this->Amazon->cartGet());
  23.         $this->set('cartHasItems', $this->Amazon->cartHasItems());
  24.         $this->set('cartIsActive', $this->Amazon->cartIsActive());
  25.     }

Viel Spass damit!

Ich mag cheat sheets aka Spickzettel. Ich selbst hab immer einen für Prototype und YUI an der Wand hinter dem Monitor. Manchmal weiss man nicht mehr genau wie die Funktion oder Eigenschaft XY heisst. Man kann natürlich dann kurz in Google nachschlagen, aber viel einfacher ist eine Liste mit allen wichtigen Dingen zur Hand zu haben.

Scott Klarr hat einen Blogeintrag zusammengestellt wo so ziemlich alle wichtigen cheat sheets rund um PHP zum Download bereit stehen.

Mit dabei auch spezielle für Wordpress, Smarty, CakePHP und Drupal.

http://www.scottklarr.com/topic/100/php-cheat-sheets/

Thanks Scott!

Interessant sind auch seine weiteren Sammlungen für CSS, MySQL und XML/XSLT.

Stylished.com Model ContestIn letzter Zeit ist es ja recht still hier im Blog. Das hat einen guten Grund: Meine Arbeit bei Stylished.com. Heute möchte ich euch die hübsche Ajax Anwendung zeigen, welche ich die letzten Tage entwickelt habe.

Stylished ist eine soziales Netzwerk für Models, Fotografen und Modelagenturen. In der angeführten Anwendung geht es darum, dass Models in einem virtuellen Contest, eins gegen eins, antreten und sich somit Punkte verdienen.

Stylished.com Model Contest RanglisteDie Teilnahme funktioniert automatisch und die entstehenden Wertungen fliessen in eine Rangliste mit den Kategorien Newcomer, Professionell und Semi-Professionell.

Von der technischen Seite ist die Anwendung komplett in Javascript geschrieben und wird liebevoll mit JSON gefüttert. Als Ajax-Bibliothek wurde natürlich das von mir bevorzugte Protoype und Script.aculo.us Paket gewählt.

Zum Contest: http://www.stylished.com/contests/

Viel Spass damit!

Zumindest temporär(?) und es fehlen nur noch 3 Abschnitte, die man aber ruhig übersehen darf. Das Blog Tutorial und User Auth. Ich habe eine frühe Version dieser Doku bereits als PDF im Forge von CakePHP gefunden und war begeistert eine beinahe Buch-ähnliche Fassung zu haben. Nun scheint es fast komplett und beim überfliegen des Inhaltsverzeichnisses kommt es einem vor als wäre man an der richtigen Stelle für alle seine Fragen. Sehr zu empfehlen - auch wenn es noch nicht komplett ist.

Link: http://tempdocs.cakephp.org

via CakeBaker

Ich mag es einfach und nutze dabei sehr häufig den AppController um mir immer wiederkehrende Aufgaben zu sparen. Sanitize ist fast immer notwendig um die Benutzereingaben zu säubern und auf die Verwendung in Datenbank Queries vorzubereiten. Hier nun ein kleiner Tip wie man sich das ständige escaping und cleaning in den Actions spart:

class AppController extends Controller
{
	var $cleandata = array();
	var $helpers = array('Html', 'Form', 'Javascript', 'Time', 'Text');

	function beforeFilter() {
		if(!empty($this->data)) {
			uses('sanitize');
			$sanitize = new Sanitize();
			$this->cleandata = $sanitize->clean($this->data);
		}
	}
}

Also wenn wir Daten haben (nicht empty), lade die Sanitize Bibliothek (uses) und schreibe das gesäuberte Array in cleandata.

Nun haben wir $this->data und $this->cleandata in jedem Controller zur Verfügung. Das folgende Beispiel stammt aus dem UsersController:

function signup() {
	if(!empty($this->data)) {
		if($this->User->create($this->cleandata) && $this->User->validates())
		{
			echo 'valid!'; // save data .. etc..
		}
	}
}

Ihr könnt natürlich auch !empty($this->cleandata) verwenden. Mein Beispiel soll nur zur Veranschaulichung dienen.

Mal was einfaches, aber doch nicht so offensichtliches:

class UserHelper extends SessionHelper {
    function authed() {
        return $this->check('User');
    }
}

Damit dies funktionieren kann, muss man allerdings zuvor die Reihenfolge der Helper beachten:

class AppController extends Controller  {
    var $helpers = array('Session', 'User');
}

Dann klappts auch mit dem extend ;)