Feld der Registrierung in die profile_values der Datenbank eintragen
am 26.06.2011 - 16:53 Uhr in
Hallo,
ich habe mittels:
<?php
$fid='46';
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid1, $user->uid, $user->name);
?>
im insert Pfad der profile.module es erreicht, dass der Username in der Datenbank unter profile_values eingetragen wird.
Jetzt habe ich noch ein anderes Feld welches dem Standardprofil zugewiesen ist und deshalb dem Unternehmensprofil nicht zur Verfügung steht. Nun habe ich im Unternehmensprofil ein Feld angelegt und möchte das Feld der Registrierung auch automatisch in die Datenbank eintragen. Leider schlagen alle versuche Fehl, weil ich zwar weiss, dass das Feld unter $account->profile_a1 aufzurufen ist dies aber nicht direkt bei der Registrierung zur Verfügung steht. Ein Versuch die Daten ala
<?php
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $user->uid, $account->profile_a1);
?>
zu speichern funktioniert nicht. Das Feld values wird dabei leer bleiben. Hat vielleicht jemand eine Hinweis für mich?
Dies ist der HTML Code der Registrierung:
<input type="text" maxlength="255" name="profile_a1" id="edit-profile-a1" size="60" value="" class="form-text required">
- Anmelden oder Registrieren um Kommentare zu schreiben
Lass dir doch erstmal die
am 27.06.2011 - 18:06 Uhr
Lass dir doch erstmal die übergebenen Werte ausgeben, um zu schauen, ob denn überhaupt etwas übergeben wird und pb der Wert profile_a1 überhaupt schon im account Objekt vorhanden ist.
Dies kannst du in PHP mittels echo oder print_r bzw über das Devel Modul mit dem dsm Befehl machen..
SteffenR
http://www.twitter.com/_steffenr
Drupal-Initiative e.V.
Die Werte werden nicht
am 27.06.2011 - 21:50 Uhr
Die Werte werden nicht übergeben. profile_a1 ist noch nicht im Objekt vorhanden. Aber was nun? Ich habe in der profile.module im insert Pfad eine echo Anweisung geschrieben. Es wird nichts angezeigt weder Variabln noch Text. In der Reg Bestätigungsseite werden die Variablen aber auch nicht angezeigt. Da der Eintrag in die Datenbank funktioniert nur halt nicht für den Wert, denke ich das das Objekt $account->profile_a1 nicht zur Verfügung steht im Insert der Registrierungsdaten. Aber wie kann ich diese Variable $profile_a1 aus dem Formular dennoch in die Datenbank schreiben?
<?php
function profile_user($type, &$edit, &$user, &$account, $category = NULL) {
switch ($type) {
case 'load':
return profile_load_profile($user);
case 'register':
return profile_form_profile($edit, $user, $category, TRUE);
case 'update':
return profile_save_profile($edit, $user, $category);
case 'insert':
$fid='45';
$fid1='46';
$fid2='47';
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid, $user->uid, $user->name);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid1, $user->uid, $user->name);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $user->uid, $account->profile_a1);
return profile_save_profile($edit, $user, $category, TRUE);
?>
So habe ich den insert Pfad modifiziert. die ersten Beiden inserts in die Datenbank werden ausgeführt, d.h der Username wird eingetragen.
Zitat:So habe ich den insert
am 27.06.2011 - 23:10 Uhr
So habe ich den insert Pfad modifiziert. die ersten Beiden inserts in die Datenbank werden ausgeführt, d.h der Username wird eingetragen.
Klar, weil der Username immer im User-Object vorhanden ist, im Gegensatz zu Profil-Werten, die sind erst im Objekt vorhanden, wenn man das Profil auch geladen hat. Und da bei dir nie das Profil für $account geladen wird, hast du auch keinen Zugriff auf die Werte. Das wäre zumindest meine Theorie.
Versuch doch mal, vor dem Insert das hier auszuführen:
<?php profile_load_profile($account); ?>
Sodass das ganze am Schluss z. B. so aussieht:
<?php
function profile_user($type, &$edit, &$user, &$account, $category = NULL) {
switch ($type) {
case 'load':
return profile_load_profile($user);
case 'register':
return profile_form_profile($edit, $user, $category, TRUE);
case 'update':
return profile_save_profile($edit, $user, $category);
case 'insert':
$fid='45';
$fid1='46';
$fid2='47';
// Profil für $account laden
profile_load_profile($account);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid, $user->uid, $user->name);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid1, $user->uid, $user->name);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $user->uid, $account->profile_a1);
return profile_save_profile($edit, $user, $category, TRUE);
?>
Kann allerdings sein, dass du zu dem Zeitpunkt noch keinen Zugriff auf das Profil hast, wenn die Daten des Profils noch nicht gespeichert sind, das musst du einfach mal probieren.
Ich finde den Weg aber immer noch nicht in Ordnung ;-)
Edit:
Ich habe gerade nochmal deinen Beitrag oben angeschaut und den HTML-Code für die Registrierung gesehen. Wie genau kommt denn das Input-Feld eigentlich dort rein? Hast du das selbst eingetragen?
Das hat leider nicht
am 28.06.2011 - 20:25 Uhr
Das hat leider nicht funktioniert. Das Core Modul profile ermöglicht es der Registrierung Felder hinzuzufügen. Das Feld profile_a1 habe ich "als bei der Registrierung notwendiges Feld" markiert. Deshalb wird dieser Code generiert.
<?php
<form action="/user/register" accept-charset="UTF-8" method="post" id="user-register" enctype="multipart/form-data">
<div><fieldset><legend>Kontoinformationen</legend><div class="form-item" id="edit-name-wrapper">
<label for="edit-name">Benutzername: <span class="form-required" title="Dieses Feld wird benötigt.">*</span></label>
<input type="text" maxlength="60" name="name" id="edit-name" size="60" value="" class="form-text required">
<div class="description">Bitte geben Sie als Benutzernamen Ihren Vor- und Nachnamen oder Ihren Firmennamen an. Leerzeichen sind erlaubt.</div>
</div>
<div class="form-item" id="edit-mail-wrapper">
<label for="edit-mail">E-Mail-Adresse: <span class="form-required" title="Dieses Feld wird benötigt.">*</span></label>
<input type="text" maxlength="64" name="mail" id="edit-mail" size="60" value="" class="form-text required">
<div class="description">Eine gültige E-Mail-Adresse. Alle E-Mails der Website werden an diese Adresse geschickt. Die Adresse wird nicht veröffentlicht und wird nur verwendet, wenn Sie ein neues Passwort anfordern oder wenn Sie einstellen, bestimmte Informationen oder Benachrichtigungen per E-Mail zu erhalten.</div>
</div>
</fieldset>
<fieldset><legend>Profilauswahl</legend><div class="form-item">
<label>Welche Art von Profil möchten Sie anlegen?: <span class="form-required" title="Dieses Feld wird benötigt.">*</span></label>
<div class="form-radios"><div class="form-item" id="edit-user-roles-9-wrapper">
<label class="option" for="edit-user-roles-9"><input type="radio" id="edit-user-roles-9" name="user_roles" value="9" class="form-radio"> Standardprofil</label>
</div>
<div class="form-item" id="edit-user-roles-10-wrapper">
<label class="option" for="edit-user-roles-10"><input type="radio" id="edit-user-roles-10" name="user_roles" value="10" class="form-radio"> Unternehmensprofil</label>
</div>
</div>
</div>
</fieldset>
<input type="hidden" name="timezone" id="edit-user-register-timezone" value="7200">
<input type="hidden" name="form_build_id" id="form-0a6194b14aa52e97c189500a32266e2a" value="form-0a6194b14aa52e97c189500a32266e2a">
<input type="hidden" name="form_id" id="edit-user-register" value="user_register">
<fieldset><legend>Persönliche Informationen</legend><div class="form-item" id="edit-profile-a1-wrapper">
<label for="edit-profile-a1">Studiumabschluss / Fachgebiet: <span class="form-required" title="Dieses Feld wird benötigt.">*</span></label>
<input type="text" maxlength="255" name="profile_a1" id="edit-profile-a1" size="60" value="" class="form-text required">
<div class="description">Bitte geben Sie Ihren Studiumabschluss inkl. erworbenen Titel an. Unternehmen können hier Ihr Fachgebiet angeben.</div>
</div>
</fieldset>
<fieldset><legend>Bild</legend><div class="form-item" id="edit-picture-upload-register-wrapper">
<label for="edit-picture-upload-register">Avatar hochladen: </label>
<input type="file" name="files[picture_upload_register]" onchange="$('#edit-pic-selected').val(1);" class="form-file" id="edit-picture-upload-register" size="60">
<div class="description"><br>Bitte laden Sie ein Avatar hoch. Die Dimension des Avatars ist <em>85x85</em> und die maximale Datengröße ist <em>100</em> kB. Bilder werden automatisch an diese Vorgaben angepasst. </div>
</div>
<input type="hidden" name="pic_selected" id="edit-pic-selected" value="0">
</fieldset>
<fieldset><legend>Nutzungsbedingungen</legend><div class="form-item" id="edit-terms-of-use-wrapper">
<label class="option" for="edit-terms-of-use"><input type="checkbox" name="terms_of_use" id="edit-terms-of-use" value="1" class="form-checkbox required"> Ich akzeptiere die <a href="https://akademiker-netzwerk.de/node/2">Nutzungsbedingungen</a> und die <a href="http://www.akademiker-netzwerk.de/node/2">Datenschutzerklärung</a>. <span class="form-required" title="This field is required">*</span></label>
</div>
</fieldset>
<fieldset class="captcha"><legend>Sicherheitsabfrage</legend><div class="description">Die untenstehende Sicherheitsabfrage dient der Vermeidung von Spam.</div><input type="hidden" name="captcha_sid" id="edit-captcha-sid" value="592">
<div class="form-item" id="edit-captcha-response-wrapper">
<label for="edit-captcha-response">Wie ist der Vorname des Erfinders vom Internet?: <span class="form-required" title="Dieses Feld wird benötigt.">*</span></label>
<input type="text" maxlength="50" name="captcha_response" id="edit-captcha-response" size="50" value="" class="form-text required">
<div class="description">Sind Sie ein Mensch?</div>
</div>
</fieldset>
<input type="submit" name="op" id="edit-submit" value="Kostenlos registrieren" class="form-submit">
</div></form>
?>
Das ist der komplette HTML Code der Registrierung. Warum ich nicht direkt auf die Variable $profile_a1 zugreifen kann ist mir ein Rätzel.
Weil's diese Variable nicht
am 28.06.2011 - 20:29 Uhr
Weil's diese Variable nicht gibt, so einfach ist das.
Hast du das Profil von $account geladen?
Edit:
Was ich gerade nicht verstehe: Wenn du das Feld als normales Profil-Feld angelegt hast, wird es doch ohnehin in der Datenbank gespeichert, was genau hast du denn noch damit vor?
Also, der User hat die
am 28.06.2011 - 22:06 Uhr
Also, der User hat die Möglichkeit 2 Profile anzulegen. Einmal ein Standardprofil und ein Unternehmensprofil. Das Profilfeld wird auch in dem Standardprofil angezeigt. Leider kann ich im Unternehmensprofil kein gleichnamiges Profilfeld anlegen, so dass ich ein neues Feld angelegt habe, wo ich nun einfach die Daten eintragen möchte. (Dieses Profilfeld soll beiden Profilen gleichermaßern zur Verfügung stehen und bei der Registrierung abgefragt werden) Da dies während des Inserts funktioniert, weiss ich nicht ob es evt. sogar funktionieren könnte wenn ich die Daten einfach aus der Datenbank auslese und dann in die profile_values unter der anderen Feldid eintrage. Das kann ich mal versuchen. Ich habe den Code eingefügt, um das Profil von $account zu laden. Das hat leider nicht funktioniert.
<?php
$fid='45';
$fid1='46';
$fid2='47';
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid, $user->uid, $user->name);
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid1, $user->uid, $user->name);
$x=2;
$sql = "SELECT * FROM {profile_values} WHERE uid = %d and fid=%d";
$result = db_query($sql, $user->uid, $x);
$row = db_fetch_object($result);
$value = $row->value;
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $user->uid, $value);
?>
Ein Versuch die Daten einfach auszulesen und dann woanders reinzuschreiben hat auch nicht funktioniert.
Das Problem dabei ist wohl dass return profile_save_profile($edit, $user, $category, TRUE); erst danach ausgeführt wird. Wenn ich es vor die Anweisung setze bringt es leider auch nichts, da das Script nach return beendet wird.
Und wie genau kann ein User 2
am 28.06.2011 - 22:12 Uhr
Und wie genau kann ein User 2 verschiedene Profile anlegen?
Modul Auto assign Role und
am 28.06.2011 - 22:20 Uhr
Modul Auto assign Role und eine per user-profile.tpl.php gesteuerte (php) die eine "Rollenweiche" enthält. Muss doch möglich sein die Registrierungsvariablen auszulesen. Warum geht das nicht? Wegen der form id wahrscheinlich???
Beknackter Sch... Nach der
am 29.06.2011 - 00:16 Uhr
Beknackter Sch... Nach der Anmeldung wird eine "Anmeldung erfolgreich Seite" aufgerufen. Dort müssten die Daten der Registrierung doch bereits in die Datenbank eingetragen worden sein. Irgedwas funktioniert da auch mit meinem Code nicht:
<?php
global $user;
$x=2;
$sql = "SELECT * FROM {profile_values} WHERE uid = %d and fid=%d";
$result = db_query($sql, $user->uid, $x);
$row = db_fetch_object($result);
$value = $row->value;
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $user->uid, $value);
?>
Ehm, liegt wohl daran, dass er die uid nicht kennt da logoff. Naja, schon einmal einen Schritt weiter. Mal hat er die Daten noch nicht in die Datenbank geschrieben (funktioniert nicht) Mal hat er zwar die Daten in der Datenbank aber er kann nicht drauf zugreifen, da keine UID. Nervig !!!
Des Rätzels Lösung: Die ID die am höchten ist entspricht dem zuletzt angemeldeten User. Ich weiss mom. noch nicht wie man das in oho umsetzt aber so sollte es klappen.
Also ich bin ja nach wie vor
am 29.06.2011 - 12:04 Uhr
Also ich bin ja nach wie vor der Meinung, dass du das ganze mit hook_form_alter in der Zwischenzeit schon drei mal hättest lösen können. Und zwar wesentlich besser und sauberer...
Einen Marathon Läufer kurz
am 30.06.2011 - 00:02 Uhr
Einen Marathon Läufer kurz vor dem Ziel ein Bahnfahrtticket zu schenken halte ich für sarkastisch :-) Und ja, ein wenig Lektüre erspart einen Geschwüre! Du hast wahrscheinlich recht damit. Nun habe ich es aber fast gelöst. Ich muss nur noch per php den Wert mit der höchsten uid auslesen und dann in die andere Tabelle eintragen.
<?php
$fid2='47';
$x=2;
$sql = "SELECT MAX(uid) AS uid FROM profile_values where fid=%d";
$result = db_query($sql, $x);
$row = db_fetch_object($result);
$val = $row->value;
$userid = $row->uid;
echo"val $val userid $userid";
db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $fid2, $userid, $val);
?>
Die variable $userid wird angezeigt. Die $val variable nicht. Das muss ich noch hinbekommen dann bin ich fertig.
Wo soll value den herkommen?
am 30.06.2011 - 07:30 Uhr
Wo soll value den herkommen? Du hast in Deiner Query ja auch kein Feld namens value angefordert, sondern nur uid. Also bekommst Du auch nichts anderes. $row -> value existiert eben nicht.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Probiers mal mit der
am 30.06.2011 - 11:04 Uhr
Probiers mal mit der Query:
SELECT * FROM profile_values ORDER BY uid DESC LIMIT 1;
Macht im Grunde das gleiche wie deine, liefert aber den gesamten Datensatz, nicht nur die UserID.
Hab da wohl etwas falsch
am 01.07.2011 - 00:34 Uhr
Hab da wohl etwas falsch verstanden. Danke ! Das hat geklappt.