Feb
28

CakePHP und jQuery. Tutorials und Tipps

Die letzten Tage hab ich ja schon mal nachgefragt, wie es denn mit Tipps für CakePHP und jQuery ausschaut. Jetzt hab ich mir mal eine Liste von Links zusammengesucht, die ich mir für den ersten Überblick mal herausgesucht habe. Vielleicht kann ja der eine oder andere mit der Liste etwas anfangen:

  1. JQuery autocomplete in CakePHP ” nuts and bolts of cakephp
  2. JQuery in the CakePHP world (part 1 - the basics) ” nuts and bolts of cakephp
  3. JQuery in the CakePHP world (part 2 - is client side code all that great?) ” nuts and bolts of cakephp
  4. jQuery Helper | The Bakery, Everything CakePHP : Articles
  5. Easy AJAX Pagination Using JQuery (Articles) | The Bakery, Everything CakePHP
  6. Felix Geisendörfer - Jquery and CakePHP by Mark Story, Cake Development Corporation
  7. AJAX failure catchall callback with jQuery and cakePHP : AJAX failure callback with jQuery
  8. Setting up TinyMCE with jQuery and CakePHP 1.2 | Late Night PC
  9. Ajax-Login mit jQuery und CakePHP | Hackthenet-Blog
  10. Edit in place with JQuery and CakePHP - cakebaker
  11. Cake PHP useful tips: List, JQuery & CakePHP
  12. Tutorial - CakePHP Ajax “Quick Save” with jQuery: CakePHP, jQuery
  13. With jQuery & CakePHP to World Domination
  14. jMaps - The jQuery Map Framework - Digital Spaghetti
  15. JQuery UI and CakePHP - Stack Overflow
  16. Ajax File Uploading with Cake and jQuery (ergänzt)
  17. jQuery example overview
  18. PQuery - PHP and JQuery | NGCoders - Next Generation Coders
  19. miPHP :: Blog :: Cakephp Helper For Jquery Validation Plugin

Nicht alles nur CakePHP, aber auf jeden Fall jQuery. Wenn ihr noch weitere Links und Tipps habt, dann einfach in die Kommentare und ich werde das Ganze dann weiter ergänzen.

Feb
25

Shellprogrammierung mit CakePHP

Wer bei CakePHP einsteigt fängt möglicherweise mit der Generierung über die Cake Console an. CakePHP verfügt nämlich über einige Befehle, die ganze Anwendungen erzeugen können. Scaffolding, Bake und die Console sind die Stichworte und vieles davon kann im Handbuch nachgelesen werden. Lohnt auf jeden Fall.
Für eine aktuelle Anwendung habe ich ebenfalls mit Shell-Scripten gearbeitet. Allerdings setzt es voraus, dass man die Möglichkeit hat, Cronjobs aufzusetzen. Ist also mit einfacheren Webspace-Angeboten meist nicht zu realisieren. Wenn man aber die Möglichkeit hat, lohnt es auf jeden Fall darüber nachzudenken, welche Aufgaben einer Anwendung im Hintergrund ablaufen könnten. Bei Anwendunge beispielsweise könnte der Versand der Benachrichtungsmail auch kurze Zeit später erfolgen. Somit kann die Webanwendung im Vordergrund von dieser Aufgabe entlastet werden.
In Cake Shellanwendungen hat man Zugriff auf Models und kann also prima Daten aus der Datenbank auslesen und somit die Emails für den Versand entsprechend versenden, wenn die Markierungen in der Datenbank sind.

class NotificationShell extends Shell
{
    var $User = null;
 
     function main() {
            $this->User = ClassRegistry::init('User');
            $data = $this->User->find('all');
            // $data verarbeiten
     }
}

Genauso einfach wie man Models instanzieren kann, lassen sich auch Komponenten laden und benutzen, wie beispielsweise die TwitterComponent.

        if (is_null($this->Twitter)) {
            App::import('Component', 'Twitter');
            $this->Twitter = new TwitterComponent();
 
            $this->Twitter->username = 'twittername';
            $this->Twitter->password = 'meinPasswort';
       }

