CakePHP 1.2 stable verfügbar
25.12.2008 – CakePHP 1.2 ist nun stable!
Und ein neuer Cheatsheet samt TextMate Bundle ist auch dabei :)
Fröhliche Weihnachten!
Named Scopes in CakePHP 1.2
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.
(more…)
iPhone Update – Endlich!
Auto-Korrektur AUS – Danke, apple.
CakePHP 1.2 Themes + Debug_Kit = Problematic
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.[...]“
Snippet: Tooltip mit Prototype JS
Tooltips.. die kleinen Text-Popups die einem helfen sich zu orientieren. Immer wieder gerne gesehen und wurde auch schon zig-mal programmiert.
Ich hab mir schon so einige fertige Scripts angesehen, aber die meisten machen einfach viel zu viel und nutzen teilweise sogar selber Prototype, nur leider nicht effizient genug.
Meistens werden die DIVs beim Aufruf der Seite generiert und irgendwo unterhalb des BODYs "versteckt". Bei sehr vielen Tooltips/Links kann das den Seitenaufbau extrem verlangsamen. Andere wiederum berechnen gott-weiss-was und haben einen mehrseitigen Umfang. Da oft gleich auch eine Klasse geschrieben wird muss man meist eine weitere Scriptdatei laden, was nochmals den Aufbau verzögert.
Ich schreibe daher meine Tooltips immer selber und bin mittlerweile runter auf 10 Zeilen. Könnte sogar in einer passen, aber man will ja nicht den Überblick verlieren.
-
$$('a[title]').invoke('observe', 'mouseover', function(evt){
-
var element = evt.findElement('a'), text = element.getAttribute('title');
-
var tooltip = new Element('div', {'class':'tooltip'}).update(text);
-
element.removeAttribute('title'); element.setAttribute('_title', text);
-
element.insert({'after': tooltip.setStyle({'left':element.positionedOffset().first()+'px'})});
-
}).invoke('observe', 'mouseout', function(evt){
-
var element = evt.findElement('a'), text = element.getAttribute('_title');
-
element.removeAttribute('_title'); element.setAttribute('title', text);
-
if (element.next().hasClassName('tooltip')) element.next().remove();
-
});
- Es wird OnMouseOver ein DIV kreiert mit dem Inhalt des TITLE Attributs eines Links. OnMouseOut wird das DIV einfach wieder entfernt.
- Damit das Browser Tooltip nicht zusätzlich angezeitg wird, verschiebe ich bis zum OnMouseOut den Inhalt des TITLE Attributs kurz in ein Fake-Attribut namens _TITLE.
- Der Selector
a[title]wählt nur Anker die auch wirklich ein TITLE Attribut haben. Somit brauchen wir auch nicht mehr zu kontrollieren ob eines vorhanden ist. - Vom Javascript aus wird nur LEFT gesetzt, TOP braucht man nicht zwingend.
- Am Ende von OnMouseOut prüfe ich ob das nächste Element wirklich die tooltip Klasse hat. Das ist nur eine reine Vorsichtsmaßnahme. Wer dennoch Probleme hat könnte etwas radikaler einfach alle DIVs mit dieser Klasse löschen via getElementsByClassName (ist am schnellsten).
Das nachfolgende CSS kümmert sich um den z-Index und den Abstand zum Cursor.
div.tooltip {
color: #000;
background-color: #FAFAFA;
position: absolute;
z-index: 9999;
padding: 5px;
margin: 5px;
margin-left: 15px; /* Abstand zum Zeiger */
}
So, und das war's. Wenn man nun irgendwo auf der Seite ein <a ... title="mein tooltip"> platziert hat man einen Link mit Tooltip. Zero config, wenn man so will.
Man kann natürlich auch ohne Probleme auf andere Elemente erweitern. Beispiel: $$('a[title], img[title]')...
Falls jemand Verbesserungsvorschläge hat: Immer her damit!
Script wurde in IE, FF und Safari getestet.
Hug a developer today!
Ja, Entwickler haben es schwer manchmal. Bitte einmal umarmen. Danke! :-)
Patronen leer? Kein Thema!
Ich musste eine Menge Papierkram erledigen und wie das halt so laut Murphy ist wenn man sich dazu entschliesst: Tinte geht alle.
Also was macht man? Man geht zu seinem Elektromarkt seines Vertauens und wandert zum Druckerzubehör. Die Preise waren deftig. Ist aber nichts neues, denn sonst gäbe es in der Wirtschaft keinen Platz für Patronen-Nachfüller - Steh ich aber nicht drauf.
Hab mir als für mein Modell die Patronen zusammengesucht und kam auf rund 40 Euro. Auf dem Weg zur Kasse sah ich dann ein Angebot eines Druckers für 35 Euro mit Patronen inklusive. Hmm...
Also was macht man wenn nun die Patronen leer sind? Richtig! Einen neuen Drucker kaufen, den alten aus den Fenster werfen und Geld sparen. Die haben echt alle eine Macke...
Na mir soll's egal sein.
Meine essentiellen Tools für Mac
Ich musste leider meinen Mac wieder fit machen da mir irgendwas die ganze Kiste zerlegt hat. Das hat mich nicht nur zurückgeworfen, sondern auch dazu bewegt erneut die essentiellen Tools zu filtern. So eine Neuinstallation hat immer eine "reinigende Wirkung" - Programme an die man sich beim Aufsetzen nicht mehr erinnert sind obsolete.
Hier mal meine Favoriten.
Visor - Ein SIMBLE Bundle welches im "Quake Stil" das Terminal per Tastenkombination nach vorne holt. Sehr praktisch für schnelle SSH / SVN / BAKE Operationen. (kostenlos)
Quicksilver - Hat ein wenig gedauert bis der Groschen gefallen ist, aber das Tool hebt wirklich die Produktivität durch seine "humane" Schnittstelle zu fast allen Funktionen des Macs und installierten Apps. (kostenlos)
Caffeine - Ein kleines aber feines Menü Icon in Form einer Kaffeetasse. Ein Klick aktiviert den Koffein Modus und nervige Bildschirmschoner und Energie-Spar-Modi werden ausser Kraft gesetzt. (kostenlos)
ProjectPlus - Hab ich ja letztens erst drüber geschrieben. Für mich das ultimative TextMate Plugin. (kostenlos)
MacPorts - So manch wichtige Terminal Komandos fehlen einfach im Vergleich zu einer Unix-Dist. MacPorts gibt mir Zugriff auf "wget", "unrar", etc.. Quasi das APT für Mac ;) (kostenlos)
MagiCal - Nicht wirklich ein Tool aber mehr ein missing feature. Ich weiss dass man sich irgendwie das Datum neben die Uhrzeit hacken kann, aber ein schickes Icon mit Wochentag welches mir on-click einen Kalender präsentiert ist besser. (kostenlos)
Sequel Pro - SQL Browser und Fork von cocoaSQL. Smartes Interface, mehr gibt's dazu nicht zu sagen. (kostenlos)
Growl - Ja, ist Standard unter Mac-User, oder?? - Muss aber erwähnt werden. Es ist so praktisch nicht immer irgendwelche Fenster beobachten zu müssen. Steigert daher für mich definitiv die Produktivität. (kostenlos)
Cyberduck - Ich steh auf die Ente ;) FTP/SFTP/WebDav/S3, klein, viele Optionen, Top! (kostenlos)
tailDash - Ein Dashboard Widget für "tail" Ausgaben. Praktisch für jede Art von Logs.. mail, httpd, mysql, php, whatever.. (kostenlos)
MAMP - Muss man nicht viel zu sagen, oder? Apache2, MySQL, PHP4/5 für Mac. mount-move-forget. Okay.. nicht ganz "forget".. ich map den DocRoot immer auf ~/Sites, aber das war's dann auch. (kostenlos)
Des weiteren 2 Apps die noch nicht fertig sind, aber schon als Beta einen super Eindruck machen und auf meinem Wunschzettel stehen.
Versions - Endlich ein guter SVN Client. Am Besten find ich den Ticket-Link Support. (time limited preview, *ugh*)
Things - Find ich sehr elegant und hat schon einen festen Platz auf meinem iPhone. (free beta until release, *yay*)
So.. und nun geht's weiter im Text, und ich hoffe das war mein letztes fsck ;)
Jetzt auf Media Temple
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. ;)
Apple Special Event / Sept 2008 Keynote
Keynote verfügbar.
Steve Jobs über
- HDTV und NBC Shows,
- neue Features in iTunes 8,
- der neue iPod Nano,
- und ein paar Games aus dem AppStore.
Zur Keynote (circa 70min)
PS: Das neue iTunes gibt's seit gestern. Wie mir geflüstert wurde soll man noch die Finger von lassen.
Textmate Plugin: Project Plus
Wow.. genau das hab ich bei TM immer vermisst!

