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 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.

Den Benutzer nicht gleich umzuleiten wenn er sicht registrieren möchte ist chique, modern und freundlich. Das geht aber nur mit Javascript, oder doppelten Code, bzw. zwei Formularen. Aber wenn der Benutzer kein Javascript hat, geht es entweder überhaupt nicht, oder wir müssen die Struktur so ändern, dass wir andere Links setzen.

Hier mal ein Vorschlag wie man das geschickt umgehen kann.

JAVASCRIPT:
  1. var AppRules = {
  2.   'a.swaplink:click': function(element) {
  3.     new Effect.toggle(element.getAttribute('href').split('#')[1], 'appear', {duration:0.4});
  4.       // brich den inhalt von href auseinander und verwende den hinteren teil.
  5.   }
  6. }
  7.  
  8. FastInit.addOnLoad(function(){
  9.     EventSelectors.start(AppRules);
  10. });

Unsere Links müssten dann so aussehen:

HTML:
  1. <a href="signup.php#signup" class="swaplink">Registrieren</a>

Unser Formular müsste dann eine versteckte Sektion beinhalten, welche die zur Registrierung zusätzlich notwendigen Felder beinhalten.

HTML:
  1. <div id="signup" style="display:none">
  2. ... wähle ein passwort, etc..
  3. </div>

Wenn Javascript aktiviert ist erhält der "swaplink" unser Event, welches "href" auseinanderbricht und nur das verwendet was hinter der Raute steht um ein Element mit der daraus resultierenden ID zu 'togglen'.

Wenn Javascript nicht aktiviert ist wird der Benutzer ganz einfach auf die "signup.php" umgeleitet. Zusätzlich hätte man auch die Sprungmarke auf der signup.php um es dem Benutzer noch angenehmer zu machen.

So einfach kann das sein! :)

Verwendete Bibliotheken: prototype.js, event-selectors.js, fastinit.js, effects.js

startup250.jpgCenterNetworks hat kürzlich ein eBook mit vielen nützlichen Tips rund um das Thema "Startup" veröffentlicht. Das PDF umfasst 46 Seiten wo rund 40 Autoren Ihre Erfahrungen und Tips verraten. Kostenlos natürlich, samt Inhaltsverzeichnis und im druckbaren Format. - Download

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.

Bei Paul Stamatiou bin ich über einen netten Tip gestolpert. Der Google Notifier überträgt die Account-Daten im Klartext. Grad bei WLAN nicht wirklich das Gelbe vom Ei. Mit einer kleinen Tastekombination kommt man zu einem versteckten Eigenschaftseditor, wo man HTTPS Authentifizierung aktivieren kann.

Klick auf das Icon des Notifiers (Kalender oder Gmail, egal) und halte "option (ALT)" und "kommando (Apfel)" gleichzeitig gedrückt und klick auf "Preferences (Eigenschaften)".

In das obere Feld tipp: SecureAlways
In das Feld darunter: 1

Dann klick "Set" und starte die Google Notifier neu. Das war's.

Brauchte grad Zugriff auf meine Linux Platte und hab dabei das hier gefunden:
http://fs-driver.org/index.html

Installiert, Buchstaben im Setup zugewiesen, Abgeschlossen -> Schon konnt ich drauf zugreifen.. Top!

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 ;)

Wenn ihr schnell mal eure Übersetzung testen wollt, empfehle ich die Quick Locale Switcher Extension. Damit könnt aus der Statusleiste heraus auf jede Sprache wechseln die ihr wollt. Diese wird dann beim neuladen der Website als Hauptsprache gesendet und Cake versucht die passende Sprachdatei in eurem "locales" Ordner zu finden. Zum testen und Debuggen einfach unschlagbar.

Okay.. habe gerade den neusten Trunk von CakePHP 1.2 ausgecheckt und als erstes fiel mir auf das der "scripts" Ordner verschwunden ist. Es gibt nun einen neuen Ordner unter "cake" namens "console". Dieser beherbergt ein Shellskript und eine Batch-Datei für Windowsuser. Da bisher noch keine Doku existiert stand ich anfangs vor einem Problem: "Wie zum Geier soll die BAT funktionieren?"

In der Datei selbst gab es jedoch einen kleinen Hinweis, wenn auch mit Falschinformation gewürzt:

In order for this script to work as intended, the cake\scripts\ folder must be in your PATH

Scripts wurde ja entfernt. Müsste also "cake\console\" sein.

Console Ordner eurer PATH variable hinzufügen

Die globale PATH variable kennt man noch aus DOS Zeiten und ist unter XP auch recht gut versteckt.

  1. Rechte Maustaste auf das Arbeitsplatz-Symbol -> Eigenschaften
  2. Systemeigenschaften: Wählt dort "Erweitert"
  3. Erweitert: Unten ist ein Button "Umgebungsvariablen". Klicken.
  4. Dort sind zwei Listenfelder. In dem unteren "Systemvariablen" Feld "Path" suchen
  5. Markiert "Path" und klickt auf den "Bearbeiten"-Button
  6. Wert der Variablen: Ist eine durch Semikolon getrennte Liste mit Pfaden
  7. Fügt nun den vollen Pfad zu eurem "cake" Ordner (wahrscheinlich irgendwo in htdocs)
  8. Beispiel: ;F:\xampp\php;F:\htdocs\cake\console;
  9. Bestätigen mit OK und fertig.

Hinweis 1: Ich habe neben cake\console auch xampp\php hinzugefügt, damit ich PHP von überall aufrufen kann.
Hinweis 2: Wenn ihr die "CMD" Konsole noch offen habt, müsst ihr die neu aufrufen, damit die geänderte PATH variable auch aktiv ist.

Neues Projekt anlegen

Es hat sich einiges geändert. Früher konnte man mit scripts\bake.php -project "name" ein neues Skelett anlegen lassen. In CakePHP existiert aber der "project" parameter nicht mehr, und man kann ihm auch nicht sagen wo es hingehen soll (soweit ich weiss..). Da man nun von überall backen kann, muss man einfach in den zukünfigten Projektordner wechseln!

  1. Prüft ob der neue Befehl "cake" funktioniert. Öffnet "cmd" und gebt einfach irgendwo "cake" ein, gefolgt von Enter.
  2. Ihr solltet "Welcome to CakePHP v1.2.0.5165alpha Console" sehen, gefolgt von ein paar Statusinfos.
  3. Geht nun in euren Ordner wo die cake-, app- und vendor-Ordner ebenfalls liegen. Erstellt einen neuen Ordner. Zum Beispiel "testprojekt".
  4. Wechselt nun nach "testprojekt" und ruft "cake bake" auf, wobei "bake" nun ein Parameter ist und "cake" unsere Batch-Datei.
  5. Ihr solltet nun einen ähnlichen Dialog bekommen wie früher mit "bake.php -project .."
    App : testprojekt
    Path: F:\htdocs\testprojekt
    ---------------------------------------------------------------
    Skel Directory: F:\htdocs\cake\console\libs\templates\skel
    Will be copied to:
    ---------------------------------------------------------------
    App: testprojekt
    Path: F:\htdocs\testprojekt
    ---------------------------------------------------------------
    Look okay? (y/n/q)
    
  6. Entscheidet ob der gefundene Pfad richtig ist und dann geht es gewohnt weiter :)

Ihr solltet nun die Willkommensseite sehen wenn ihr http://localhost/testprojekt aufruft. Angaben und Pfade varrieren selbstverständlich. Aber das dürfte ja klar sein.

Für weitere Tips und Tricks empfehle ich den Beitrag von Cakebaker zu den neuen Funktionen.

Viel Spass!