Cake Shellscripte werden dann einfach über den cake Befehl in der Form

     cake notification

aufgerufen. Das Shell-Script wird in APP/vendors/shells angelegt und bekommt den gleichen Namen wie die Shell. Also im obigen Beispiel wird die NotificationShell in der Datei notification.php angelegt.

Feb
24

CakePHP und jQuery

Heute mal eine Frage an die jQuery-Nutzer. Bisher habe ich in allen Projekten immer Prototype genutzt, da es unter anderem ja auch von CakePHP unterstützt wird. Allerdings will ich mir in Zukunft jQuery genauer anschauen und suche nun ein paar Tipps, wie man damit am Besten einsteigen kann.
Am liebsten wären mir eigentlich gute Beispiele für den Einsatz von jQuery in Cake Anwendungen um von Best-Practice Beispielen zu lernen. Da ich Javascript nicht im HTML-Code programmieren will, was ich auch mit Prototype schon vermeide, aber über den Ajax-Helper derzeit ja nicht untersützt wird, wären also Beispiele interessant, die es entsprechend einsetzen.

Any tipps ?

Feb
23

NoseRub installieren und testen

NoseRub bietet ein dezentralisiertes Social Network, mit dem man den eigenen LifeStream selbst hosten kann. Da NoseRub auf CakePHP basiert, steht es schon länger bei mir auf der Todo-Liste, es endlich zu installieren. Gestern abend gelang es mir auch die erste Version ans Laufen zu bringen. NoseRub wird derzeit noch aktiv entwickelt und stellt wie so oft in diesem Bereich Beta-Software dar. Die kurze Installationsanleitung bietet zwar Anhaltspunkte, aber die CakePHP-Kenntnisse kann man ganz gut brauchen, um schnell voran zu kommen.

Bisher läuft alles noch im Standardmodus, sprich ich muss noch die Cronjobs aufsetzen, denn NoseRub holt im Hintergrund die externen (RSS-)Feeds ab und verarbeitet sie in seine Datenbanktabellen. Aber das muss ich mir alles noch näher anschauen. Alleine die umfangreiche routes.php Tabellen brauchen noch eine nähere Inspektion um zu sehen, wo was zu finden ist. Aber dazu bald noch mehr.

NoseRub hat den Vorteil, dass es eigentlich ein Protokol darstellt mit einer Beispielimplementierung, die unter anderem auch auf Identoo.com zu sehen ist. Bisher finde ich aber die Bedienung noch ein wenig verschlungen und was ich vorallem mal austesten möchte, sind neue Views für den LifeStream.

Feb
18

Wie man User-Routes erstellen kann

CakePHP bietet von Haus aus ein sehr flexibles System um URL auf Controller und Action umzusetzen. Viele URLs sehen deshalb etwas so aus:

   http://meinedomain.de/users/view/username

Der Controller ist also users>.
Die Action heißt in dem Fall view.
Der dritte Teil wird dann als Parameter in die Action des Controllers übergeben und kann einfach über

   function view($username)

verarbeitet werden.

In vielen Fällen wäre es aber schöner, wenn die URL einfach so aussehen würde:

   http://meinedomain.de/username

Mit Hilfe der Klasse Routes lässt sich das auch so oder so ähnlich umsetzen. Im einfachsten Fall würde das so aussehen:

   Routes::connect('/*', array('controller'=>'users', 'action'=>'view'));

Allerdings führt das zu dem Problem, dass alle anderen Controller und Actions nicht mehr erkannt werden.
Das kann man recht einfach dadurch lösen, dass man die genutzten Controller vor der oben genannten Route auflistet, was dann in etwa so aussehen würde, wenn man davon ausgeht, dass es noch einen PagesController und einen ProjectsController gibt:

   Routes::connect('/pages/*', array('controller'=>'pages', 'action'=>'display')); // nur display
   Routes::connect('/projects', array('controller'=>'projects')); // alle actions
   Routes::connect('/*', array('controller'=>'users', 'action'=>'view')); // die Usernamen hier zuletzt abfangen.

