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 ...
-
// 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!
Hallo zusammen. Es ist einige Zeit her dass ich mal was geschrieben habe. Ich werde versuchen nun wieder öfters eine halbe Stunde opfern zu können.
Es gibt nun eine neue Lightbox Version. Da die bisherige 0.7 eigentlich in seiner Grundfunktion immernoch kompatibel ist gab es hier nicht viel zu tun. Daher trägt die aktuelle Version den Titel 0.7a.
Was gibt's neues?
- Settings Seite funktioniert endlich richtig.
- Neuste Lightbox 2 in der Version 2.0.4 enthalten
- Komprimiertes Javascript (nur noch 48kb, dank gzip)
- Nur noch 1 DB Feld wird für die Einstellungen verwendet (statt 8)
- Repository auf GitHub angelegt. Dort gibt's immer die neuste Version.
- Admin Panel hübsch gemacht für WP 2.6+
Die gute alte Projekt Seite (zip)
Die neue Seite auf GitHub
Readme liegt bei, alles andere kennt ihr bestimmt ja. Upgrade: Ich empfehle den Uninstall Button im Adminmenü einmal zu drücken nachdem ihr die neue Version hochgeladen habt. Diese räumt den alten Mist aus der Datenbank. Danach geht ihr einfach nochmal auf die Lightbox Settings Seite und somit wird automatisch neu installiert. :)
Viel Spass!
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.
Justin Palmer hat ein Snippet für Prototype gepostet welches das Date Object um strftime() erweitert.
-
Object.extend(Date.prototype, {
-
strftime: function(format) {
-
var day = this.getDay(), month = this.getMonth();
-
var hours = this.getHours(), minutes = this.getMinutes();
-
function pad(num) { return num.toPaddedString(2); };
-
-
return format.gsub(/\%([aAbBcdHImMpSwyY])/, function(part) {
-
switch(part[1]) {
-
case 'a': return $w("Sun Mon Tue Wed Thu Fri Sat")[day]; break;
-
case 'A': return $w("Sunday Monday Tuesday Wednesday Thursday Friday Saturday")[day]; break;
-
case 'b': return $w("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")[month]; break;
-
case 'B': return $w("January February March April May June July August September October November December")[month]; break;
-
case 'c': return this.toString(); break;
-
case 'd': return pad(this.getDate()); break;
-
case 'H': return pad(hours); break;
-
case 'I': return pad((hours + 12) % 12); break;
-
case 'm': return pad(month + 1); break;
-
case 'M': return pad(minutes); break;
-
case 'p': return hours> 12 ? 'PM' : 'AM'; break;
-
case 'S': return pad(this.getSeconds()); break;
-
case 'w': return day; break;
-
case 'y': return pad(this.getFullYear() % 100); break;
-
case 'Y': return this.getFullYear().toString(); break;
-
}
-
}.bind(this));
-
}
-
});
[via Justin Palmer]
Schön gelöst. Weitere ähnliche Schnippsel von ihm gibt es im GitHub.
Ich bin grad so durch die Gegend gesurft und fand dabei folgende Slideshow von Chris Heilmann. Diese fand ich so genial das ich sie einfach bloggen musste. Von mir ein persönliches Dankeschön für diesen amüsanten Abriss der letzten Jahre im Javascript-Land.
Zu den ermutigenden Worte an die Flash-Crowd schliess ich mich an: "Ich will" auch haben :-)
So wurde bisher in Prototype.js eine Klasse erstellt:
-
var Message = Class.create();
-
Message.prototype = {
-
initialize(title, message) {
-
this.title = title;
-
this.message = message;
-
},
-
format: function() {
-
return this.title + "\n" + this.message;
-
},
-
show: function() {
-
alert(this.format());
-
}
-
}
Und so haben wir diese dann erweitert, komplett mit "Variable.prototype" und "Object.extend", aber ohne wirklichen Bezug zur abgeleiteten Klasse.
-
var ErrorMessage = Class.create();
-
ErrorMessage.prototype = Object.extend(new Message(), { // überschreibe format()
-
format: function() {
-
return 'ERROR: ' + this.title + "\n" + this.message;
-
}
-
});
In Prototype 1.6 ist dass nun alles ein wenig einfacher. Anstatt noch mal mit "Variable.prototype = {...}" zu beginnen, übergeben wir den "Hash" direkt als Parameter von Class.create().
-
var Message = Class.create({
-
initialize(title, message) {
-
this.title = title;
-
this.message = message;
-
},
-
format: function() {
-
return this.title + "\n" + this.message;
-
},
-
show: function() {
-
alert(this.format());
-
}
-
});
Das Erweitern ist jetzt ähnlich PHP und liest sich fast ebenso natürlich wie "Klasse extends AndereKlasse". Wir nehmen auch hier direkt den Namen der Variable (bzw. Klassenname) anstatt "new Variable()". Hinzu kommt dass "Object.extend" komplett wegfällt. Man beachte das $super, welches die Kopie der originalen Methode ist.
-
var ErrorMessage= Class.create(Message, {
-
format: function($super) {
-
return 'ERROR: ' + $super(); // vergleichbar mit parent::format(); in PHP
-
}
-
});
Die vorherige Klasse hatte kein Parameter in der Funktion, jedoch wird $super nun definiert. Warum?
Das ist nur der Fall bei Unterklassen und ist optional. Sollte die ursprünglich Methode bereits Paremeter erwarten, sind diese dann einfach als zweiter Parameter zu definieren. Die neue Methode lässt sich dann genau wie das Original verwenden.
Hier mal ein Beispiel:
-
var notice = new Message('Nur zur Info', 'Dies ist das normale Format');
-
notice.show(); // wirft alert('Nur zur Info ...');
-
-
var error = new ErrorMessage('Es trat ein Fehler auf', 'Deshalb ein anderes Format');
-
error.show(); // wirft alert('ERROR: Es trat ein ...');
Ich habe eine Testseite angelegt und auch ein paar weitere Beispiele angefangen. Vor allem ist addMethods interessant, da es die hinzugefügten Methoden anschliessend an alle Instanzen vererbt. So könnte man zum Beispiel durch eine erfüllte Bedingung allen Klassen "auf Knopfdruck" neue Möglichkeiten einräumen (mutieren).
Naja.. schaut euch einfach mal die Tests an und ansonsten wie gehabt:
Happy coding!
Ich habe mich nun doch endlich mal entschlossen die PHP-Zertifizierung zu buchen. Man lernt ja nie aus, wie man so schön sagt. Es gibt jedoch diverse Meinungen zur Zertifizierung als solches.
Sie bescheinigt eigentlich ja nur ein gewisses Maß an Kenntnisse und nicht, wie kreativ oder geeignet jemand für ein Projekt oder Aufgabe ist. Auf der andere Seite zeigt es das man bemüht ist Qualität abzuliefern und sein Wissen zu erweitern. Obwohl "Wissen erweitern" nicht korrekt ist, denn hervorzuheben ist hier wohl das Wort "Zertifizierung" (Man bekommt nur einen "Stempel" für das, was man schon längst wusste).
Wie steht ihr zu dem Thema Zertifizierung? Habt ihr vielleicht schon die Zertifizierung abgeschlossen? War nach Abschluss irgendetwas anders in Bezug auf Bewerbungsgespräche, Kundenresonanz, etc..?
Würde mich freuen ein paar Kommentare zu dem Thema zu lesen.


