Jul 30

Normalerweise wird durch die ‘loginAction’-Variable der AuthComponent die Action definiert, die bei dem Versuch eine geschützte Seite aufzurufen, angezeigt werden soll.

Wenn ein Plugin in eine CakePHP-Anwendung eingebunden und ebenfalls durch die AuthComponent geschützt werden soll, dann wird der Nutzer auf eine Seite in der Form ‘http://www.domain.de/plugin_name/users/login’ weitergeleitet. Ist letztendlich auch logisch, denn CakePHP geht davon aus, dass der UsersController Teil des Plugins ist.

Um dies zu umgehen und den “richtigen” UsersController der Hauptanwendung aufzurufen, muss der ‘loginAction’ der AuthComponent eine weitere Variable, nämlich ‘plugin’, übergeben werden. D.h. normalerweise in der ‘beforeFilter’-Methode des UsersController oder des AppController muss der Aufruf folgendermaßen lauten:

 $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'plugin' => null);

Anschließend nutzt CakePHP den UserController als globalen UserController.

PS: Eine ähnliche Problematik tritt bei

$html->link();

usw. auf. Auch hier muss der Parameter ‘plugin’ übergeben werden.

Tagged mit:
Jul 20

Nach der Umstellung auf CakePHP 1.3 kam bei mir der Fehler “Undefined variable: session” im Layout.

Warum auch immer muss man nun den Session-Helper manuell im app_controller hinzufügen.

Tagged mit:
Jul 14

Einen anderen Weg als bislang geht TGP, die nicht die Stärke eines Passworts mit grünen, gelben oder roten Balken anzeigen, sondern die Sekunden, Minuten, Stunden, Tage oder gar Jahre, die mit einer Brute-Force Attacke benötigt werden, um ein Passwort zu lösen:

Hier ist der Link!

Tagged mit:
Jul 04

Das YAML-Framework ermöglicht browserübergreifendes CSS Layout. Die entsprechenden IE Einschränkungen werden, wie so üblich, mit Kommentaren und Bedingungen realisiert. Zu beachten ist, dass die HTML-Kommentare der korrekten HTML-Konvention entsprechen, da sonst Fehler auftreten, wie z.B.

  • Anzeige von <!–[endif]–> im Browserfenster (geringeres Problem)
  • Javascript-Fehler bei CakePHP in Verbindung mit den AJAX-Helpern, Scriptaculous und Protoype. (größeres Problem)

Also immer schön an die Webstandards halten ;-)

Tagged mit:
Mai 30

Schöne Stadt. Hat tolle sehenswerte Seiten, aber auch teilweise recht heruntergekommende und langweilige. Die Anreise mit dem Flugzeug ist einfach (evtl. ist ein Flug von Amsterdam billiger als von einem Flughafen aus Deutschland). Vom Flughafen gelangt man in die Innenstadt mit dem sehr schnellen (nur 20 Minuten), aber auch sehr teuren “Flytoget”. Tickets (ca. 21 Euro, one-way) sollten an dem Automaten gelöst werden, da sonst noch eine Bearbeitungsgebühr anfällt.

Nur unwensentlich länger benötigt der “normale” Zug. Der normale Zug fährt nicht so oft wie der “Flytoget”, braucht ca. 10 Minuten länger und kostet ca. 13 Euro. Wer es also nicht eilig hat, sollte diesen Zug nehmen.

Tagged mit:
Mai 30

Wunderschöne Stadt. Ein Ausflug lohnt sich auf jeden Fall. Wenn man ca. 3 Monate vorher bei der Bahn bucht, ergattert man vielleicht auch ein Ticket für nur 19.- Euro (one-way) von Köln nach Amsterdam.

Für die, die mit dem Flugzeug anreisen: Am günstigsten kommt man mit dem Zug in die Innenstadt. Ca. alle 10 – 15 Minuten fährt ein Zug, kostet 3,60 Euro und braucht ungefähr 25 Minuten.

Tagged mit:
Mai 09

…die man als Entwickler kennen sollte:

9 PHP-Functions you need to know

Tagged mit:
Mai 09

Wer plant mit CakePHP eine soziale Netzwerkfunktion zu implementieren, muss ein paar kleine Tricks beachten.
Wir gehen davon aus, dass eine “users”-Tabelle existiert, in der alle Nutzer gespeichert sind. Nun legen wir eine Tabelle an, die sich “users_users” nennt mit den Spalten “id”, “user_id”, “friend_id” und weiteren die Relation beschreibenen Spalten, bpsw. “approved”.

Im Model “user” muss nun die HABTM-Relation eingetragen werden:

var $hasAndBelongsToMany = array(
        'Friend' => array (
            'className' => 'User',
            'join_table' => 'users_users',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'friend_id'
        )
    );