Vielleicht gibt es dazu ja auch noch eine geschicktere Lösung, aber damit bin ich bisher ganz gut ausgekommen und werde es in Kürze auch auf der Twitter-Anwendung http://21tweets.com einbauen.

Feb
13

Twitter Timeline und Twitter Search-Api-Component

Sehr schöne Anwendung der Javascript Timeline Bibliothek zur Darstellung von CakePHP Nachrichten die auf Twitter erscheinen.

Eine Cake Componente für die Twitter Search API habe ich vorkurzem zusammengeschrieben.

//  Twitter Search API (Json)
//
    App::import('Core', array('HttpSocket'));
    /**
     * Twitter Search
     * Documentation can be found on:
     * http://apiwiki.twitter.com/
     * http://apiwiki.twitter.com/Search+API+Documentation
     */
    class TwitterSearchComponent extends Object {
        var $Http = null;
        var $apiUrl = 'http://search.twitter.com/search.json';
 
        function __construct() {
            $this->Http =& new HttpSocket();
        }
 
        function query($url = null, $rpp = 25)
        {
            if (!empty($url)) {
                $params = array(
                    'q'=>$url,
                    'rpp'=>$rpp
                    );
                $response = $this->Http->get($this->apiUrl, $params);
                if (function_exists('json_deconde')) {
                    return json_decode($response);
                } else if (App::import('Vendor', 'json', array('file'=>'JSON.php'))) {
                    $json = new Services_JSON();
                    return $json->decode($response);
                }
                return false;
            }
        }
    }
Feb
12

a, aa, am, e, h und clearCache

CakePHP bietet in der Datei basics.php einige sehr praktische Funktionen, auf die ein genauer Blick sich lohnt. Auslöser für mich das das Posting von teknoid über die Funktion pr() bzw. debug(), die beide ebenfalls in basics.php zu finden sind.

Die Funktion clearCache() kann ohne Argumente aufgerufen werden und löscht alle Cache-Views, die in CACHE.DS.views enthalten sind. Zusätzlich bietet clearCache die folgenden Parameter, mit denen sich recht individuell Dateien aus dem Cache löschen lassen.

function clearCache($params = null, $type = 'views', $ext = '.php')

Mehr dazu in der Doku.

Feb
11

21tweets.com jetzt online

In den letzten zwei Tagen hab ich mit Hilfe der Twitter-Komponente und ein paar Cake Shell-Skripten die Seite 21tweets online gebracht. Die Idee dahinter war eine Möglichkeit zu bauen, mit der man via Twitter neue Gewohnheiten in 21 Tagen - daher 21tweets - erlernen kann.

Die Anwendung sammelt also Tweets auf Twitter ein, die an den Account @21T gehen und eine Gewohnheit mit einem Hashtag # markieren. Damit aber nicht jeder Tweet aufgenommen wird, muss zunächst die neue Gewohnheit bei 21tweets angemeldet werden. Ab dann kann gesammelt und angezeigt werden. Nur Tweets die an aufeinander folgenden Tagen getwittert werden, werden zur Statistik für die Gewohnheit gezählt. Falls man einen Tag auslässt, dann verfallen alle vorher gesammelten Tweets für die Zählung der 21-Tage-Statistik. Klar ?

Ein paar Problemchen und wie ich die umschifft habe, will ich hier kurz erklären:

  • Ich wollte kein Login und keine Anmeldung
  • Erkennung von neuen Anwendern durch die Prüfung, ob der Twitterati dem Account von 21tweets @21T folgt.
  • Ausschließen von Twitter-Bots mit Hilfe eines Validate-Links, wie es bei normalen Accounts gemacht wird.
  • Abfrage von direct-messages zur Erkennung der Gewohnheit, die in den nächsten 21 Tagen praktiziert werden soll. Einfach via #hashtag in der DirectMessage

