user_save() hurok használata felhasználók hozzáadására fájlból

aboros képe

Drupal 6.2 -ben szeretnék "manuálisan" hozzáadni többszáz felhasználót a rendszerhez. A felhasználók e-mail címei rendelkezésre állnak egy fileban, pontosvesszővel tagolva. Úgy kell őket létrehoznom, hogy felhasználónevüket az e-mailcímükből nyerem, a @ előtti rész lesz az. (most ne vitázzunk ezen) nincs kettőzés, azokat már kiszűrtem, a felhasználónévnek egyedinek kell ugye lenni.

Azt a randa megodlást fundáltam ki, hogy egy "külső" php fileban csinálok egy full bootstrap -et, beolvasom a mélcímeket a fileból, tömbbé alakítom a pontosvessző mentén, végigmegyek a tömbön és a user_save() hurokkal elmentegetem őket. Ez a "snippet" így néz ki:

include('includes/bootstrap.inc');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$usersfile = fopen('users-to-add.csv', 'r');
$userstoadd = stream_get_contents($usersfile);
$userarray = split(';', $userstoadd);
foreach ($userarray as $email){
  $tmparray = split("@", $email);
  $userinfo = array(
    'name'=>$tmparray[0],
    'pass'=>'ittISvanPerszeValamiEzMOstGondolomMIndegyIS',
    'mail'=>$email,
    'status'=>1,
    'language'=>'hu',
    'init'=>$email
  );
  user_save('', $userinfo);
}

Ezután ezt a filet lefuttatva el is készülnek a felhasználók. Látom őket a {users} táblában és az admin/user/user oldalon is kilistázódnak. A megadott jelszóval azonban belépni egyikőjükkel sem tudok, egészen addig, amig adminként nem szerkesztek valakit. Mindegy, hogy semmit nem változtatok, csak az admin/user/user -en valamelyikre nyomok egy szerkesztést, aztán rögvest nyomok egy mentést a felhasználó adatlapján és utána már be tudok lépni vele.

Mi a hiba a gondolatmenetben? Miért nem enegedi be a drupal az ilyen módon mentett felhasználóimat egészen addig amig én adminként a felhasználót nem szerkesztem?

Ha nagyon muszály gyalog is végigmentegetem őket, de ha nem muszály inkább nem tenném.

Előre is kösz!

Fórum: 
zserno képe

Gyorsan belenéztem a devel modul 6-os változatába, ott így csinálják:

/**
 * Generate some random users.
 *
 * @param $num
 *  Number of users to generate.
 * @param $kill
 *  Boolean that indicates if existing users should be removed first.
 */
function devel_create_users($num, $kill) {
  $url = parse_url($GLOBALS['base_url']);
  if ($kill) {
    db_query('DELETE FROM {users} WHERE uid > 1');
    drupal_set_message(t('Users deleted.'));
  }
  for ($i = 0; $i < $num; $i++) {
    $length = rand(6, 12);
    $name = devel_generate_word($length);
    $pass = md5(user_password());
    $mail = $name .'@'. $url['host'];
    $now = time();
    db_query("INSERT INTO {users} (name, pass, mail, status, created, access) VALUES ('%s', '%s', '%s', %d, %d, %d)", $name, $pass, $mail, 1, $now, $now);
  }
  drupal_set_message(t('!num_users created.', array('!num_users' => format_plural($num, '1 user', '@count users'))));
}

De nekem ez a "kifundált külső bootstrap" egy kicsit bűzlik. Biztos vagy benne, hogy ez a legjobb megoldás?

0
0
pp képe

Jó megoldás az amit csinál aboros. Igazából nem értem, hogy miért nem egy core modulba néztél bele(user.module) Ez ugyanis picit dörti, hisz ha van olyan modul, amiben meg van valósítva a hook_user (mondjuk az ugyancsak core részét képező profil.module) akkor ez nem jól működik, sőt olyan jelenségeket is tud produkálni, amire senki nem számít.

pp

0
0
aboros képe