Im Controller “users_controller” muss in der entsprechenden Methode die durch ein Formular übergebenen Daten mittels des folgenden Befehls speichern:

$this->User->UsersUser->save($this->data);

Dafür müssen natürlich die Daten in $this->data in der richtigen Form vorliegen, so dass das Formular richtig gestaltet sein muss. Wichtig ist, dass bei der Formularerzeugung auf Bezug auf “UsersUser” genommen wird, so dass das Array in $this->data auch data['UsersUser'][..] enthält:

echo $form->create('UsersUser', array('url' => array('controller' => 'Users', 'action' => 'tippgemeinschaft')));

Über die Option “url” übergibt man noch den richtigen Controller, da sonst CakePHP versuchen würde, den Controller “users_users_controller” zu laden.

Tagged mit:
Mai 09

Um das abgespeicherte “datetime”-Feld bspw. bei einer User-Tabelle in einer View in das deutsche Format zu bringen, genügt die folgende Zeile (vorausgesetzt, das “data”-Array ist entsprechend vorhanden:


echo date('d.m.Y',strtotime($this->data['User']['created']));
Tagged mit:
Mai 02

Viele, viele Farbpaletten: Colourlovers

Tagged mit:
Apr 27

Habe diesen beiden Webseiten gefunden:

www.airlinemeals.net

und

www.trnd.com

Ersteres ist ganz lustig und nicht wirklich sinnvoll. Man kann – wie der Name bereits sagt – Fotos des Essens der eigenen Flugreise einstellen. Wer sich also für kommende Flüge schon mal mental auf das Essen einstellen möchte, dem ist hier bestens geholfen. Die Idee find ich aber ganz witzig.

Zweiteres ist auf jeden Fall auch eine gute Idee. Hier kann man sich als Testperson bewerben und wenn man ausgewählt wird, Produkte von renommierten Firmen testen und direkt Feedback geben. Auf der einen Seite ist das ja ganz schön und gut, man will ja schließlich qualitativ hochwertige Produkte kaufen, aber auf der anderen Seite gibt man seine Leistung kostenlos an Firmen weiter. Produkttesting müssten sie so oder so machen, nur diesmal eben kostenlos. Hm…

Tagged mit:
Apr 23

Statische Seiten in CakePHP werden über den Pages_Controller eingebunden. Möchte man diese frei zugänglich machen (d.h. auch erreichbar, obwohl die Auth-Komponente im Einsatz ist), dann muss der Auth-Variablen “allow” die “display”-Action des Pages_Controller übergeben werden.

$this->Auth->allow('display');
Tagged mit:
Apr 22

Bin aus dem CakePHP-Kochbuch nicht ganz schlau geworden, deswegen musste ich es selbst ausprobieren. Hier also der Code, wenn man bestimmte Spalten aufaddieren möchte (SUM) und gleichzeitig eine Bedingung stellt:

$conditions = array('user_id =" => $user_id);
$this->find('first',array('conditions' => $conditions, 'fields'=>array('Model.feld','SUM(Model.feld) as NeuesFeld'))));
Tagged mit:
Apr 22

Ich hatte das Problem, dass plötzlich diese Aussage von CakePHP kam und ich zuerst nicht wußte, woran es lag. Lustigerweise trat das Problem an ganz unterschiedlichen Stellen auf. Hier sind Lösungsmöglichkeiten:

  • Datenbankverbindung überprüfen
  • Cache leeren (app->tmp->cache)
  • View erstellen

Vor Allem bei dem letzten Punkt trat bei mir starke Verwunderung auf, da normalerweise ein “MissingView”-Error geworfen wird. Bei mir fehlte tatsächlich die View für die aufgerufene Action. Danach lief CakePHP wieder einwandfrei.

Der im Titel genannte Error tritt auf, wenn der Debugmodus auf 0 gestellt ist – also im Produktivbetrieb. Im Entwicklungsbetrieb erscheint der “MissingView”-Error.

Tagged mit:
Apr 20

Ein eigenes animiertes “wird geladen” Bild kann man einfach unter http://www.ajaxload.info/ generieren lassen. Und der Vorteil: Die generierten Bilder unterliegen keiner Lizenz und sind somit Free For Use.

Tagged mit:
Apr 18

Nutzt man die AJAX-Komponente des CakePHP-Frameworks, dann wird man unweigerlich (vermutlich) auch einmal in den Genuß kommen wollen, den inplaceeditor auszuprobieren:

echo $ajax->editor('DOM_id',$action,$options);

wobei $actions und $options jeweils ein Array mit den entsprechenden Schlüssel/Wert-Paaren sind.

Im $actions-Array wird auch die Methode des Controllers festgelegt, die bei per ansychronem Aufruf ausgeführt werden soll. In dem Controller, stehen dann die veränderten Werte in dem “params”-Array zur Verfügung:

$this->params['forms']['value'] # enthält den veränderten Wert des AJAX inplaceeditors
Tagged mit:
Apr 11

Nichts wildes, im Kochbuch von CakePHP auch leicht zu finden, dennoch hin und wieder gern gebraucht: Mittels find()-Methode des Models nur bestimmte Tabellenfelder aus der Datenbank holen. Simpel:

$this->Model->find('all', array('fields' => array('Model.feldname'), 'recursive' => -1));

Das “recursive => -1″ sorgt dafür, dass eventuelle Datenmodellabhängigkeiten nicht berücksichtigt werden.

Tagged mit:
Apr 05

Sobald ein Nutzer eingeloggt ist (und voraussgesetzt man hat die Nutzerverwaltung mit der Auth-Komponente implementiert) kann man auf die Daten ganz bequem in jedem Controller (in der die Auth-Komponente geladen wird) zugreifen:

$this->Auth->user('tabellenfeld');
Tagged mit:
Mrz 28

Ähnlich wie in Windows muss die Console von CakePHP in den PATH mit aufgenommen werden. Dazu

1. Terminal öffnen

2. die Datei “.profile” bspw. mit nano öffnen: “nano .profile”

3. die Zeile “export PATH=$PATH:/Applications/MAMP/htdocs/cakekphp/cake/console” eingeben (wobei der Pfad natürlich von der jeweiligen Installation von CakekPHP abhängt)

4. Datei speichern mit CRTL + O

5. nano beenden mit CRTL + X

6. neue Session im Terminal starten: Entweder Terminal beenden und neustarten oder “. ./.profile” eingeben.

7. “cake” eingeben und schauen, ob der CakePHP Gruß auf der Konsole erscheint.

Vorher sollte man noch überprüfen ob PHP ebenfalls im PATH bekannt ist. Dies kann man über den Befehl “php -v” ganz einfach testen.

Tagged mit:
Mrz 28

Aus irgendwelchen Gründen funktioniert im Terminal (bash) kein Befehl mehr. Egal was man auch eingibt, man erhält immer nur “Command not found”. Bei mir war ein falscher “export”-Befehl in der “.bash_profile” schuld. Wie änder ich das ganze nun, da “open .bash_profile” nicht mehr funktioniert.

Mittels “PATH=/usr/local/bin:/usr/username/bin:/usr/sbin:/sbin:/usr/bin:/usr/X11/bin:” erstmal wieder den PATH richtig setzen. Anschließend funktioniert auch “open .bash_profile” wieder. Dort die falschen Zeilen löschen, TextEdit schließen, Terminal neustarten und alles müsste wieder einwandfrei laufen.

Tagged mit:
Mrz 23

Um einfach zwischen lokaler Entwicklungsumgebung und einer Produktivumgebung wechseln zu können, kann in der Konstruktor-Methode der Klasse DATABASE_CONFIG ein einfaches if-Statement helfen. Eine kurze Beschreibung inklusive Beispiel gibt es in der Bakery von CakePHP.

Bei Mac OS X wird (anscheinend) schon IPv6 verwendet, so dass localhost nicht unter “127.0.0.1” zu erreichen ist, sondern unter “::1“. Dies sollte man bedenken, falls man die oben vorgestellte Lösung übernehmen möchte.

Tagged mit:
Mrz 22

Die Entwicklungsumgebung Eclipse PDT (für PHP) bietet eine Autovervollständigung während des Programmierens an. Standardmäßig (zumindest bei der Mac-Version) ist die automatische Vervollständigung nicht eingeschaltet, sondern der Programmierer muss “Strg+Leertaste” drücken, um die möglichen Variablen angezeigt zu bekommen.

Da das mitunter lästig ist, kann man auch die vollautomatische Vervollständigung einstellen. Einfach unter “Einstellungen => PHP => Editor => Code Assist” den Haken bei “Enable auto activation” setzen. Optional kann noch die Zeitverzögerung eingestellt werden.

Tagged mit:
Mrz 15

Die iCal Dateien bei Max OS X liegen unter /USER/Library/Calendars/.

Wenn man möchte, kann man die einfach auf einen anderen Mac kopieren und schon hat man einen (wenn auch händischen) gemeinsamen Datenstand bei den Kalendern.

Tagged mit:
Mrz 14

Im Prinzip hat man die Qual der Wahl, was öffentliche Verkehrsmittel in der thailändischen Hauptstadt betrifft. Unsere Erfahrungen:

  • Taxi: Vor allem mit mehreren Personen sehr preisgünstig. 35 Baht (< 1 Euro) Einstiegspreis und dann pro Kilometer ca. 1,5 Baht (ca. 3 Cent). Taxis sind nachts sehr sinnvoll, da kaum Verkehr mehr auf den Straßen unterwegs ist.
  • Tuk-Tuk: Nur für kurze Distanzen und feilschen zu gebrauchen, wenn man nicht viel gehen möchte. Vorsicht: Die Fahrer bringen einen meist immer noch in irgendein Geschäft, um dort Provision abzukassieren. Also lieber etwas mehr geben und dafür dann direkt zum Zielort fahren.
  • Skytrain, U-Bahn: Schnell und sicher. Auch günstiger als in Deutschland, jedoch lohnt sich im Vergleich zum Taxi nur dann, wenn maximal 2 Personen damit fahren. Sonst ist das Taxi billiger (vor Allem für längere Strecken). Skytrain und U-Bahn fahren außerdem nur im östlichen Teil der Stadt.
  • Fähre: Dazu gibt es bereits einen Artikel.
  • Bus: Haben wir leider nicht ausprobiert.
Tagged mit:
Mrz 13

Wenn in der Rush-Hour mal wieder die Straßen Bangkoks verstopft sind, dann lohnt eine Fahrt mit der Fähre. Alle paar Minuten kommt ein Boot, welches entweder flußauf- oder eben flußabwärts fährt. Vorsicht: Für das Touristenschiff (blaue Linie) kosten die Fahrkarten mehr (25 Baht), für die normalen Expresslinien (gelb, orange, grün) gibt es Tickets entweder auf dem Schiff oder bei manchen Stationen auch bei der Anlegestelle. Bevor man das Schiff besteigt, sollte man sich informieren, ob die entsprechende Linie auch an der gewünschten Anlegestelle hält. Ansonsten ist die Fähre echt super und billig (ca. 18 Baht).

Tagged mit:
Mrz 13

Wer in der Nähe von Cha-Am in Thailand Urlaub macht und das Land etwas näher kennen lernen möchte, wird unweigerlich zu den öffentlichen Verkehrsmitteln greifen müssen, da die Taxis vor Ort (im Gegensatz zu Bangkok) vergleichsweise teuer sind. Beispielsweise kostet eine ca. 12 km lange Fahrt 200 Baht (ca. 5 Euro).

Die öffentlichen Verkehrsmittel sind jedoch alles andere als leicht zu durchschauen. Daher hier die Erfahrungen, die wir gemacht haben:

  • An der großen Ampelkreuzung fahren orangene Busse nach Hua Hin und Petchaburi. Eine Fahrt von Cha-Am bis Petchaburi kostet pro Person 30 Baht (< 1 Euro). Die Busse fahren so ungefähr alle 20 – 30 Minuten. Die Fahrt von Petchaburi bis Hua Hin kostet 50 Baht (> 1 Euro). Man kann aussteigen wo man möchte, man sollte es nur ein paar Meter vorher dem Busbegleiter mitteilen. Einsteigen kann man prinzipiell auch wann und wo man möchte. Ein Wink genügt.
  • Ebenfalls an der großen Ampelkreuzung fahren kleine klimatisierte Mini-Busse von Cha-Am bis nach Bangkok (Siegesdenkmal). Die Fahrt kostet pro Person 160 Baht (ca. 4 Euro) und dauert nur 2 Stunden (da der Fahrer sehr schnell fährt). Der Mini-Bus ist komfortabel und billiger und (wesentlich) schneller als die Bahn.
  • Wer nur in der Umgebung etwas mobil sein möchte, mietet sich am Besten einen Roller. Den gibt es ab 200 Baht (ca. 5 Euro) pro Tag. Die Tankfüllung kostet nochmal ungefährt 140 Baht und damit kommt man ziemlich weit. Da jedoch keine Versicherung bei Unfällen etc. abgeschlossen wird, sollte man möglichst vorsichtig fahren. Im Fall der Fälle müsste man vermutlich den Roller ersetzen. Ansonsten läuft der Verleih sehr unkompliziert.

Es werden weitere Thailand-Erfahrungen folgen ;-)

