Felhasználó létrehozása modulból

Sir_Csavar képe

Sziasztok!

Próbálok létrehozni felhasználót saját modullal ez alapján
http://www.jayboodhun.com/create-user-programatically

<?php
02./**
03. * Date dd/mm/yyyy
04. * Creates a user with profile values.
05. *
06. * @param $data
07. *   $_POST data for example.
08. *
09. * @return
10. *   $user Object.
11. */
12.function my_module_create_user($data) {
13.    // Drupal User module function that generates MD5 hash password
14.    $pass = user_password();
15.    $newuser = array(
16.      'name' => $data['name'],
17.      'mail' => $data['mail'],
18.      'status' => 1, // Sets user as Active
19.      'pass' => $pass
20.    );
21.    $auto_user = user_save('', $newuser);
22.    $rid = 4; // Assign Role ID
23.    $uid = $auto_user->uid;
24.    db_query('INSERT INTO {users_roles} (uid, rid) VALUES (%d, %d)', $uid, $rid);
25.    // Populates profile values
26.    $profile = array(
27.      'firstname' => $data['firstname'],
28.      'lastname' => $data['lastname'],
29.      'company' => $data['company'],
30.      'address' => $data['address'],
31.      'city' => $data['city'],
32.      'state' => $data['state'],
33.      'country' => $data['country'],
34.      'phone' => $data['phone'],
35.     );
36.     // Adds details under Personal Information Category set in Profile
37.     profile_save_profile($profile, $auto_user, 'Personal Information');
38.     // Load the new user Object
39.     $account = user_load(array('uid' => $auto_user->uid, 'status' => 1));
40.     global $user;
41.     $user = $account;
42.     drupal_set_message(t('You have been authenticated'));
43.     db_query("UPDATE {users} SET login = %d WHERE uid = %d", time(), $user->uid);
44.     sess_regenerate();
45.     // Finally send an Email
46.     /*
47.     * Mail templates available:
48.     * register_no_approval_required
49.     * register_admin_created
50.     * register_pending_approval - Need to set Status above as 0 if this option is required
51.     */
52.     drupal_mail('user', 'register_no_approval_required', variable_get('site_mail', ini_get('sendmail_from')), language_default(), $params);
53.          // Set the redirection to where you want
54.     drupal_goto('home');
55.}
56.?>

de ez a rész nem akar feltöltődni adatbázisba.

25.    // Populates profile values
26.    $profile = array(
27.      'firstname' => $data['firstname'],
28.      'lastname' => $data['lastname'],
29.      'company' => $data['company'],
30.      'address' => $data['address'],
31.      'city' => $data['city'],
32.      'state' => $data['state'],
33.      'country' => $data['country'],
34.      'phone' => $data['phone'],
35.     );
36.     // Adds details under Personal Information Category set in Profile
37.     profile_save_profile($profile, $auto_user, 'Personal Information');

kiirattam és tömb értékeivel minden rendben van, de az adatbázis akkor is üres marad. ha jól értem amit a profil alatt létrehoztam mezőket azoknak a nevét kell megadnom, mint mondjuk 'fullname' => $data['teljesnev']
és működnie kellene. Mit szúrtam el?

Drupal verzió: 
nevergone képe

Ne erre indulj el, a Drupal API-t használd, azért van. Pl. van egy user_save() függvény, ami erre való, csak egy $user objektumot kell átadni neki. Ha érdekel az objektum felépítése, akár a user_load() segítségével betöltheted egy létező felhasználóét, és a var_dump(), vagy a Devel modul dpr() függvénye kiírja neked.

Csak akkor matass az adatbázisban, ha nincs más (hatékony) módszer a problémád megoldására és pontosan tudod, hogy mit miért csinálsz.

0
0
Sir_Csavar képe

Bár lehet, hogy igazad van, nem teljesen tiszta, hogy miért. Haszálva van a user_save és a profile_save_profile parancs is amiket javasoltok. Nem értem, hogy hol van az a bibi, ami miatt nem ajánlod a megoldást, de szívesen tanulok. :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

