Hallo Benjamin,
Ich programmiere zur Zeit auch eine Veranstaltungsdatenbank, und fand Deine Frage sehr inspirierend. Herzlichen Dank! Ich habe mich sogar gleich drangesetzt und eine Lösung gefunden.
Meine Lösung:
1) in der tabelle veranstaltungen habe ich ein Feld Termine mit einer 1:n Beziehung (genau wie Du beschrieben hast, weak entity) zu der Tabelle tx_termine mit folgender config:
$TCA (Ausschnitt):
<?php
"termine" => Array (
"exclude" => 1,
"label" => "LLL:EXT:veranstaltungen/locallang_db.php:tx_veranstaltung.termine",
"config" => Array (
"type" => "select",
"size" => 10,
"minitems" => 0,
"maxitems" => 20,
"foreign_table" => "tx_termine",
"foreign_table_where" => "AND tx_termine.foreign_uid=###THIS_UID###"
"wizards" => Array(
"_PADDING" => 2,
"_VERTICAL" => 1,
"add" => Array(
...
?>
wichtig ist die zeile: "foreign_table_where" => "AND tx_termine.foreign_uid=###THIS_UID###"
damit hast du schon eine weak entity beziehung. das problem ist nun wie kriege ich die uid von der veranstaltung in die tabelle tx_termine, wenn man aus der veranstaltung einen neuen termin anlegt? das hat etwas gedauert bis bei mir der groschen fiel. zuerst habe ich gedacht das es über das wizard add skript (wizard_add.php) gehen würde, aber das war eine Sackgasse. Nach langem suchen hatte ich dann die idee das feld foreign_uid in der tabelle tx_termine als typ 'user' anzulegen. damit hat es dann geklappt (siehe step 2)
2) in der tabelle tx_termine habe ich das feld foreign_uid als typ 'user' angelegt (fid (Firmen-ID, Primary Key!) in Deiner Tabelle). in der user funktion habe ich dann ein hidden feld mit der aktuellen eltern uid zurückgegeben, so dass beim speichern des ganzen formulars das feld in die tabelle tx_termine abgespeichert wird! es sieht zwar etwas unschön aus, wenn ein hiddenfeld zurückgegeben wird, weil da automatisch ein normales be feld mit label und tabelle drumrum gewrapt wird, aber ich kann damit leben (der kunde hoffentlich auch). als letztes musste ich noch sicherstellen, dass die foreign_uid nicht belegt ist, weil man die Termine auch direkt bearbeiten kann! in diesem fall wird die (existierende) foreign_uid als hidden feld zurückgegeben.
Beispiel:
$TCA:
<?php
'foreign_uid' => Array (
'exclude' => 1,
'config' => Array (
'type' => 'user',
'userFunc' => 'tx_veranstaltungen_tcaTypeUser->hiddenUID',
)
),
?>
die Klasse:
<?php
class tx_veranstaltungen_tcaTypeUser {
function hiddenUID($PA, $fobj) {
if (empty($PA['row']['foreign_uid'])) {
# create new date or doc
$getParams = explode('&',t3lib_div::_GET('returnUrl'));
foreach ($getParams as $key) {
$temp = explode("=",$key);
$getParams[$temp[0]]=$temp[1];
}
return '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.$getParams['P[uid]'].'" />';
} else {
# edit date or doc
return '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.$PA['row']['foreign_uid'].'" />';
}
}
}
Anmerkung: die eltern uid hole ich mir von der returnUrl, das ist nicht gerade schön, aber es funktionert!
3) fürs löschen habe ich den Hook processCmdmap_preProcess in der klasse tcemain benutzt. siehe auch tt_news.
Beispiel:
die Registrierung des Hooks in der ext_localconf.php
<?php
# Register t3lib_tcemain processCmdmapClass (processCmdmap_preProcess) hook
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['0'] = 'EXT:veranstaltungen/pi1/class.tx_tcemain.php:tx_tcemain';
?>
die Klasse:
<?php
class tx_tcemain {
function processCmdmap_preProcess($command, $table, $id, $value, &$pObj) {
if ($command == 'delete' && $table == 'tx_termine') {
# alle Termine dieser Veranstaltung löschen
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tx_termine','foreign_uid='.$id);
$result = array();
while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
$pObj->deleteRecord('tx_termine',$row['uid'], 0);
}
}
}
}
?>
Und es funktioniert! Ich kann aus jeder Veranstaltung heraus mehrere Termine anlegen, die Veranstaltung kennt nur zugehörige Termine, wenn ich eine Veranstaltung lösche, werden alle zugehörigen Termine gelöscht. Perfekt! Getestet auf T3 3.8.0.
Ich hab oft in die T3 Core Api geguckt, und kann das nur empfehlen: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Index.html
Viele Grüße,
T.