Tagged mit:
Feb 21

Mit der “inputs()”-Methode (man beachte das “s”) können gleich mehrere Formularfelder erstellt werden. Mit der üblichen Schreibweise kann dann auch ein “legend”-Tag erstellt werden:

echo $form->inputs(array('legend' => 'Login', 'username', 'password'));
Tagged mit:
Feb 21

Beispiele, wie hübsche (geschmackssache) Formulare mit CSS gestaltet werden können gibt es bei Smashinmagazine.

Tagged mit:
Feb 21

Um beispielsweise den “Login”-Link in einen “Logout”-Link wechseln zu lassen, sobald der Nutzer eingeloggt ist, braucht man von der Auth-Komponente irgendeine Rückmeldung über den Status. Eine Methode existiert dafür per se nicht. Die Methode

Auth->user()

ist jedoch eigentlich eine Wrapper-Methode für die Session

Auth.User

Daher kann man den Weg über die Session gehen und in Controllern mit der Session-Component und den Views (und damit auch im Layout – falls notwendig) mit dem Session-Helper arbeiten:

In Controllern sieht die Überprüfung daher folgendermaßen aus. Ist der Nutzer eingeloggt, liefert die Methode true

$this->Session->check('Auth.User.id');

In Views muss es so gehandhabt werden:

