Extra User-Felder speichern
Eingetragen von dawehner (2639)
am 14.05.2008 - 00:16 Uhr in
am 14.05.2008 - 00:16 Uhr in
Ich habe ein Module geschrieben was viele Felder zum User-Objekt dazufügt. Eins davon soll immer geladen werden, deshalb speichere ich es in $user->data, dort muss es auch bleiben.
Mit folgedem Code erreiche ich, dass die Werte des Feldes extra_option in $user->data gespeichert werden.
<?php
function hook_user($op...) {
switch ($op) {
case 'submit':
$edit['data'] = $edit['extra_option'];
}
?>
Soweit funktioniert das ganze gut, jedoch funktioniert das ganze nur bei der Registrierung. Beim Bearbeiten des Users und anschließendem Speichern kommt jedoch folgendes:
* warning: mysql_real_escape_string() expects parameter 1 to be string, array given in /home/httpd/html/drupal/includes/database.mysql.inc on line 400.
* user warning: Duplicate entry '345' for key 2 query: UPDATE users SET timezone = '0', name = '345', mail = '345@example.com', status = '1', theme = '', signature = '', data = '', access = '', data = '' WHERE uid = 0 in /home/httpd/html/drupal/includes/database.mysql.inc on line 172.
Und das veränderte Formfeld wird nicht gespeichert. Es wäre furchtbar net, wenn jemand den Fehler wüsste // Sonst funktioniert alles prima im Module
- Anmelden oder Registrieren um Kommentare zu schreiben
Wie sieht der Rest von
am 14.05.2008 - 03:41 Uhr
Wie sieht der Rest von hook_user aus? $edit['extra_option'] ist ein array?
Änderst du irgendwo $user? Die Fehlermeldung kommt ja beim Speichern eines existierenden Users, der Query versucht allerdings die Daten eines Users mit der uid 0 zu aktualisieren, was nicht klappen kann, da die uid > 0 sein muss. Deshalb vermutlich auch das user warning bezüglich Duplicate entry '345' for key 2, da der User mit diesem Namen ja schon existiert, allerdings mit einer anderen uid.
<?phpfunction
am 14.05.2008 - 12:26 Uhr
<?php
function userextra_user($op, &$edit, &$account, $category = NULL) {
switch ($op) {
case 'register':
$form = userextra_form();
return $form;
case 'form':
$form = userextra_form($account);
return $form;
case 'submit':
$edit['data'] = $edit['extra_option'];
case 'validate':
//Schaut ob der Name länger als 12 Zeichen lang ist
if (strlen($edit['name']) > 12) {
form_set_error('name', t("the name is too long"));
}
// Sucht nach Leerzeichen
if (eregi(" ", $edit['name']) != false) {
form_set_error('name', t('the name cannot have spaces'));
}
case 'view':
return userextra_view($account);
}
}?>
Ein dsm von edit ergibt
Array
(
[timezone] => 0
[name] => 345
[mail] => 345@example.com
[pass] =>
[status] => 1
[extra_option] => Array
(
[0] => Array
(
[0] => Array
(
[1] => 1
)
[1] => Array
(
[1] => 1
)
[2] => Array
(
[1] => 1
)
)
[1] => Array
(
[0] => Array
(
[0] => 1
[1] => 0
)
[1] => Array
(
[1] => 1
)
[2] => Array
(
[0] => 1
[1] => 0
)
)
[2] => Array
(
[0] => Array
(
[1] => 1
)
[1] => Array
(
[0] => 1
[1] => 0
)
[2] => Array
(
[1] => 1
)
)
)
[theme] =>
[signature] =>
)
Mich wundert das ganze, da bei der Registrierung die Daten perfekt gespeichert werden, habe ich vlt einen Hook vergessen?
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Mehr geraten als gewusst
am 14.05.2008 - 12:28 Uhr
UPDATE users SET timezone = '0', name = '345', mail = '345@example.com', status = '1', theme = '', signature = '',
data = '', access = '', data = '' WHERE uid = 0
Das update für data ist doppelt - ist das Absicht?