.. 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