$session->check('Auth.User.id');
Tagged mit:
Feb 16

Webseiten sollten – wenn möglich – für alle Nutzer zugänglich sein: Stichwort Barrierefreiheit. Es gibt Richtlinien für Webentwickler für die Barrierefreiheit, die in einer deutschen Übersetzung beim W3C zu finden sind.

Ein wichtiger Punkt ist natürlich, dass auch Inhalt der Webseite erreichbar sind, wenn z.B. Javascript nicht vom Browser unterstützt oder gar deaktiviert ist. Was also tun, wenn man (aus Design- und eventuell auch Übersichtlichkeitsgründen) scriptaculous-Effekte einsetzt?

Die Antwort ist – wie meistens so oft – ganz simpel:

Aufsliden...

Anstatt eines einfachen Ankers (#) den wirklichen Link im <a>-Tag angeben. Wenn Javascript aktiviert ist, wird der EventHandler “onclick” genutzt, sonst wird das angegebene “href” Attribut als Link verfolgt.

Tagged mit:
Feb 02

Die aktuelle URL kann man in CakePHP über mindestens zwei Wege bekommen.

1. Mit Hilfe der Router-Klasse:

Router::url("", false);

Der zweite boolsche Parameter gibt an, ob die URL relative (false) oder absolut (true) zurückgeliefert werden soll.

2. In den Views kann mittels

$this->params;

auf ein Array zurückgegriffen werden, welches ebenfalls Angaben über die URI enthält, hier beispielsweise dargestellt:

array(8) {
["pass"]=>  array(1) {[0]=>  string(7) "anfahrt" }
["named"]=>  array(0) { }
["plugin"]=>  NULL
["controller"]=>  string(5) "pages"
["action"]=>  &string(7) "display"
["form"]=>  array(0) { }
["url"]=>  array(1) { ["url"]=>  string(13) "pages/anfahrt" }
["models"]=>  array(0) { }
}
Tagged mit:
Jan 31

Mit Hilfe des im Core enthalten Pages_Controller ist es möglich, die verschiedenen Helper auch für die statischen Seiten in der Anwendung einzubinden.

Wichtig ist, dass keine Änderungen im Core vorgenommen werden sollten, so dass man CakePHP auch weiterhin updaten kann.

Also einfach den Pages_Controller aus cake/libs/controller kopieren und in app/controller einfügen. Wenn CakePHP den Pages_Controller dort findet, wird auf diesen zurückgegriffen.

Nun kann man hier z.B. standardmäßig den Javascript und Ajax Helper einbinden.

/**
 * Default helper
 *
 * @var array
 * @access public
 */
	var $helpers = array('Html', 'Javascript', 'Ajax');
Tagged mit:
Jan 20

Bestimmt nicht, aber der Chefentwickler von CakePHP hat sich von CakePHP getrennt und ein eigenes neues Rapid Developement Framework gestartet: Lithium. Lithium wird für PHP 5.3 entwickelt, befindet sich zur Zeit auch noch wirklich in der Entwicklungsphase. Ein kurzer (englischer) Artikel schreibt etwas mehr über Lithium. Die Lithium Projekt-Seite gibt es hier zu finden.

Tagged mit:
Jan 16

Der vorherige Artikel über die Versionsverwaltung git trifft sich ganz gut, da auch CakePHP nun dieses Tool verwendet. Subversion (das alte Versionsverwaltunswerkzeug) wurde für die Entwicklung von 1.3 und 2.0 durch git abgelöst.Mittels des github verwaltet CakePHP nun die Quellcodes.

Tagged mit:
Dez 21

Git ist eine verteilte Versionsverwaltungssoftware, die das kollaborative Entwickeln von Software vereinfacht / überschaubar macht / ermöglicht / effizienter und effektiver gestaltet. Wie auch immer: mehr zu Versionsverwaltungssoftware gibt es natürlich bei Wikipedia. Und auch zu Git gibt es einen eigenen Artikel! Die Installation unter Mac OS X (Leopard und auch Snow Leopard) ist wirklich simpel:

  • Download der Binary für OS X
  • Entpacken und Installieren (mit Hilfe des Installers)
  • Terminal öffnen
  • Eingabe von git, um zu testen, ob es funktioniert

Auf der Git Dokumentionsseite gibt es ein paar Tutorials, die für die ersten Schritte ausreichen dürfen.

Bei Windows erfolgt die Installation analog, einfach und kurz beschrieben in dem “Git for the lazy” Tutorial.

Ein sehr gutes (deutsches) Tutorial gibt es übrigens auch auf online-tutorials.net.

Tagged mit:
Dez 21

Zwar ist das Interview schon von Juli, ich habe es aber erst gerade entdeckt. Felix Geisendörfer führte es mit Nate Abele (dem Chef-Entwickler von CakePHP 3.0) , um mehr Informationen für die Öffentlichkeit zu bekommen. Hier ist der Link dazu!

Tagged mit:
Dez 12

Das CSS-Framework YAML erleichtert das Erstellen von Webseiten im Bereich Layout und Design. So wie CakePHP dem Entwickler die gängisten und teilweise nervigen immer wiederkehrenden Aufgaben abnimmt, macht YAML im Prinzip das Gleiche – nur eben mit CSS. Was liegt näher, als beide Frameworks miteinander zu kombinieren bzw. YAML in CakePHP zu integrieren? Hier eine Kurzanleitung, wie YAML in CakePHP integriert werden kann:

  1. Das YAML Download Paket von dieser Seite runterladen (zum aktuellen Zeitpunkt V3.2)
  2. Das Paket in einen beliebigen Ordner entpacken.
  3. Im Ordner “yaml” befinden sich zwei Dateien (central_draft.css und markup_draft.html) sowie mehrere Ordner.
  4. Der gesamte Inhalt von yaml muss kopiert und in das css Verzeichnis von CakePHP (app/webroot/css/) eingefügt werden.

Prinzipiell wars das schon. Jedoch muss natürlich ein Design her und die Pfade müssen noch gesetzt werden. Daher Folgendes durchführen:

  1. Am besten den YAML Builder nutzen. Das ist ein “Almost WYSIWYG” CSS-Editor, quasi ein “AWYSIWYG for CSS“.
  2. Dann erstmal viel Spaß beim Gestalten des Layouts der Seite, der YAML Builder ist selbsterklärend.
  3. Nach einem Klick auf “Get Code” im YAML Builder bekommt man die notwendigen CSS Dateien.
  4. Der Inhalt von basemode.css muss kopiert und in eine basemod.css Datei im Ordner screen in app/webroot/css/screen abgelegt werden.
  5. Die CSS Patches für den Internet Explorer von patch_my_layout.css müssen ebenfalls kopiert und in eine patch_my_layout.css Datei im Ordner patches in app/webroot/css/patches abgelegt werden.
  6. Den (X)HTML Code vom YAML Builder am besten in die default.ctp von CakePHP in app/views/layout kopieren. Dies muss man so nicht machen, aber dann bekommt man erstmal ein Gefühl, wie sich YAML und CakePHP miteinder verbinden.
  7. In der default.ctp muss nun der folgende Teil

    durch folgenden Teil ersetzt werden.

          < ?php echo $html->css(‘central_draft’);? >
          
          < ?php echo $html->css(‘patches/patch_my_layout’);? >
          

    Anmerkung: Das Leerzeichen zwischen < und ? sowie zwischen ? und > muss natürlich weg. Das Code-Plugin für Wordpress verschluckt sonst jedoch das gesamte < ?php und ? >.

    Es wurden nun gemäß CakePHP Konventionen, die CSS Dateien eingebunden.

    Abschließend müssen noch kleine Pfadänderungen in der central_draft.css in app/webroot/css gemacht werden. Die Datei sollte den folgenden Code enthalten:

    /* import core styles | Basis-Stylesheets einbinden */
    @import url(core/base.css);
    
    /* import screen layout | Screen-Layout einbinden */
     @import url(navigation/nav_shinybuttons.css);
     @import url(screen/basemod.css);
     @import url(screen/content.css); 
    
    /* import print layout | Druck-Layout einbinden */
    /* @import url(print/print_003.css); */

    Anmerkung: Schön auf die /* Kommentare */ aufpassen, nicht dass eine Datei dadurch nicht importiert wird.

Jetzt müssen natürlich noch die obligatorischen CakePHP Zeilen wie

$session->flash();
$session->flash('auth');
echo $content_for_layout;

hinzugefügt werden!

Das war’s auch schon. Viel Spaß weiterhin mit CakePHP und diesmal auch mit YAML.

Tagged mit:
Dez 10

Wer kennt das Problem nicht? Eine *.flv Datei auf dem Rechner und jetzt soll diese Datei über den Fernseher laufen! Entweder über USB oder über CD/DVD. Nur leider erkennen die meisten Geräte FLV Dateien nicht und spielen diese daher nicht ab. Auf dem Mac ist eine Umwandlung relativ simpel, wenn man einmal weiß, welche Programme man benötigt.

Auf perian.org die QuickTime-Komponente herunterladen und installieren. Das ist Voraussetzung für die gleich beschriebene Umwandlung der Datei.

Nun MPEG Streamclip herunterladen und installieren. Damit findet nun die Umwandlung von flv- in avi-Dateien statt. Das Programm ist sehr intuitiv, daher verzichte ich auf eine konkrete Anleitung.

MPEG Streamclip verfügt auch über eine “Aufgabenliste”, so dass mehrere flv-Dateien hintereinander direkt in avi-Dateien umgewandelt werden können.

Tagged mit:
Dez 05

Bei CakePHP kommen für die Views die *.ctp Dateien zum Einsatz. Damit diese auch entsprechend in Eclipse gehighlighted werden können, muss unsere Entwicklungsumgebung leicht angepasst werden. Es ist ganz simpel – wenn man weiß wo man etwas ändern muss. Folgende Schritte gelten für Eclipse 3.3.2 (english)

  • Eclipse starten und unter “Window” -> “Preferences” auswählen.
  • Im Tab “General”, den Tab “Content Types” auswählen.
  • Im rechten Fenster den Tab “Text” öffnen und “PHP Content Type” auswählen.
  • ImFenster darunter werden nun alle mit PHP verknüpften Dateien angezeigt.
  • Hier muss nun durch einen Klick auf  “Add” die Endung “.ctp” hinzugefügt werden.

Nun werden auch die *.ctp Dateien schön bunt dargestellt und der Entwickler behält den Überblick.

Tagged mit:
Nov 25

Nach den vielen SBahn-Ausfällen in den letzten Monaten gibt die BVG nun endlich auch etwas an die Stammkunden ohne Abonnement zurück: An den vier kommenden Adventswochenenden kann man Samstags und Sonntags jeweils mit einem Einzelticket für 2,10 Euro (AB) den ganzen Tag durch Berlin (AB) fahren.

Weitere Informationen dazu gibt es hier.

Tagged mit:
Nov 23

Spielereien sind mit dem neuen Release von CakePHP 1.3.0 alpha natürlich möglich. Wer jedoch den Backofen nutzen möchte und damit die bake shell, sollte weiterhin auf die Stable-Version 1.2.5 setzen.

Bei 1.3.0 alpha funktioniert bake nicht wie es soll, da einige Klassen in der (neuen) Alpha-Version woanders auftauchen als es bislang der Fall war.

Typische Fehlermeldung: “ConnectionManager” not found (oder ähnlich)

Daher: Für den vollen Cake Genuß die Stable-Version nutzen.

Tagged mit:
Nov 22

Mit bake wird dem Programmierer bei CakePHP noch mehr Arbeit abgenommen. Es können dadurch automatisch Models, Controllers und Views erstellt werden. bake wird über die Konsole (Eingabeaufforderung) gesteuert. Dazu muss das Programm jedoch erst einmal dem System bekannt gemacht werden. Hier eine kurze Anleitung dazu:

  • Start -> Systemsteuerung -> System
  • Reiter “Erweitert” auswählen
  • Button “Umgebungsvariablen” klicken
  • Unter “Systemvariablen” den Eintrag “Path” suchen
  • Button “Bearbeiten” klicken
  • Ans Ende der Zeile (Vorsicht: Erst ein Seminkolon setzen) den Pfad zum Ordner “console” eintragen
    Beispiel: “C:\Programme\xampp\htdocs\webseite\cake\console”
  • Alle geöffneten Fenster wieder schließen
  • Die Konsole (Eingabeaufforderung) öffnen, durch Start -> Ausführen
  • “cmd” eintragen und “OK” klicken
  • Zum Ordner der CakePHP Anwendung navigieren (hier “webseite”)
  • “cake bake” eingeben und schon kann gebacken werden…

Weitere Informationen, wie dann was zu backen ist, kann auf den Seiten von CakePHP nachgelesen werden.

Tagged mit:
Nov 22

Auf dieser Seite wurde im Rahmen einer Diplomarbeit (ja, es ist meine) ein praktischer Ansatz zu automatischen Transformation von UML Klassendiagrammen zu OWL DL Ontologien entwickelt.

Mit einem XSLT Script ist es möglich, bereits bestehende UML Klassendiagramme innerhalb von Minuten in eine gültige OWL Ontologie zu überführen, ohne dass semantischer Inhalt verloren geht. Nähere Informationen dazu auf der Seite der Diplomarbeit.

Mit dem zweiten XSLT Script kann die UML als Modellierungssprache für eine OWL Ontologie genutzt werden. Die Ontologieerstellung wird somit vereinfacht und visualisiert. Es gibt in dieser Richtung andere (vermeintlich vielversprechendere) Ansätze, jedoch wird bei diesem praktischen Ansatz die Semantik der einzelnen UML Elemente beibehalten. Auch hier gibts nähere Informationen auf dieser Seite.

Tagged mit:
Nov 21

XAMPP simuliert einen Apache-Webserver und bringt auch gleich noch eine MySQL-Datenbank mit. CakePHP kann natürlich zu der lokalen Datenbank eine Verbindung herstellen. Dazu muss – wie auch bei einer Verbindung zu einer Datenbank die irgendwo im Server-Nirvana liegt – die Datei database.php im Ordner app/config/ angepasst werden.


var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => 'passwort',
'database' => 'datenbankname',
'prefix' => '',
);

