Ha egy Drupal rendszerben bármilyen tartalmat usernévhez, esetleg szerephez akarunk kötni, akkor használhatjuk a bejelentkezett felhasználó adatait a PHP kódban. Fontos dolog az, hogy ha egy tartalmat PHP kód állít elő, akkor a Drupal azt egy értelmező környezetben az eval() függvény segítségével futtatja. Ez azt eredményezi, hogy a Drupal saját globális változóit importálni kell az oldal névterébe, így a $user változót is. A megoldás, tehát az alábbi:
global $user;
print("<PRE>");
print_r($user);
print("</PRE>");
Ehhez hasonló eredményt kapunk. A válaszban jelzem az egyes részek jelentését:
stdClass Object(
[sort] => 0
[threshold] => 0
[theme] =>
[signature] =>
[created] => 1195917194
[access] => 1200828420
[login] => 1200388494
[status] => 1
[timezone] => 0
[picture] =>
[init] => xy@mail.hu // email címe
[data] => a:1:{s:18:"admin_compact_mode";b:1;} // Milyen adatokat mentettünk le hozzá
[sid] => m1ouo9j5qat4s7rsjha0u3rjundhm6i6 // Session azonosítója
[hostname] => 80.99.4.206 // Milyen IP címről jelentkezett be.
[timestamp] => 1200828420
[cache] => 1200828420
[session] =>Iag7dBO0CX2ku2rhqIQ8PYlH7CenM6aK_P.... //Session adatok
[admin_compact_mode] => 1 // milyen módban van a user
[uid] => 1 // A user tábla uid mez?je, egyedi azonosító
[name] =>Gipsz Jakab // Usernév
[pass] => 990df75cb228d3cc06dc67f9750c0b18 // Jelszó elkódolt alakban
[mail] => xy@mail.hu // Email címe
[mode] => 0
[language] => hu // Mi a beállított nyelve
[roles] => Array //A user állapota
(
[2] => authenticated user
)
)
Ezeket az adatokat felhasználva lehet user függő részeket beiktatni a Drupal alatti kódba.
Erre mutatok az alábbiakban egy példát.
A példában a globális névtérből beimportálom a $user változót,
majd létrehozok egy konstanst attól függően,
hogy egy modulban milyen jogosultsága van az aktuális felhasználónak.
global $user;
$editable = variable_get('xmodul_ok',true) && isset($user) && ($user->admin_compact_mode);
FONTOS!
A Drupal a $_COOKIE tömbben küldözgeti a session adatokat a szerverhez és vissza, de a cookie elérési útvonalát és a cookie azonosítóját az URL alapján állítja elő. Ezért ha például a Drupal oldalunk a
gyökérből indul és a mi különálló PHP oldalunk a
http://valami.hu/include/foo.php
oldal lenne, mivel az elérési útvonal nem ugyanaz (!), ezért másik cookie jön létre és nem azonosítja a user magát.
Megoldás:
Létrehozzuk a gyökérben http://valami.hu/interface.php állományt, és ennek a tartalma:
require_once("./includes/bootstrap.inc"); //A Drupal indítása
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); //lefuttatja a Drupal inicializálást, többek között a sessionokat is
include("./valami/foo.php");
Az igazi kódot pedig az include állományban helyezzük el. Általánosságban kell csinálni egy olyan interface.php oldalt, amely megfelelően felparaméterezve beinclude-olja a megfelelő oldalakat és így lehet kezelni minden erőforrást a Drupal részéről.