Daten schnell in der Datenbank speichern? Eine kleine userFunc hilft…
Für einen Kunden bei uns wurde innerhalb eines Java-Projektes im Hintergrund eine TYPO3 Seite aufgerufen, die die übergebenen GET-Parameter als fe_user Datensatz in der Datenbank speichern soll. Zuerst habe ich an powermail gedacht, habe mich aber letztlich für eine eigene userFunc entschieden. Dies funktioniert performant und ohne großen Aufriss.
Benutztes TypoScript:
includeLibs.user_in2database = EXT:in2database/user_in2database.php lib.in2database = USER_INT lib.in2database { userFunc = user_in2database->storeInDb userFunc { store { # enable or disable debug output _debug = TEXT _debug.value = 1 fe_users { # enable or disable storage _store = TEXT _store { value = 1 if.isTrue.data = GP:uid } # pid pid = TEXT pid { value = 123 } # uid uid = TEXT uid { data = GP:uid intval = 1 } # surename last_name = TEXT last_name { data = GP:name htmlSpecialChars = 1 } # firstname first_name = TEXT first_name { data = GP:firstname htmlSpecialChars = 1 } # usergroup usergroup = TEXT usergroup { data = GP:usergroup htmlSpecialChars = 1 } # password password = TEXT password { data = GP:password htmlSpecialChars = 1 } } } } } page.11 < lib.in2database |
Benutzte PHP Datei:
class user_in2database extends tslib_pibase { public $prefixId = 'tx_in2database'; // Same as class name public $extKey = 'in2database'; // The extension key. public function storeInDb($content = '', $conf = array()) { $cObj = t3lib_div::makeInstance('tslib_cObj'); $conf = $conf['userFunc.']; // TS configuration // generate array for db storage foreach ((array) $conf['store.'] as $table => $values) { // one loop for every database to store if (!stristr($table, '_debug')) { // not for debug mode foreach ((array) $values as $field => $fieldConfig) { // one loop for every field if (stristr($field, '.') || substr($field, 0, 1) == '_') { // ignore keys with . or with starting _ continue; } $arr[$field] = $cObj->cObjGetSingle($conf['store.'][$table][$field], $conf['store.'][$table][$field . '.']); // get value of this field } if ($cObj->cObjGetSingle($conf['store.']['_debug'], $conf['store.']['_debug.'])) { // if debug mode is activated t3lib_div::debug($arr, 'Tablename: ' . substr($table, 0, -1)); } else { $GLOBALS['TYPO3_DB']->exec_INSERTquery(substr($table, 0, -1), $arr); // insert into database } } } } } |
In meinem Beispiel wird die userFunc dem Objekt page.11 zugewiesen (also in der Regel das Objekt nach dem Seitenaufbau page.10). Die Seite könnte man z.B. so aufrufen:
http://www.domain.org/index.php?id=1&uid=22&name=Kellner&firstname=Alex
Über das TypoScript lassen sich Tabelle, Feldnamen und Feldwert einstellen. Eine kleine Debug-Ansicht ist auch mit integriert, wenn man sich das Ergebnis beim Aufruf der Seite erst einmal ansehen will.
Hinweis: Durch die Benutzung der API Funktion exec_INSERTquery() werden die Werte (im Gegensatz zu den Schlüsseln) automatisch escaped. Ich erzwinge in meinem TypoScript zwar Integer (für uid) bzw. htmlspecialchars (für die anderen dynamischen Werte), dies ist jedoch nicht zwingend nötig.
Vielleicht kann jemand dieses Mini-Plugin brauchen. Freue mich wie immer über Feedback.
Gruß, Alex (in2code.)