Doch wie ist das Passwort für die lokale Datenbankinstallation? Antwort darauf gibt die Datei config.inc.php im Ordner phpMyAdmin der XAMPP Installation. Dort sind die folgenden Zeilen zu finden:


$cfg['Servers'][$i]['auth_type']     = 'http';
$cfg['Servers'][$i]['user']          = 'root';
$cfg['Servers'][$i]['password']      = 'root';

Das Passwort kann hier direkt geändert werden. Vorsicht: Aus Sicherheitsgründen, sollte der auth_type nicht auf config stehen, sondern auf http. Wenn der Rechner nicht am Netz hängt, kann die Sicherheit vernachlässigt werden.

Tagged mit:
Nov 21

… sollte – so möge man denken – auch über den Form-Helper in CakePHP definiert werden. Dass dies nicht funktioniert und auch nicht sinnvoll ist, soll der kurze Artikel verdeutlichen.

Innerhalb der Methode input können neben dem Namen des Feldes verschiedene Optionen innerhalb eines Arrays für die Eigenschaften angegeben werden. Mit maxLength zum Beispiel wird die maximale Anzahl an Buchstaben angegeben, die im Inputfeld erlaubt sind.

$form->input('name', array('maxLength' => '50'));

Eine Aussage zur Größe (zur Breite) des Feldes wird damit natürlich nicht festgelegt. Nun könnte man denken, dass mit einer Option “size” genau das erreicht wird. Ein Blick ins Manual von CakePHP zeigt jedoch, dass diese Option nicht existiert. (im Gegensatz zu der Meinung, die in diesem Post auf Nabble publiziert wird)