nevergone képe

Mert nincs szükség ilyenkor az adatbázisban való állítgatásra, az amúgy is a Drupal megkerülése lenne. Egy helyesen feltöltött $user objektumnál a user_save() mindent a helyére tesz, és akkor sincs gond, ha változik a táblaszerkezet (mondjuk alverziók között nem fog) vagy ha más modulok szeretnének beleavatkozni a folyamatba. Érdemes átolvasnod a user_save() forrását.

0
0
hosszu.kalman képe

Ha a user_save() fgv-t használod, akkor le fog futni minden modulban a hook_user insert eseménye, így más modulok is bele tudnak avatkozni a működésbe. Így pl a profile modulé is.

0
0
Sir_Csavar képe

megoldva, teljesen jól működik a fenti dolog, csak hibásan hivatkoztam rá.

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

hosszu.kalman képe

Addig működik jól, ameddig nem teszel fel egy másik modult ami az insert eseménybe szeretne belenyúlni.

0
0
Sir_Csavar képe

és mi fog történni?

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

hosszu.kalman képe

nevergone és én is leírtuk már, hogy miért használd a user_save() fgv-t. Ha nem azt használod akkor más modulok nem tudnak majd beleavatkozni a működésbe. Ez fontos, hiszen ezért vannak a hook-ok. Nameg minek újra feltalálni a mentést, ha már megírták a fgv-t előttünk?

0
0
Sir_Csavar képe

Ha jól értem amire ráakartok világítani, hogy így csináljam meg. Legalábbis az itteni infokat összefésülve az alábbi a topiccal, nekem ez jött le.

http://drupal.hu/forum/usersave-hurok-haszn%C3%A1lata-felhaszn%C3%A1l%C3...

function user_create_submit($data) {
 
    global $user;
    profile_load_profile($user);
    $egyediazonosito=$user->profile_azonosito;
 
    // Drupal User module function that generates MD5 hash password
    $pass = user_password();
    $newuser = array(
      'name' => $data['user']['name'],
      'mail' => $data['user']['mail'],
      'init' => $data['user']['mail'],
      'language' => 'hu',
      'status' => 0,
      'pass' => $pass,
      'roles' => $data['_rid'],
    );
    $auto_user = user_save('NULL', $newuser);
 
    // Populates profile values
    $profile = array(
      'profile_azonosito' => $egyediazonosito,
      'profile_nem' => $data['user']['nem'],
      'profile_name' => $data['user']['fullname'],
     );
 
     // Adds details under Personal Information Category set in Profile
     profile_save_profile($profile, $auto_user, 'személyes', FALSE, TRUE);
 
     // Finally send an Email
     /*
     * Mail templates available:
     * register_no_approval_required
     * register_admin_created
     * register_pending_approval - Need to set Status above as 0 if this option is required
     */
     drupal_mail('user', 'register_pending_approval', variable_get('site_mail', ini_get('sendmail_from')), language_default(), $params);
          // Set the redirection to where you want
     drupal_goto('/recepcio');
}
 
 
0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

nevergone képe

Igen, valahogy így lenne célszerű. :)

0
0
Sir_Csavar képe

Köszönöm a segítséget! :)

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)

Sir_Csavar képe

Az új beállítások szerint nem inaktív user jön létre, hanem aktív, ez még nem gond.
Viszont hogy tudnám kiküldeni a usernek menő levélben a generált kódot is, ha van már 1 ilyen részletem

$params = array('account' => $auto_user);
 
drupal_mail('user', 'register_admin_created',  variable_get('site_mail', ini_get('sendmail_from')), language_default(), $params);

gondolom a $paramshoz kellen hozzá fűzni, valami ilyesmi eljárással $params->password = $pass;

az eddigi próbálkozásaim kudarcosak voltak :) tudnátok segíteni?

0
0

--
A jó ember az ő szívének jó kincséből hoz elő jót; és a gonosz ember az ő szívének gonosz kincséből hoz elő gonoszt: mert a szívnek teljességéből szól az ő szája. (Lukács 6:45)