ez a file egyetlen egyszer fog lefutni. (persze akkor se egy éles rendszeren, hanem csak itt local, aztán db dump..)
biztos vagyok benne, hogy ez a legjobb és a leggyorsabb megoldás. te tudsz ennél gyorsabbat többszáz felhasználó hozzáadására?

0
0

-
clear: both;

zserno képe

Én egy parányi modult készítettem volna, aztán ki tudja, még valami jó is kisülhet belőle.
De ízlések...

0
0
crt képe

Szia.

Rég csináltam ilyet, de valami olyan rémlik, hogy meg kellett adni a csoporttagságot is a $userinfo tömbben.

Üdv: Zoli

0
0
pp képe

Ha user_load-al betöltesz egy még nem mentett és egy mentett usert, akkor mi a különbség?
Nem is értem, hogy miért nem nézel bele a user modulba... látszik, hogy ott még a roles paramétert is megadja...:) ízirájder öcsém!

pp
ja és a user_save nem egy hook! Nem is értettem a téma címét.... van egy hook_user amiben van egy save op, de azt ugye nem új júzer felvitelére használjuk, hanem új júzer létrehozásakor mindenféle adatot tudunk hozzáadni a júzerhez.

0
0
aboros képe

tényleg a roles hiányzott neki. mondjuk a user modulból sokat nem tudtam kihámozni, így aztán próbaképpen egy 'roles'=>array() -t is belevettem a $userinfo -ba. így már működik.

jaés ezt a hurok dolgot akkor még mindig nem értem. :) csak az hurok, ami hook_ -al kezdődik? és akkor mondjuk ha a modulom megvalósítja a hook_block -ot, mondjuk csukatoka_block, akkor már az se hurok? zavaros ez a hurkozás, megértem, hogy eleinte kiakadnak rajta a népek.

0
0

-
clear: both;

pp képe

A hurok az egy olyan függvény, amit implementálnod kell, ha az adott lehetőségeket használni szeretnéd, a sima függvényt pedig meghívod, ha kell az adott lehetőségeket használni szeretnéd. Tehát az egyiknél Te írod meg a funkcionalitást (a micsináljon hogyha) a másiknál meg használod. Az egyiknél tudnod kell, hogy hogyan csináld a másiknál nem kell tudnod, csak használnod.

A user_save-nél maradva, mint látható fogalmad sincs mi történik, ha meghívod, de nem is érdekel, csak az, hogy ezzel a függvénnyel létre tudsz hozni felhasználót(vagy módosítani). Azonban ha szeretnéd kontrollálni, hogy mi történjen akkor amikor valaki (bárki) usert hoz létre, akkor a különböző hook-okkal be kell épülnöd a folyamatba. pl. a formba bele kell raknod pár plusz mezőt, azokat validálnod kell, majd a mentésnél szintén valamilyen adatbázis műveletre lesz szükséged. Hogy melyik hook-ba azt nem lehet tudni, mert az a feladattól függ. Tipikusan a user-es példánál maradva a hook_form_alter,hook_user, hook_mail_alter ami szóba jöhet, no meg még milliócsillió. (nézz bele a profil modulba... persze értő szemek kellenek azért hozzá...) Zsernő/devel modul megoldása pont ezért nem a legjobb, hisz kikerüli ezt a mechanizmust, és egyből az adatbázisba tolja az adatokat.

A user.module-ba meg nem csak úgy bele kell nézni, hanem le kell játszani a következő gondolat menetet: Mikor jön létre júzer? Hátamikor regisztrál-> megnézem a regisztrációkor milyen függvény hívódik meg(user_menu). Ez nyílván egy form-ot fog eredményül adni -> megnézem, hogy melyiket user_register. Akkor hívódik meg nagy valószínűséggel a node_save, amikor a validáláson már átment a form -> megnézem a user_register_submit függvényt, és már látom is, hogy milyen adatokat kell megadni. Wow ez ilyen egyszerű? Nem bonyolultabb ez sem mint modult készíteni... csak sör kell hozzá :D

pp

0
0
aboros képe

én úgy néztem a user.module -t, hogy kerestem hol van benne user_save.. :)

0
0

-
clear: both;