- SCM Status-icons für Git und SVN alla TortoiseSVN
- Automatische Sortierung der Ordner und Dateien
- Farbige Markierungen für Ordner und Dateien
- Projektstatus merken und wiederherstellen
Klingt fast zu schön um wahr zu sein, und dennoch muss man nur auf Ciarán Walsh’s Blog und sich das super kleine Plugin downloaden. :)
AmazonComponent für CakePHP 1.2
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 ...
-
// some controller ...
-
-
function beforeFilter() {
-
$this->Amazon->setAccessKey( Configure::read('App.APIs.AmazonKey') );
-
$this->Amazon->setAssociateTag( Configure::read('App.APIs.AmazonTag') );
-
}
-
function index() {
-
$items = $this->Amazon->itemSearch('DVD', 'Title', 'Small,Offers');
-
if (!$items) {
-
pr ($this->Amazon->getLastErrors()); // pop some errors
-
} else {
-
$this->set('items', $items);
-
}
-
}
-
function view($asin) {
-
$item = $this->Amazon->itemLookup( $asin );
-
if (!$item) {
-
pr ($this->Amazon->getLastErrors()); // pop some errors
-
} else {
-
$this->set('item', $item);
-
}
-
}
Das wäre das eine... Das andere ist der remote shopping cart.
... kaufen!
-
// some other controller ...
-
function add() {
-
if ($this->data) {
-
'quantity' => $this->data['Cart']['quantity'],
-
'offerId' => $this->data['Cart']['offerId']
-
) // ... could be a larger collection. no prob.
-
));
-
$this->redirect(aa('action', 'view'));
-
}
-
}
-
function edit() {
-
if ($this->data) {
-
$item_id = $this->data['Cart']['cartItemId'];
-
$quantity = $this->data['Cart']['quantity'];
-
$this->Amazon->cartUpdate($item_id, $quantity);
-
$this->redirect(aa('action', 'view'));
-
}
-
}
-
function view() {
-
$this->set('cart', $this->Amazon->cartGet());
-
$this->set('cartHasItems', $this->Amazon->cartHasItems());
-
$this->set('cartIsActive', $this->Amazon->cartIsActive());
-
}
Viel Spass damit!
Named Scopes in CakePHP 1.2
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.iPhone Update – Endlich!
Auto-Korrektur AUS – Danke, apple.CakePHP 1.2 Themes + Debug_Kit = Problematic
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.Snippet: Tooltip mit Prototype JS
Dynamisches Tooltip mit Prototype in nur 10 Zeilen.Hug a developer today!
Ja, Entwickler haben es schwer manchmal. Bitte einmal umarmen. Danke!...Patronen leer? Kein Thema!
Ich musste eine Menge Papierkram erledigen und wie das halt so laut Murphy ist wenn man sich dazu entschliesst: Tinte geht alle.Meine essentiellen Tools für Mac
Ich musste leider meinen Mac wieder fit machen da mir irgendwas die ganze Kiste zerlegt hat. So eine Neuinstallation hat immer eine "reinigende Wirkung"Jetzt auf Media Temple
Ich hab meinen Hoster gewechselt und bin jetzt auf Media Temple.Apple Special Event / Sept 2008 Keynote
Keynote verfügbar.Textmate Plugin: Project Plus