Und das ist auch gut so! Denn: Die Größe eines Inputfeldes ist natürlich ein Formatierungsproblem. Layout und Struktur sollten selbstverständlich weiterhin getrennt bleiben, weshalb die Größe eines Inputfeldes in einer CSS-Definition angegeben werden sollte.

Wer also zu Beginn mit der Standard CSS-Datei cake.generic.css arbeitet, der muss in dieser Datei die Angabe für die Größe (in diesem Beispiel vom Standard width:100% auf width:20% reduziert) der Inputfelder ändern.

input, textarea {
	clear: both;
	display: block;
	font-size: 140%;
	font-family: "frutiger linotype", "lucida grande", "verdana", sans-serif;
	padding: 2px;
	width: 20%;
}
Tagged mit:
Nov 21

Anfang November 2009 besuchte ich für zwei Tage die Hauptstadt Österreichs. Ein paar kurze Gedanken und Erfahrungen zu der meiner Meinung nach sehr schönen Stadt:

  • Unbedingt öffentliche Verkehrsmittel nutzen. Die U-Bahn und Straßenbahn fahren in der Regel alle 2 – 3 Minuten.
  • Ein 48 Stunden-Ticket kostet nur 10.00 Euro, nähere Infos dazu auf htp://www.wienerlinien.at. Vorsicht: Der Flughafen zählt nicht mehr zum Stadtgebiet Wien. Hier ist ein zusätzliches Ticket zu lösen. Das Ticket im Zug beim Schaffner ist teurer als am Automaten.
  • Dienstags Abend kann ich den Bachelorclub empfehlen, der Teil der Passage am Wiener Burgring ist.
  • Schloss Schönbrunn ist imposant und einen Abstecher wert.
  • Der Schnitzelwirt Wien in der Neubaugasse bietet viel Schnitzel zu kleinen Preisen. Die Bedienung war jedoch ziemlich unfreundlich. Tipp: Eine Portion Pommes Frites für zwei Personen reicht vollkommen aus, wenn jeder ein Wiener Schnitzel bestellt.

Fazit: Wien lohnt sich! Im Sommer natürlich schöner als bei verregnetem Wetter.

Tagged mit:
preload preload preload