.. You may want to use the usual include line. Uncomment and adjust the path. .. include:: ../Includes.txt ===================== EXT: uk\_db\_tutorial ===================== :Author: Kasper Skårhøj :Created: 2002-11-01T00:32:00 :Changed by: Syrcam :Changed: 2008-05-27T14:30:26 :Author: Eike Starkmann :Email: starkmann@undkonsorten.com :Info 3: :Info 4: .. _EXT-uk-db-tutorial: EXT: uk\_db\_tutorial ===================== Extension Key: **my\_extension\_key** Copyright 2000-2002, Eike Starkmann, starkmann@undkonsorten.com> This document is published under the Open Content License available from http://www.opencontent.org/opl.shtml The content of this document is related to TYPO3 \- a GNU/GPL CMS/Framework available from www.typo3.com .. _Table-of-Contents: Table of Contents ----------------- **EXT: uk\_db\_tutorial 1** **Introduction 1** What does it do? 1 Screenshots 1 **Tutorial 3** Worum geht es hier genau? 3 N:M Relation 3 N:M Relation mit Attributen 5 Weiterführende Links 9 .. _Introduction: Introduction ------------ .. _What-does-it-do: What does it do? ^^^^^^^^^^^^^^^^ Der Kickstarter für TYPO3-Extensions gibt einem Entwickler viele Möglichkeiten Datenbanken anzulegen, sogar MM Tabellen. Aber leider lassen sich viele Funktionen die modernes Datenbankdesign bietet mit dem Kickstarter nicht umsetzen. Dieser Artikel gibt einen Einblick, wie in TYPO3 die wichtigsten Relation zwischen Tabellen - M zu M - N zu M - N zu M mit Attributen angelegt werden können. Auf 1:N Relationen wird hier nicht eingegangen, da diese vom Kickstarter voll unterstützt und einfach zusammen geklickt werden können. .. _Screenshots: Screenshots ^^^^^^^^^^^ in Beispiel der gewünschten Datenbankrelation: |img-1| Ein Beispiel: N zu M Relation mit Attributen |img-2| Bearbeitung der Firma: |img-3| Bearbeitung des Mitarbeiters: |img-4| .. _Tutorial: Tutorial -------- .. _Worum-geht-es-hier-genau: Worum geht es hier genau? ^^^^^^^^^^^^^^^^^^^^^^^^^ Fangen wir mit einem einfachen Beispiel an. Für eine Freelancer- Datenbank die mit TYPO3 umgesetzt werden soll brauchen wir zwei Datensatztypen: - Mitarbeiteroder Freelancer sowie - Firmenbei für die diese Mitarbeiter gerade arbeiten. Logischerweise sollen diese Daten miteinander verknüpft werden können. Mitarbeiterarbeiten für verschiedenen Firmenund für Firmen arbeiten verschiedenen Mitarbeiter. Nun soll die Eingabe der Verbindungen Mitarbeiter-Firmaso flexibel sein, dass wir sie von beiden Seiten aus bearbeiten können. Wird also zum Beispiel einem Mitarbeiter-Datensatz A eine Firma B zugeordnet, so sieht man auch im Firmen-Datensatz B, dass der Mitarbeiter bei der Firma arbeitet. Man kann so die Verbindung zwischen dem Mitarbeiter und der Firma sowohl beim Bearbeiten des Firmen-, als auch des Mitarbeiter-Datensatzes wieder lösen. Ferner kann natürlich der Firma B ein Mitarbeiter C zugeordnet werden und im Mitarbeiter-Datensatz C erscheint dann automatisch die Firma B. In einem weiteren Schritt werden wir auch noch erklären, wie man der Verbindung noch weitere Eigenschaften wie Werksvertrag, studentische Hilfskraftoder freier Mitarbeiterhinzufügt. Doch bereits das erste Szenario ist mit dem TYPO3-Kickstarter nicht mehr möglich: Wird mit dem eine Tabelle Firma angelegt mit dem Feld Mitarbeiter (Relation zu Mitarbeiter) und ein Mitarbeiter mit dem Feld Firma, so macht der Kickstarter daraus zwei M:M Tabellen. Es ist aber klar, dass sowohl Mitarbeiter als auch Firma über ein und dieselbe Relationstabelle verknüpft werden müssen, um die gewünschte, oben beschriebene Funktionalität zu erhalten. Dies wird ermöglicht mit ‘foreign\_table’ =>”und ‘foreign\_field’ => ”welche in der tca.phpder Extension definiert werden können. .. _N-M-Relation: N:M Relation ^^^^^^^^^^^^ Ein Beispiel der gewünschten Datenbankrelation: |img-1| Ein Projekt-Mitarbeiter kann für mehrere verschiedene Firmen arbeiten und eine Firma hat mehrere verschieden Mitarbeiter. Zunächst werden beide Tabellen im Kickstarter angelegt: |img-5| In der Tabelle Mitarbeiterwird nun eine Relation zur Tabelle Firmadefiniert: |img-6| In der Tabelle Firmawird eine Relation zur Tabelle Mitarbeiterdefiniert: |img-6| Beide Relationen müssen als True M-M relationsmarkiert werden, da sonst keine extra Relationstabelle angelegt wird. Das beidseitige Anlegen von Mitarbeiter und Firma ermöglicht später das beidseitige Editieren (siehe oben). Schaut man sich nun die ext\_tables.sql der Exension an, erkennt man, dass zwei MM Relationstabellen angelegt werden. Eine für die Richtung Mitarbeiter->Firmaund eine für Firma->Mitarbeiter:ext\_tables.sql CREATE TABLE tx\_ukdbtutorial\_mitarbeiter\_firma\_mm (uid\_local int(11) DEFAULT ‘0′ NOT NULL,uid\_foreign int(11) DEFAULT ‘0′ NOT NULL,tablenames varchar(30) DEFAULT ” NOT NULL,sorting int(11) DEFAULT ‘0′ NOT NULL,KEY uid\_local (uid\_local),KEY uid\_foreign (uid\_foreign)); CREATE TABLE tx\_ukdbtutorial\_firma\_mitarbeiter\_mm (uid\_local int(11) DEFAULT ‘0′ NOT NULL,uid\_foreign int(11) DEFAULT ‘0′ NOT NULL,tablenames varchar(30) DEFAULT ” NOT NULL,sorting int(11) DEFAULT ‘0′ NOT NULL,KEY uid\_local (uid\_local),KEY uid\_foreign (uid\_foreign)); Es werden aber nicht beide benötigt, daher kann getrost eine Tabelle aus der Datei gelöscht werden, z.B. tx\_ukdbtutorial\_firma\_mitarbeiter\_mm. Außerdem muss bei der Relationstabelle ein Feld hinzugefügt werden: sorting\_foreign int(11) DEFAULT ‘0′ NOT NULL. Dies ermöglicht das unterschiedliche Sortieren der Datensätze auf beiden Seiten und muss erstellt werden, da TYPO3 danach verlangt.Das Resultat sieht dann also so aus: CREATE TABLE tx\_ukdbtutorial\_mitarbeiter\_firma\_mm (uid\_local int(11) DEFAULT ‘0′ NOT NULL,uid\_foreign int(11) DEFAULT ‘0′ NOT NULL,tablenames varchar(30) DEFAULT ” NOT NULL,sorting int(11) DEFAULT ‘0′ NOT NULL,sorting\_foreign int(11) DEFAULT ‘0′ NOT NULL,KEY uid\_local (uid\_local),KEY uid\_foreign (uid\_foreign)); Jetzt muss noch dafür gesorgt werden, dass sowohl Firmaals auch Mitarbeiterauf dieselbe Relationstabelle zugreifen: $TCA[”tx\_ukdbtutorial\_firma”] = array (“mitarbeiter” => Array (“exclude” => 1,“label” => “LLL:EXT:uk\_db\_tutorial/locallang\_db.xml :tx\_ukdbtutorial\_firma.mitarbeiter”,“config” => Array (“type” => “group”,“internal\_type” => “db”,“allowed” => “tx\_ukdbtutorial\_mitarbeiter”,“size” => 10,“minitems” => 0,“maxitems” => 10,“MM” => “tx\_ukdbtutorial\_firma\_mitarbeiter\_mm”,) wird geändert in: $TCA[”tx\_ukdbtutorial\_firma”] = array (“mitarbeiter” => Array (“exclude” => 1,“label” => “LLL:EXT:uk\_db\_tutorial/locallang\_db.xml :tx\_ukdbtutorial\_firma.mitarbeiter”,“config” => Array (“type” => “group”,“internal\_type” => “db”,“allowed” => “tx\_ukdbtutorial\_mitarbeiter”,“size” => 10,“minitems” => 0,“maxitems” => 10,“MM” => “tx\_ukdbtutorial\_mitarbeiter\_firma\_mm”,“MM\_opposite\_field” => “mitarbeiter”,) “MM” => “tx\_ukdbtutorial\_mitarbeiter\_firma\_mm” ist die zu benutzende Relationstabelle, sie muss sowohl bei Mitarbeiter als auch bei Firma dieselbe sein.“MM\_opposite\_field” => “mitarbeiter”sorgt dafür das die uids in der Relationstabelle nicht vertauscht werden .Diese Relation ist jetzt eigentlich eine N:M Relation da, z.B. mehrere Mitarbeiter einer Firma zugeordnet werden können, die Anzahl der Zuordnungen auf beiden Seiten aber nicht gleich sein muss. Möchte man dies haben sollten die Max number of relationsim Kickstarter passend gesetzt werden. .. _N-M-Relation-mit-Attributen: N:M Relation mit Attributen ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ein Mitarbeiter kann in mehreren Firmen arbeiten, in diesen kann er bestimmte Positionen, z.B. Werksvertrag, studentische Hilfskraft, fester freier Mitarbeiterbesitzen. Dies sind die Attribute. Ein Beispiel: N zu M Relation mit Attributen |img-2| Es ist kann aber vorkommen, das ein Mitarbeiter in der Firma A einen Werksvertrag hat und in der Firma B studentische Hilfskraft ist. Es ist also nicht möglich die Position des Mitarbeiters in einem Feld in der Tabelle Mitarbeiter zu speichern, da die Position von der jeweiligen Firma abhängt. Das Attribut Positionmuss also in der Relationstabelle gespeichert werden. Dies lässt sich am besten mit Inline Rational Relation Editing (IRRE)realisieren: Zunächst legt man zwei neue Tabellen an: Mitarbeiter2und Firma2. Dies kann exakt, wie oben beschrieben, mit Hilfe des Kickstarters erfolgen. Jetzt müssen wieder die tca.phpund die ext\_tables.sqleditiert werden:ext\_tables.sql: CREATE TABLE tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm (uid int(11) NOT NULL auto\_increment,pid int(11) DEFAULT ‘0′ NOT NULL,tstamp int(11) DEFAULT ‘0′ NOT NULL,tablenames varchar(30) DEFAULT ” NOT NULL,sorting int(11) DEFAULT ‘0′ NOT NULL,position tinytext NOT NULL,mitarbeiterid int(11) DEFAULT ‘0′ NOT NULL,firmaid int(11) DEFAULT ‘0′ NOT NULL,crdate int(11) DEFAULT ‘0′ NOT NULL,cruser\_id int(11) DEFAULT ‘0′ NOT NULL,deleted tinyint(4) DEFAULT ‘0′ NOT NULL,PRIMARY KEY (uid),KEY parent (pid));); Die zweite Relationstabelle tx\_ukdbtutorial\_firma2\_mitarbeiter\_mmkann wieder gelöscht werden. Wir benötigen jetzt das neue Feld positionund 2 Felder zu Steuerung mitarbeiteridund firmaid. uid\_localund uid\_foreignwerden als Felder nicht mehr benötigt, dafür aber eine uid und eine pid. Die uid ist wie immer der Primary Key und wird daher auf auto\_increment gesetzt.cruser, tstamp, deletedund crdatewerden von TYPO3 benötigt.Man sieht jetzt schon das die Relationstabelle nicht mehr klassisch aufgebaut ist , sondern wie eine ganz normale “Datensatz”-Tabelle., dazu später mehr. In der tca.phpmuss nun etwas mehr geändert werden: $TCA[”tx\_ukdbtutorial\_mitarbeiter2″] = array (“interface” => array (“showRecordFieldList” => “hidden,name,firma”),“firma” => Array (“exclude” => 1,“label” => “LLL:EXT:uk\_db\_tutorial/locallang\_db.xml :tx\_ukdbtutorial\_mitarbeiter2.firma”,“config” => Array (‘type’ => ‘inline’,‘foreign\_table’ => ‘tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm’,‘foreign\_field’ => ‘mitarbeiterid’,‘foreign\_label’ => ‘firmaid’,),),$TCA[”tx\_ukdbtutorial\_firma2″] = array (“interface” => array (“showRecordFieldList” => “hidden,name,mitarbeiter”),“mitarbeiter” => Array (“exclude” => 1,“label” => “LLL:EXT:uk\_db\_tutorial/locallang\_db.xml:tx\_ukdbtutor ial\_firma2.mitarbeiter”,“config” => Array (‘type’ => ‘inline’,‘foreign\_table’ => ‘tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm’,‘foreign\_field’ => ‘firmaid’,‘foreign\_label’ => ‘mitarbeiterid’,),), type’ => ‘inline’: Jetzt wird nicht länger die Groupbox von TYPO3 benutzt, sondern IRRE. Das heißt, dass Kinderelemente oder Relationen direkt in dem Mitarbeiter bzw. der Firma angelegt werden können.foreign\_table’ =>: Definiert welche Relationstabelle benutzt wird, muss auch hier wieder gleich sein.Achtung es darf kein “MM” =>benutzt werden, da dann keine Attribute mehr unterstützt werden. Außerdem muss die Relationstabelle in der tca.phpdefiniert werden: $TCA[’tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm’] = Array(“ctrl” => $TCA[”tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm”][”ctrl”],“interface” => Array (“showRecordFieldList” => “mitarbeiterid,firmatid,position”),“feInterface” => $TCA[”tx\_ukdbtuto rial\_mitarbeiter2\_firma\_mm”][”feInterface”],‘columns’ => Array(‘mitarbeiterid’ => Array(‘label’ => ‘LLL:EXT:uk\_db\_tutorial/lo callang\_db.xml:tx\_ukdbtutorial\_mitarbeiter2′,‘config’ => Array(‘type’ => ’select’,‘foreign\_table’ => ‘tx\_ukdbtutorial\_mitarbeiter2′,’size’ => 1,‘minitems’ => 0,‘maxitems’ => 1,),),‘firmaid’ => Array(‘label’ => ‘LLL:EXT:uk\_db\_t utorial/locallang\_db.xml:tx\_ukdbtutorial\_firma2′,‘config’ => Array(“type” => “group”,“internal\_type” => “db”,“allowed” => “tx\_ukdbtutorial\_firma2″,“size” => 1,“minitems” => 1,“maxitems” => 1,)),‘position’ => Array(‘label’ => ‘LLL:EXT:uk\_db\_tutorial/locallan g\_db.xml:tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm.position’,‘config’ => Array(“type” => “input”,“size” => “30″,),),),“types” => Array (“0″ => Array(”showitem” => “hidden;;1,firmaid,mitarbeiterid,position”)),“palettes” => Array (“1″ => Array(”showitem” => “”))); Die Konfiguration für das Backend wurde hier so gestaltet, dass bestehende Mitarbeiter über eine Selectorbox und bestehende Firmen über eine eine Groupbox ausgewählt werden können.Die Eingabe der Position kann über ein normales Input Feld erfolgen. In der ext\_tables.phpwird nun ebenfalls die Relationstabelle definiert: $TCA[”tx\_ukdbtutorial\_mitarbeiter2\_firma\_mm”] = Array (“ctrl” => Array (‘title’ => ‘LLL:EXT:uk\_db\_tutorial/locallang\_db.xml:tx\_ukdb tutorial\_mitarbeiter2\_firma\_mm’,‘label’ => ‘uid’,‘tstamp’ => ‘tstamp’,‘crdate’ => ‘crdate’,“dynamicConfigFile” => t3lib\_extMgm::extPath($\_EXTKEY).”tca.php”,“iconfile” => t3lib\_extMg m::extRelPath($\_EXTKEY).”icon\_tx\_ukdbtutorial\_firma2.gif”,),“feInt erface” => Array (“fe\_admin\_fieldList” => “mitarbeiterid, firmaid, position”,)); Jetzt müssen nur noch die Labels für die Relationstabelle in der locallang\_db.xmlgesetzt werden: Nun kann man das Resultat im Backend bewundern, das Ganze sieht dann wie folgt aus: |img-7| Wie man sieht , können, jetzt auch die Relation an sich bearbeitet werden. Sie erscheinen in dem Sysordner als regulärer Datensatz. Bearbeitung der Firma: |img-3| Bearbeitung des Mitarbeiters: |img-4| Zum Verständnis:Neu anlegenmeint in diesem Fall das Neuanlegen einer Relation, es können keine neuen Firmen innerhalb eines Mitarbeiters angelegt werden, sondern nur bestehende ausgewählt werden. |img-8| Man kann IRRE aber auch so konfigurieren, das neue Kindelemente direkt angelegt werden können. .. _Weiterfhrende-Links: Weiterführende Links ^^^^^^^^^^^^^^^^^^^^ `Näheres zu IRRE `_ `Ein sehr ausführliches Tutorial zu IRRE: `_ `Podcast zu IRRE `_ Es gibt noch sehr viele Möglichkeiten das Backend für die Datensätze zu gestalten: `TYPO3 Core Library `_ Dies Tutorial ist auf folgendem Blog erschienen: http://blog.undkonsorten.com/datenbankrelationen-typo3-irre- extension#more-194 |img-9| EXT: uk\_db\_tutorial - 9 .. ######CUTTER_MARK_IMAGES###### .. |img-1| image:: img-1.png :alt: Datenbankrelation Beispiel .. :align: bottom .. :border: 0 .. :height: 51 .. :id: Grafik1 .. :name: Grafik1 .. :width: 361 .. |img-2| image:: img-2.png :alt: TYPO3 Datenbankrelation - N zu M .. :align: bottom .. :border: 0 .. :height: 55 .. :id: Grafik2 .. :name: Grafik2 .. :width: 356 .. |img-3| image:: img-3.png :alt: TYPO3 Datenbankrelation - Backend N zu M - Firma .. :align: bottom .. :border: 0 .. :height: 270 .. :id: Grafik3 .. :name: Grafik3 .. :width: 443 .. |img-4| image:: img-4.png :alt: TYPO3 Datenbankrelation - Backend N zu M - Mitarbeiter .. :align: bottom .. :border: 0 .. :height: 299 .. :id: Grafik4 .. :name: Grafik4 .. :width: 443 .. |img-5| image:: img-5.png :alt: TYPO3 Datenbankrelation - Kickstarter .. :align: bottom .. :border: 0 .. :height: 61 .. :id: Grafik6 .. :name: Grafik6 .. :width: 191 .. |img-6| image:: img-6.png :alt: TYPO3 Datenbankrelation - Kickstarter #2 .. :align: bottom .. :border: 0 .. :height: 276 .. :id: Grafik7 .. :name: Grafik7 .. :width: 434 .. |img-7| image:: img-7.png :alt: TYPO3 Datenbankrelation - Backend N zu M .. :align: bottom .. :border: 0 .. :height: 221 .. :id: Grafik10 .. :name: Grafik10 .. :width: 392 .. |img-8| image:: img-8.png :alt: TYPO3 Datenbankrelation - Backend N zu M - Relation .. :align: bottom .. :border: 0 .. :height: 151 .. :id: Grafik13 .. :name: Grafik13 .. :width: 420 .. |img-9| image:: img-9.png .. :align: left .. :border: 0 .. :height: 32 .. :id: Graphic1 .. :name: Graphic1 .. :width: 102