User adatok használata Drupal környezetben

Drupal user

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

http://valami.hu

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.

Tags