Free Trial

Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.


  • Create BookmarkCreate Bookmark
  • Create Note or TagCreate Note or Tag
  • DownloadDownload
  • PrintPrint
Share this Page URL
Help

4. Eine erste Extension anlegen > Produkte haltbar machen

Produkte haltbar machen

Von der Klasse Tx_Inventory_Domain_Model_Product können wir jetzt bereits Instanzen – also konkrete Produkte mit individuellen Eigenschaften – zur Laufzeit des Skriptes erstellen. Diese sind aber nur in flüchtiger Form im Arbeitsspeicher vorhanden und werden, nachdem die Seite komplett von TYPO3 erzeugt wurde, von PHP wieder gelöscht. Damit die Produkte über eine längere Zeit zur Verfügung stehen, müssen wir sie »haltbar« machen. Üblicherweise geschieht dies, indem man sie in eine Datenbank ablegt. Daher legen wir zunächst die dafür notwendige Datenbanktabelle an.

Tipp

Das Anlegen der Datenbanktabellen können Sie vom Kickstarter übernehmen lassen. In der TYPO3 v5 werden diese Schritte gänzlich entfallen.

TYPO3 erledigt dies für uns, wenn wir den entsprechenden SQL-Aufruf in der Datei EXT:inventory/ext_tables.sql eintragen:

CREATE TABLE tx_inventory_domain_model_product (
    uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,

    name varchar(255) DEFAULT '' NOT NULL,
    description text NOT NULL,
    quantity int(11) DEFAULT '0' NOT NULL,

    PRIMARY KEY (uid),
    KEY parent (pid),
);

Dieser SQL-Befehl legt eine neue Tabelle mit den entsprechenden Spalten an. Die Spalten uid und pid dienen zur internen Verwaltung. Unsere Produkteigenschaften tauchen als Spalten name, description und quantity wieder auf.

Auf die Einträge in der Datenbank kann dann über das Backend von TYPO3 zugegriffen werden. Die Formulare des Backends werden anhand einer Konfiguration erzeugt, die in einem PHP-Array abgelegt ist, dem sogenannten Table-Configuration-Array (kurz TCA). Innerhalb der Extension wird dann über Repositories transparent auf diese Daten zugegriffen. »Transparent« bedeutet, dass man sich beim Zugriff auf Repositories um die Art der Speicherung der Daten keine Gedanken machen muss.

Damit das Backend nun weiß, wie es die Produktdaten in einem Formular anzeigen soll, müssen wir dies für die Tabelle in der Datei EXT:inventory/ext_tables.php konfigurieren. Dort wird im Array $TCA unter dem Tabellennamen als Schlüssel die Konfiguration abgelegt. Diese umfasst mehrere Sektionen. In der Sektion ctrl befinden sich grundlegende Eigenschaften, wie der Tabellenname oder die Angabe, welcher Tabellenspalte das Label für die Einträge entnommen werden soll. In der Sektion columns wird für jede Tabellenspalte beschrieben, wie diese im Backend angezeigt werden soll. Die Sektion types definiert, in welcher Reihenfolge die Tabellenspalten angezeigt werden und wie diese ggf. gruppiert werden.

Tipp

Die Möglichkeiten, mit dem TCA die Ausgabe im Backend zu beeinflussen, sind immens. Im Rahmen diese Buches können wir diese nur anreißen. Eine vollständige Auflistung aller Optionen finden Sie online unter http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.3.0/view/4/1/. In umfangreicheren Extensions würde man die Sektionen columns und types aus Performance-Gründen auch in eine eigene Datei tca.php auslagern. In unserem Beispiel soll diese Minimalkonfiguration aber genügen.

<?php
if (!defined ('TYPO3_MODE')) die ('Access denied.');

$TCA['tx_inventory_domain_model_product'] = array (
     'ctrl' => array (
         'title' => 'Lagerbestände',
         'label' => 'name',
     ),
     'columns' => array(
         'name' => array(
             'label' => 'Produktbezeichnung',
             'config' => array(
                 'type' => 'input',
                 'size' => '20',
                 'eval' => 'trim,required'
             )
         ),
         'description' => array(
             'label' => 'Produktbeschreibung',
             'config' => array(
                 'type' => 'text',
                 'eval' => 'trim'
             )
         ),
         'quantity' => array(
             'label' => 'Lagerbestand',
             'config' => array(

                 'type' => 'input',
                 'size' => '4',
                 'eval'=> 'int'
             )
         ),
     ),
     'types' => array(
         '0' => array('showitem' => 'name, description, quantity')
     )
);
?>

Nachdem wir die Extension installiert haben, können wir im Backend unsere ersten Produkte anlegen. Wie in Abbildung 4.2 gezeigt, erzeugen wir dazu einen Systemordner, der die Produkte aufnehmen wird 1. In diesem legen wir einige wenige neue Bestandsdaten an 2.

Anlegen eines neuen Produkts

Abbildung 4.2 Anlegen eines neuen Produkts

Wir haben in diesem Abschnitt ein Abbild (oder ein Modell) der Realität geschaffen, indem wir nur einen Ausschnitt an Eigenschaften der realen Produkte in Software übersetzt haben, die in unserer Domäne eine Rolle spielen. Dieses von der realen Welt abstrahierte Modell ist damit vollständig angelegt.

Um auf die im Backend angelegten Objekte zugreifen zu können, legen wir ein Repository für Produkte an. Das Tx_Inventory_Domain_Repository_ProductRepository ist ein Objekt, in dem die Produkte »abgelegt« sind. Wir können ein Repository auffordern, alle (oder bestimmte) Produkte zu finden und an uns zu übergeben. Die Repository-Klasse ist in unserem Fall sehr kurz:

<?php
class Tx_Inventory_Domain_Repository_ProductRepository
      extends Tx_Extbase_Persistence_Repository {}
?>

Unser ProductRepository muss von Tx_Extbase_Persistence_Repository abgeleitet werden und erbt von diesem alle Methoden. Es kann daher in unserem einfachen Beispiel leer bleiben. Die Klassendatei ProductRepository.php legen wir in den Ordner EXT:inventory/Classes/Domain/Repository/ ab.