Hallo zusammen,
ich habe mir ein kleines Frontend Plugin geschrieben, das mir ein paar Datensätze formatiert ausgibt. Ein paar einfache Kontaktdaten. Jetzt hab ich zusätzlich ein Backendmodul geschrieben, mit dem ich diese Datensätze erstellen will. Prinzipiell also das Gleiche, als würde ich die "Neu" Funktion nutzen. Der Grund warum ich ein eigenes Backendmodul haben will ist der, dass ich an einer Stelle in der Tabelle einen String mit mehreren Informationen speichere, der für die Frontendausgabe erst geparsed werden muss. Um dieses einfache "Protokoll" für den String nicht immer von Hand einzugeben, wollt ich das Backendmodul schreiben, das die entsprechenden Trennzeichen einfügt.
Mit exec_INSERTquery könnt ich den Datensatz zwar in der Tabelle eintragen, aber das müsste doch auch besser gehen. Insbesondere will ich nicht noch zusätzlich eine Verwaltung für die UIDs und tstamp usw. übernehmen. Welche Funktionen bietet Typo einem da?
Danke
Dafür brauchst du doch kein eigenes BE-Modul. Wenn du Daten vor dem Speichern in die DB manipulieren willst, dann musst du einen Hook für die TCE schreiben.
In der ext_localconf.php deiner Extension bindest du die Hook-Klasse ein:
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:' . $_EXTKEY . '/hooks/class.tx_extkey_hooks_tce.php:tx_extkey_hooks_tce';
Und hier ein Rahmen für die Hook-Klasse. Man muss natürlich nur die Methoden implementieren, die man benötigt.
/**
* Hook-Klasse
*/
class tx_extkey_hooks_tce {
/**
* Bearbeitung von Daten vor dem Speichern in der Datenbank.
* Wichtig: in dieser PreProcess kommen noch alle Daten aus dem Formular an. Diese
* werden anschließend von der TCE mit der Datenbank abgeglichen. In der PostProcess
* landen dann nur noch geänderte Daten.
*/
function processDatamap_preProcessFieldArray(&$incomingFieldArray, $table, $id, &$tcemain) {
if($table == 'tx_extkey_daten' && count($incomingFieldArray)>1) {
...
}
}
/**
* Nachbearbeitungen, unmittelbar BEVOR die Daten gespeichert werden. Das POST bezieht
* sich auf die Arbeit der TCE und nicht auf die Speicherung in der DB.
*
* @param string $status new oder update
* @param string $table Name der Tabelle
* @param int $id UID des Datensatzes
* @param array $fieldArray Felder des Datensatzes, die sich ändern
* @param tce_main $tcemain
*/
function processDatamap_postProcessFieldArray($status, $table, $id, &$fieldArray, &$tcemain) {
if($table == 'tx_extkey_daten') {
$preis = doubleval($fieldArray['preis']) * 100;
$fieldArray['preis'] = $preis;
}
}
/**
* Nachbearbeitungen, unmittelbar NACHDEM die Daten gespeichert wurden.
*
* @param string $status new oder update
* @param string $table Name der Tabelle
* @param int $id UID des Datensatzes
* @param array $fieldArray Felder des Datensatzes, die sich ändern
* @param tce_main $tcemain
*/
function processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, &$tcemain) {
// Bei neuen Datenstätzen gleich die UID ermitteln
$id = ($status == 'new') ? $tcemain->substNEWwithIDs[$id] : $id;
...
}
}
Danke für die Antwort. An einen Hook hab ich auch schon gedacht, hätte aber trotzdem gerne ein Backend Modul. Die Typo Api muss doch etwas hergeben, um Datensätze zu speichern...???
insertquery ist schon das richtige!
georg
Dank dir für die flotte Antwort. Hab gehofft dass InserQuery das richtige ist :-)
Meine Frage ist jetzt noch, wie ich optimal die Felder: UID,PID,tstamp, crdate und cruser_id fülle.
PID und cruser_id sind eigentlich klar. Für PID benutze ich die, dem Backendmodul übergeben ID und für cruser_id die des eingeloggten BackendUsers. Aber ich weiß nicht, wie ich optimal an die anderen komme. Da gibts doch bestimmt auch was in der Api oder?
OK habs fast... Mit time() krieg ich die richtigen tstamps. Aber hab noch keinen Weg gefunden, die ID des angemeldeten Backend Users rauszukriegen 😢
Hab gestern noch folgendes gefunden das ebenfalls funktioniert:
$GLOBALS['BE_USER']->user['ses_userid']
Ich weiß noch nicht genau, wo der der Unterschied zu
$BE_USER->user['uid']
ist. Werd ich wohl nachher mal in der Quellcode gucken müssen. Das ärgert mich momentan noch ein bisl an Typo. Es ist wirklich schwer etwas passendes in der Api zu finden. Gibts vielleicht sowas wie ne Api über die globalen Variablen? Wie geht ihr auf Suche? Durch die Source durchgraben?
Also ganz ehrlich, wenn man im BE Daten speichern will, dann sollte man die TCE verwenden und nicht selber die Inserts zusammenbasteln. #paralyzed# Die TCE weiß z.B. selber die aktuelle Uhrzeit und kennt auch den BE-Nutzer. Darüber hinaus weiß sie auch, ob der BE-Nutzer überhaupt ein bestimmtes Feld bearbeiten darf. Änderungen werden auch gleich mitgeloggt und können bei Bedarf wieder zurückgesetzt werden.
Das bekommt man alles geschenkt, ohne eine Zeile Code dafür extra schreiben zu müssen. Man baut lediglich ein kleines Array mit den Daten zusammen, die man speichern will und übergibt es der TCE:
$data['tx_extkey_tabellenname'][$uid]['feldname'] = 'einWert';
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$tce->start($data,array());
$tce->process_datamap();
Ausführlich kann man das in der TYPO3 Core API nachlesen.
digedag schrieb
$data['tx_extkey_tabellenname'][$uid]['feldname'] = 'einWert';
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$tce->start($data,array());
$tce->process_datamap();
Ich wollte nun auch mal TCEmain probieren und dachte dass man da ja nicht wirklich was falsch machen kann... Folgender Code:
protected function storeMd5InDb($hash, $userID) {
global $BE_USER;
$table = $this->hashTable;
$uid = 'NEW'.uniqid();
$data[$table][$uid] = array(
'lhash' => $hash,
'tstamp' => time(),
'crdate' => time(),
'fe_user' => $userID
);
$tce = t3lib_div::makeInstance('t3lib_TCEmain');
$tce->stripslashes_values = 0;
$tce->start($data,array());
$tce->process_datamap();
unset($tce);
}
...verursacht leider keinen Eintrag in der Datenbank, wenngleich das $data-Array korrekt gefüllt ist. Da process_datamap() keinen Rückgabewert hat fehlt mir momentan auch die Idee zum debuggen.
Sieht jemand einen Fehler oder hat einen Hinweis zum Debuggen?
Danke...