Eines der Probleme war die Erkennung von neuen Twitterati, die dem Account folgen. Mittlerweile hatte aber Twitter zwei neue Funktionen, die ich in einem der letzten Posts schon beschrieben habe, bereitgestellt. Damit lassen sich die neuen Follower recht einfach ermitteln, indem man einfach einen array_diff() auf die beiden Listen anwendet.

Es laufen insgesamt drei Backgroundjobs, die über crontab angestossen werden und dafür verantwortlich sind:

  1. Die neuen Follower einzutragen und ebenfalls als Follower aufnehmen
  2. Neue Habits aus den Direct Messages zu filtern
  3. Neue Tweets aus den normalen Twitter-Meldungen zu filter, die an @21T gesendet werden und die praktizierte Gewohnheit mit einem Hashtag enthalten.

Jetzt fehlt eigentlich nur noch ein wenig Statistik und Auswertungen, damit das Ganze rund wird. Bis dahin

happy baking

Feb
10

RFC822-Datum im Model formatieren

In CakePHP gibts ja den TimeHelper der für alle Gelegenheiten die richtige Funktion zum Verarbeiten von Datums hat. Da ich gerade an einem Shell-Script in Verbindung mit Twitter einiges programmiere und der TimeHelper in Model nicht zur Verfügung steht, habe ich mir einfach mal eine Funktion fromString herausgezogen, mit der man die notwendigen Wandlungen recht schnell machen kann:

    function fromString($dateString, $utcOffset = 0)
    {
        $date = strtotime($dateString);
        if ($utcOffset !== 0) {
            $serverOffset = date('Z',  time());
            $gmtTime = $date - $serverOffset;
            $userTime = $gmtTime + $utcOffset * (60*60);
            return $userTime;
        }
        return $date;
    }

Das meiste ist vom TimeHelper geborgt und kann im Model als Funktion hinterlegt werden. Damit lässt sich dann ziemlich einfach ein RFC822 Datum in ein Datenbankfeld einfügen. Als in einer entsprechenden Model-Funktion sieht das dann beispielsweise so aus:

function saveit($tweet) {
...
$data['Tweet']['tweet_created_at'] = date('Y-m-d H:i:s',  $this->fromString($tweet->created_at, $utc_offset));
...
}

Falls das Ganze noch jemand brauchen kann, einfach zugreifen.

Feb
09

Twitter API Neuigkeiten

Hängt jetzt zwar nicht direkt mit CakePHP zusammen, aber da ich im Augenblick gerade eine kleine Twitter-App schreibe, hab ich gerade festgestellt, dass die Twitter-API mittlerweile zwei Funktionen unterstützt, die unter dem Stichwort Social Graph Methods laufen. Dabei lassen sich damit die ids der Friends und der Follower abholen. Die Funktion ist in der Twitter-Componente bisher wohl nicht drin gewesen.

Ich hab die zwei Methoden einfach mal für die Komponente erstellt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        /* social graph methods */
        /**
         * Returns an array of numeric IDs for every user the specified user is following.
         *
         */
        function friendsids() {
            $url = "http://twitter.com/friends/ids.xml";
 
            return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
        }
        /**
         * Returns an array of numeric IDs for every user the specified user is followed by.
         *
         * @param string id optional.  The ID of follower from whom to get the followers.
         */
        function followerids($id = null) {
            if (is_null($id)) {
                $url = "http://twitter.com/followers/ids.xml";
            } else {
                $url = "http://twitter.com/followers/ids/{$id}.xml";
            }
 
            return $this->__process($this->Http->get($url, null, $this->__getAuthHeader()));
        }

Viel Spass beim Twittern mit CakePHP

Oben