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.
Grüße,
Robin
<?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?
-----------
Luca Curella
Kooperative Netze - Berlin