Hallo,
ich habe eine eigene Extension. Dort werden Datensätze angelegt. Sobald ein neuer Datensatz gespeichert wird, soll nun eine page erstellt werden. Also im Verzeichnisbaum ein neuer Eintrag hinzukommen.
Soweit hab ich das mal umgesetzt:
In meiner ext_localconf.php habe ich dies eingetragen:
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:xxx_kunden/class.tx_xxx_kunden.php:tx_xxx_kunden_hook';
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamap_afterDatabaseOperations'][] = 'EXT:xxx_kunden/class.tx_xxx_kunden.php:tx_xxx_kunden_hook';
In der class.tx_xxx_kunden.php steht folgendes:
<?php
class tx_xxx_kunden_hook {
public function processDatamap_afterDatabaseOperations ($status,$table,$id,&$fieldArray,&$reference) {
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$hash = strtolower(md5(uniqid(rand(), true)));
$data['pages']['NEW' . substr($hash, 0, 8-)] = array(
'uid' => $page_uid,
'title' => $fieldArray['title'],
'hidden' => 0,
'pid' => 26,
'doktype' => 254,
'perms_userid' => 2,
'perms_groupid' => 2,
'perms_user' => 31,
'perms_group' => 27,
'cruser_id' => 1,
);
$tce->start($data, array());
$tce->process_datamap();
unset($data);
debug(func_get_args(),'TEST5');
}
}
?>
Jetzt wird beim speichern eines Datensatzes meiner Extension, zwar ein das Hook angestoßen, aber es werden 1400 pages angelegt. Eigentlich sollte nur eines angelegt werden.
Könnt Ihr mir sagen was ich falsch mache?
Besten Dank für Hilfe
Christian
ja - der hook wird ja bei jeder Operation ausgeführt.
Du darfst dort nicht speichern, das macht TCE ja eh. Der Hook dient nur der manipulation der daten
if ($table == $mytable) {
$fieldArray[whatever] = 'xyz';
}
mehr nicht.
Meinst Du in der Funktion?
Wo muss ich das den anwenden?
Wo wird da genau gespeichert?
Bitte um Hilfe
Christian
#
public function processDatamap_afterDatabaseOperations ($status,$table,$id,&$fieldArray,&$reference) {
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$hash = strtolower(md5(uniqid(rand(), true)));
$data['pages']['NEW' . substr($hash, 0, 8-)] = array(
'uid' => $page_uid,
'title' => $fieldArray['title'],
'hidden' => 0,
'pid' => 26,
'doktype' => 254,
'perms_userid' => 2,
'perms_groupid' => 2,
'perms_user' => 31,
'perms_group' => 27,
'cruser_id' => 1,
);
$tce->start($data, array());
$tce->process_datamap();
unset($data);
debug(func_get_args(),'TEST5');
}
}
ja klar in der Funktion.
Bei Dir wird bei jedem! Aufruf des hooks eine Seite angelegt, und das soll doch wohl nicht sein.
Was willst Du überhaupt erreichen, und vor allem in welcher Situation genau?
Ja genau, nur bin ich mir jetzt nicht klar wo ich die die Beschränkung reinmache. Ist die Funktion aber generell so richtig?
Reicht es wenn ich es um
$tce->start($data, array());
$tce->process_datamap();
mache?
Was passiert wenn der Datensatz schon mal gespeichert ist? Wird dann ein neuer angelegt, oder der alte überschreiben ?
Christian
also, da ich nicht weiss wann die Seite angelegt werden soll, kann ich auch nichts zur Beschränkung sagen
'uid' => $page_uid, ???
uid wird ermittelt, was Du aber setzen must ist pid für das Elternelement
$page_uid ist nirgends vorhanden
Und sicher, es wird immer eine neue angelegt, da musst Du Dich schon selber drum kümmern
t3lib_BEfunc::getSetUpdateSignal('updatePageTree');
sollte auch immer nach page-Anlegen aufgerufen werden.
Kann ich das steuern? Also wann die Seite angelegt werden soll?
Eigentlich sobald ich in meiner ext einen neuen Datensatz abspeichere. Dann hab ich eine eingene ID auf die ich verweisen kann.
Was ich nicht weis ist, wie das gesteuert wird.
Und wenn der Datensatz meiner ext nur editiert wird soll natürlich kein neuer pages Eintrag angelegt werden.
1. Anlegen speicher
2. nur Speichern
Das müsste ich ja dann in meiner ext_localconf.php festlegen, oder?
Christian
hatte ich doch schon geschrieben, werte $table aus
Kannst Du mir noch einen Tipp geben?
Warum kann ich denn in der Funktion keinen debug($table,'Table') setzen?
Christian
wenn das über Ajax aufgerufen wird, gibts keine Ausgaben, da der Header anders ist.
Ich helfe mir dann mit so einer Ausgabe:
file_put_contents('c:\t3log.txt',print_r($var,true));
Super Danke,
jetzt sehe ich etwas Licht am Ende des Tunnels ;-)
Besten Dank
Christian