SQLite-Datenbanken mit Fat Free kombinieren

Nachdem ich einige Grundlagen zur Arbeit mit dem Fat Free Framework dargelegt habe, komme ich nun zum Kern meines Anliegens: der Bearbeitung von SQLite Datenbanken mit Hilfe von F3.

In einem ersten Beispiel soll gezeigt werden, wie F3 auf eine SQLite-Datenbank zugreift, Daten aus einer bestimmten Tabelle ausliest und diese in eine HTML-Datei ausgibt.

Zunächst jedoch noch eine Vorbemerkung. Ich verwende jetzt hier den Objektstil. An Stelle von

F3::set('DEBUG',3);
F3::set('GUI','ui/');
F3::run();

schreibe ich

$main->set('DEBUG',3);
$main->set('GUI','ui/');
$main->run();
?>

In der PHP-Hauptdatei gibt es außer dieser formalen Änderung nicht viel Neues. Wichtig ist

$main->set('AUTOLOAD','app/');

Damit werden alle weiteren PHP-Dateien, die sich im Unterverzeichnis app/ befinden automatisch geladen. Der Pfad zur SQLite Datenbank wird wie bei jeder anderen Variablen festgelegt. Ich verwende hier als Beispiledatenbank die Datenbank Northwind, die mit dem Programm SQLite3 Management Studio geliefert wird. Ansonsten kann auch jeden andere selbst erstellte SQLite Datenbank verwendet werden. Im Routing steht der Aufruf der Funktion show, die in der Klasse SQLite01 der Datei SQLite01.php definiert wird. Der vollständige Quellcode der Datei sieht so aus

<?php
// Framework einbinden
$main=require_once 'lib/base.php';
// Programme aus dem Unterverzeichnis automatisch laden
$main->set('AUTOLOAD','app/');
//nicht zwingend erforderlich:
$main->set('DEBUG',3);
// Pfad zu den Templates setzen
$main->set('GUI','ui/');

// Einige Variablen
// Seitentitel
$main->set('title','Datenbank Demo 01');
$main->set('subtitle','Daten aus einer Tabelle der Datenbank auslesen');
// Pfad zur DB
$main->set('data','db/northwind.db');

// Funktion show in Klasse SQLite01 in Datei SQLite01.php im Verzeichnis app/ ausführen
$main->route('GET /sqlite-demo-01.php','SQLite01->show');

// Und los
$main->run();

In der Datei SQLite01.php wird die SQLite-Datenbank einem Datenbank Objekt zugewiesen und der Inhalt der Tabelle Categories wird dem PHP-Array entries zugewiesen. Wichtig sind die beiden Event-Handler beforeroute() und afterroute(). In afterroute() wird die Template-Datei layout-04.htm zur Verarbeitung aufgerufen.

Der vollständige Code der Datei SQLite01.php sieht so aus:

<?php
// Klasse SQLite01, Klassenbezeichner ist identisch mit dem Dateinahmen
class SQLite01 extends F3instance {

  // Anzeige
  function show() {
  // Einträge aus der Datenbank-Tabelle holen
    $myaxon=new Axon('Categories');
    $this->set('entries',$myaxon->afind());
  }

  /**
  Der Event Handler beforeroute() wird automatisch ausgeführt wenn er sich in einer
  mit autoload geladenen Klasse befindet
  Wichtig:hier kann auch die Datei erstellt werden, wenn sie nicht existiert
  **/
  function beforeroute() {
    F3::set('DB',new DB('sqlite:{{@data}}'));
    /*if (!file_exists($this->get('data')))
    // Hier kann jetzt der Code folgen, für den Fall, dass die DB nicht vorhanden ist
    DB::sql(...SQL-Create-Abfrage
    );*/
  }

  /**
  Der Event Handler afterroute() wird automatisch ausgeführt wenn er sich in einer
  mit autoload geladenen Klasse befindet
  Wichtig:sonst wird gar nichts angezeigt
  **/
  function afterroute() {
  // template ausliefern
    echo Template::serve('layout-04.htm');
  }
}

In der Template-Datei layout-04.htm wird die schon in den Ausführungen zu Templates vorgestellte Kontrollstruktur mit <F3:repeat...></F3:repeat> verwendet. Zu dieser Form der Ausgabe müssen die in der Tabelle verwendeten Feldnamen bekannt sein. Der vollständige Quellcode sieht so aus:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>{{@title}}</title>
  <!-- Classe Web, Funktion Minify(Basisverzeichnis steht in Variable GUI, Dateiname, -->
  <style type="text/css">
  {{ Web::minify(@GUI,array('style.css'),FALSE) }}
  </style>
</head>
<body>
  <div class="header">
    <h1>{{@title}}</h1>
  </div>
  <div class="content">
    <h2>{{@subtitle}}</h2>
    <ul>
    <F3:repeat group="{{@entries}}" value="{{@item}}">
      <li>Kategorie: {{@item.CategoryName}} (zum Beispiel:{{@item.Description}})</li>
    </F3:repeat>
    </ul>
  </div>
</body>
</html>

SQLite Beispiel ansehen