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!
Ich gebe zu das ich mir diesen Effekt nicht selber ausgedacht habe. Ich habe ihn in der jQuery Interface Bibliothek gefunden und fand ihn super. Da ich mich aber nich dazu hinreissen lassen kann den Schreibstil von jQuery zu behalten, bleibe ich in meinem aktuellen Projekt bei Prototype und Script.aculo.us. Nun wollte ich den Effekt aber nicht missen und habe ihn daher mit Hilfe der SAUS nachempfunden.
Habe ihn in Opera9, IE 6 und 7, sowie Firefox ausgiebig getestet und er funktioniert so schön und schnell wie ich es mir gewünscht habe. Der Effekt ist, dass ein Objekt von A nach B kopiert wird und unterwegs auf die Grösse des Ziels transformiert wird. Mögliche Anwendungen ist z.b. für das Füllen eines Warenkorbs oder ähnliches. Funktioniert mit Inline und Block Elementen. Der Code ist unter 2K und tut das was er soll.
new Effect.Transfer('quelle', 'ziel', {duration: 1, transferer: 'css-klasse'});
Für ein aktuelles Projekt brauchte ich so eine hübsche Sternchenbewertung. Meine Wahl fiel auf Komodo Medias CSS Lösung, da diese einfach in den meisten Browsern funktioniert und kein Javascript benötigt. Aber mit Javascript ist eben nun mal alles viel schöner und da das Projekt mit jQuery produziert wird, stiess ich auf ein Plugin das ähnlich aussah, aber eben dynamisch generiert wurde. Tolle Idee! Leider nicht so tolle Browserunterstützung. Im IE6 verschwanden die Grafiken. Schade.
Ich habe daher auf Basis des Skripts mein geliebtes Komodo-system eingebaut und die Funktion noch ein wenig erweitert und zum Teil verbessert. Es ist möglich unendlich viele Sterne mit der Komodo Methode zu haben (anstatt nur 5 mit statischen CSS Klassen). Mein Plugin rechnet die nötigen Werte selber aus.
Natürlich sind die sehr nützlichen Optionen des Vorgängers geblieben. Man kann festlegen wieviele Sterne, wieviele vorausgewählt sein sollen und an welche Adresse das Ergebnis des Klicks gesandt werden. Ich habe allerdings eine Callback Funktion eingebaut die das ebenfalls dynamisch erstellte Ergebnis-Element mit dem HTML der XHR Response füllt. Click->POST->Result.
Ich habe eine Demo-Seite erstellt wo man das 5K grosse, beziehungsweise 2K gepackte Skript samt CSS und Beispiel runterladen kann.
http://www.m3nt0r.de/devel/raterDemo/
Ich mag Prototype. :)
-
var Ticker = Class.create();
-
Ticker.prototype = {
-
messages: new Array(),
-
counter: 0, interval: 0,
-
target: null, source: null,
-
initialize: function(target, source, options)
-
{
-
this.target = $(target);
-
this.source = $(source);
-
this.options = Object.extend({
-
updateRate: 2,
-
duration: 0.5,
-
beforeStart:function(){
-
this.counter++;
-
}.bind(this)
-
}, options || {});
-
-
Element.cleanWhitespace(this.source);
-
$A($(this.source).childNodes).each(function(sel) {
-
this.messages.push(sel.innerHTML.strip());
-
}.bind(this));
-
-
this.start();
-
},
-
start: function()
-
{
-
this.interval = new PeriodicalExecuter(function() {
-
this.target.update(' ').appendChild(Builder.node('span',{style:'opacity:0'}, this.messages[this.counter]));
-
new Effect.Appear(this.target.lastChild, this.options);
-
if(this.counter == this.messages.length){ this.counter = 0;}
-
}.bind(this), this.options.updateRate);
-
},
-
stop: function()
-
{
-
this.interval.stop();
-
}
-
};
Benutzung:
var ticker = new Ticker('ziel', 'quelle', {duration:0.3, updateRate: 3});
Abhängigkeiten:
Prototype.js 1.5.0 und Builder.js, sowie Effects.js von Scriptaculous
Ticker Demo
Download ticker.js
27.02 - fixed IE bug.
Da nun die Version 1.5.0 finale von Prototype draussen ist, lohnte es sich für mich dessen neue und komplette Dokumentation nun auch in eine CHM zu verbannen.
Ich habe seit gestern Abend bis heute Nachmittag daran gesessen und jeden einzelnen Schnipsel der Doku in mein eigenes Format kopiert und formatiert. Das war eine heiden Arbeit, aber glaubt mir wenn ich sage das es sich gelohnt hat!
Endlich eine saubere und vollständige Doku als CHM.
Ich werde mich bemühen diese immer aktuell zu halten und hoffe das euch meine Version gefällt.
Ich hab's doch kommen sehen! Heute morgen ging prototype 1.5.0 final und so ganz nebenbei wurde soeben script.aculo.us 1.7 veröffentlicht. Sauber Jungs!
Gestern habe ich die Amazon Klasse geschrieben und aus gegebenen Anlass dachte ich mir das eine Technorati Klasse her müsste. Sie folgt dem gleichen Prinzip und liefert die XML Dokumente ohne viel drumherum. Wie auch bei der Amazon Klasse gibt es hier wieder eine ausführliche Online Dokumentation. Alle verfügbaren API Querys sind enthalten. Bloginfo, Browse, Member und Search, sowie das jedes Query alle verfügbaren Parameter beinhaltet.
Beispiele:
-
require('technorati.class.php');
-
-
// Alle Informationen zum Blog
-
$techno = new Technorati_Bloginfo();
-
$xmlDocument = $techno->bloginfo('http://www.m3nt0r.de/blog/');
-
-
// Suche nach Linkkosmos für eine Adresse.
-
$techno = new Technorati_Search();
-
$xmlDocument = $techno->cosmos('http://www.m3nt0r.de/blog/');
-
-
// Alle Informationen zu einem Mitglied.
-
$techno = new Technorati_Member();
-
$xmlDocument = $techno->getinfo('m3nt0r');
Download, Source und Docs
Heute habe ich mal eine Klasse für den ECS Dienst von Amazon geschrieben. Ich kam auf die Idee, nachdem ich für mein selbstgemachtes Framework keine vernünftige Klasse finden konnte. Es gibt zwar Services_Amazon von PEAR, aber die hat einfach zuviele Abhängikeiten für diesen einen Zweck. Die Klasse ist offen für alle Dienste und vorbereitet für die Bezahldienste wie Alexa und Mechanical Turk, etc. Ihr könnt Sie also nach belieben erweitern. Ich habe eine ausführliche Dokumentation hinterlegt und dem Archiv hinzugefügt. Leider gibt es noch keine coding-guideline und eigentlich hätte ich Alexa und die Amazon-Bezahldienste selber implementiert, nur habe ich keine Kreditkarte und einen Developer-Key hab ich auch nich gefunden. Wie auch immer. Das ECS ist zu 80% abgedeckt. Ich habe nicht bei allen Funktionen alle möglichen Variablen eingefügt, da die meisten nur in sehr speziellen Fällen Sinn machen.
Read the rest of this entry »
Jaja.. das gute Cake.. immer wieder lecker ;-)
Ich brauchte gerade ein Tool zur automatischen Übersetzung von Text. Ich dachte ein Helper is da sicherlich nicht schlecht. Also hier ist er.. TransHelper. Entscheidet anhand der vom Benutzer favorisierten Spracheinstellung welche vorhandene Übersetzung angezeigt werden soll. Ich empfehle allerdings eine Datenbank dranzuhängen um nicht in Arrays innerhalb des Views zu versinken.
Die Sache läuft so:
-
'de_de'=>'Titel',
-
'fr_fr'=>'Titre',
-
'it_it'=>'Titolo'))); ?>
Der Helper entscheidet selber was am besten ist. Gerade bei en_EN und en_US von Vorteil. Sollte nur die Sprache (en) überinstimmen wird das nächst beste geliefert. Wenn beides stimmt wird genau dessen Übersetzung zurückgegeben.
Bevor ich mit CakePHP anfing gehörte die Smarty Template Klasse von PHP.net zu meiner Standardausrüstung. Ich habe damit früher quasi meinen eigenes MVC gebastelt. Für mich war es damals ein riesiger Schritt nach vorne als ich Smarty zum erstene Mal in meine Programme gepackt habe. Nun haben wir bei CakePHP allerdings ein etwas "roheres Material".. die thtml-Dateien. Okay.. man hört oft: "Warum eine Templateengine mit eigener Sprache? PHP ist ja quasi auch eine Templatesprache.. ". Da stimme ich auch zu, aber man macht sich damit nur das Leben schwer. Jeder der sich schonmal durch einen Wald von php-tags gemixt mit HTML schlagen durfte wird mir da zustimmen.. spätestens wenn man nach 4 Monaten oder mehr mal eben was ändern will, oder sogar ein komplettes Redesign ansteht..
Lange Rede.. hier mal ein Beispiel zum Vergleich. Was lässt sich besser lesen?
-
<td><?php echo $note['Note']['id'] ?></td>
-
<td><?php echo $note['Note']['title'] ?></td>
-
<td><?php echo $note['Note']['body'] ?></td>
-
<td><?php echo $note['Note']['created'] ?></td>
-
<td><?php echo $note['Note']['modified'] ?></td>
oder...
-
<td>{$note.Note.id}</td>
-
<td>{$note.Note.title}</td>
-
<td>{$note.Note.body}</td>
-
<td>{$note.Note.created}</td>
-
<td>{$note.Note.modified}</td>
Und das ist noch ein einfaches Beispiel. Oft hat man ja noch if(!empty) oder foreach etc.. und alles mit den php tags.. Ich bin zwar schon dazu übergegangen die Shortcuts von CakePHP zu benutzen aber ich kann dem <?php e($html->link()); ?> auch nicht wirklich was abgewinnen..


