CakePHP: Linkliste Tutorial
Ja, ich lebe noch.
Damit ihr nicht ganz auf dem trockenen liegt, während ich hier vor allem mit Typo3 kämpfe, ein kleines Tutorial, wie man sich eine Linkliste mit eingebautem Klickcounter (ohne IP Sperre) baut.
Zuerst wie immer die MySQL Tabelle:
-
CREATE TABLE `tutorial_links` (
-
`id` int(11) NOT NULL AUTO_INCREMENT,
-
`url` varchar(255) NOT NULL DEFAULT ”,
-
`comment` text NOT NULL,
-
`clicks` int(11) NOT NULL DEFAULT ’0′,
-
`created` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
-
`modified` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
-
PRIMARY KEY (`id`)
-
) ENGINE=MyISAM;
-
-
INSERT INTO `tutorial_links` VALUES (1, ‘http://www.example.com’, ‘Beispiel 1′, 5, ’2007-06-05 09:37:09′, ’2007-06-05 09:37:09′);
-
INSERT INTO `tutorial_links` VALUES (2, ‘http://www.example.com/more’, ‘Beispiel2′, 8, ’2007-06-05 09:37:09′, ’2007-06-05 09:37:09′);
Ist der Code in die Datenbank eingetragen, kommt nun das Model an die Reihe
Wie immer platziert ihr die Datei in [root]/[app]/models/link.php
Hier sehen wir wieder unsere Validierungen. Wir möchten, dass der User eine URL und einen Kommentar einfügen muss, sonst wird das Hinzufügen eines Links fehlschlagen.
Nun folgt der Controller. Ich beschränke mich hierbei auf eine Index, Add und GoTo Funktion. Diese Linkliste kann natürlich noch beliebig erweitert werden, beispielsweise durch eine Editier oder Kommentarmöglichkeit
[root]/[app]/controller/links_controller.php
-
<?php
-
class LinksController extends AppController {
-
-
var $name = ‘Links’;
-
-
function index() {
-
$this->Link->recursive = 0;
-
$this->set(‘links’, $this->Link->findAll());
-
}
-
-
function add() {
-
$this->render();
-
} else {
-
$this->cleanUpFields();
-
if($this->Link->save($this->data)) {
-
$this->Session->setFlash(‘The Link has been saved’);
-
$this->redirect(‘/links/index’);
-
} else {
-
$this->Session->setFlash(‘Please correct errors below.’);
-
}
-
}
-
}
-
function goto($id = NULL) {
-
if(!$id) {
-
$this->Session->setFlash(‘Fehler in URL’);
-
$this->redirect(‘/links/index’);
-
}
-
$this->Link->id = $id;
-
$this->data = $this->Link->read(null,$id);
-
$this->data[‘Link’][‘clicks’]++;
-
$this->data[‘Link’][‘id’] = $id;
-
if ($this->Link->save($this->data)) {
-
$this->set("url",$this->data[‘Link’][‘url’]);
-
$this->layout = "gotoframe";
-
}
-
}
-
-
}
-
?>
Schauen wir uns nun die Controller Funktionen genauer an.
Die Indexfunktion holt sich mit
-
$this->set(‘links’, $this->Link->findAll());
alle Links, die bisher gespeichert sind und speichert sie für die Ausgabe in der Variable $links.
Die Add Funktion ist auch sehr einfach gehalten. Wenn keine Daten gespeichert sind, wird das Hinzufügen Formular gerendert (=ausgegeben). Sind Daten im Post Array $this->data vorhanden, so wird versucht, diese zu speichern. Gelingt dies nicht, wird eine Fehler Nachricht ausgegeben und der User kann die fehlenden Eingaben ergänzen.
Die goto Funktion stellt den eigentlichen Link dar. Diese Funktion wird weiter unten genauer besprochen, da sie den Kern der Linkliste darstellt.
Die Views:
[root]/[app]/views/links/index.thtml
-
<div class="links">
-
<h2>List Links</h2>
-
-
<table cellpadding="2" cellspacing="5">
-
<tr>
-
<th>Url</th>
-
<th>Clicks</th>
-
<th>Erstellt</th>
-
</tr>
-
<?php foreach ($links as $link): ?>
-
<tr>
-
<td><?php echo $html->link($link[‘Link’][‘url’],"/links/goto/".$link[‘Link’][‘id’], array("target"=>"_blank")); ?></td>
-
<td align=right><?php echo $link[‘Link’][‘clicks’]; ?></td>
-
<td><?php echo $link[‘Link’][‘created’]; ?></td>
-
</tr>
-
<tr>
-
<td><?php echo $link[‘Link’][‘comment’]; ?></td>
-
</tr>
-
<?php endforeach; ?>
-
</table>
-
</div>
In Zeile 12 sehen wir, dass nicht direkt auf die URL gelinkt wird, sondern auf die URL /links/goto/linkId. Führen wir uns nochmal unseren Controller ins Gedächtnis. Dort sehen wir, dass anhand der ID Die URL aus der Datenbank ausgelesen wird, die Klicks um 1 erhöht und gespeichert werden und zum Schluss die URL gesetzt wird und ein neues Layout für die Ausgabe gewählt wird, nämlich
-
$this->layout = "gotoframe";
Dieses Layout sieht so aus:
[root]/[app]/views/layouts/gotoframe.thtml
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">
-
<head>
-
<title>Weiterleitung von Seite</title>
-
</head>
-
<frameset rows="50,*">
-
<frame frameborder="0" src="<?php echo $html->url("/pages/disc");?>">
-
<?php echo $content_for_layout;?>
-
</frameset>
-
<body>
-
<p>Die weiterleitende Seite ist nicht fuer Inhalte auf fremden Webseiten verantwortlich.</p>
-
</body>
-
</html>
Die Page wird in zwei Teile geteilt. Der obere Frame besteht aus /pages/disc, wo ein paar Sätze als Disclaimer aufgeführt sein können. Der untere Teil der Seite ist die angeklickte URL. Dieses Layout kann optional z.B. um einen Link erweitert werden, der die Frame-Platzierung aufhebt.
Zu guter Letzt noch der View, um Links speichern zu können. Dieser ist noch sehr im Standard Cake gehalten.
[root]/[app]/views/links/add.thtml
-
<h2>New Link</h2>
-
<form action="<?php echo $html->url(‘/links/add’); ?>" method="post">
-
<div class="required">
-
<?php echo $form->labelTag(‘Link/url’, ‘Url’);?>
-
<?php echo $html->tagErrorMsg(‘Link/url’, ‘Please enter the Url.’);?>
-
</div>
-
<div class="required">
-
<?php echo $form->labelTag( ‘Link/comment’, ‘Comment’ );?>
-
<?php echo $html->tagErrorMsg(‘Link/comment’, ‘Please enter the Comment.’);?>
-
</div>
-
<div class="submit">
-
<?php echo $html->submit(‘Add’);?>
-
</div>
-
</form>
Ich hoffe, ich konnte euch einen kleinen Einblick in die Cake Welt und ihre einfacheren Anwendungen geben. Wenn ihr mehr wissen wollt, bleibt am Ball oder besser im Feed, denn bald gibt es auch wieder hochwertigeren Content.
Kategorie: CakePHP | 0 Kommentare »
Veröffentlicht am Dienstag, den 5. Juni 2007 um 16:35 Uhr veröffentlicht
Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.
