Felhasználóhoz hozzáadott "JOGOSULTSÁG", hogyan?

DTB képe

A következőt szerettem volna megoldani:
Adott, cck-val készített node számát jogosultság-szerüen hozzárendelni egy egy adott felhasználóhoz. Ehhez létrehoztam egy sql táblát,

CREATE TABLE `storerole` (
  `uid` int(11) NOT NULL,
  `nid` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
és feltöltöttem adatokkal. Mivel nem akarok modult fejleszteni, ezért az user modul user_load($array = array()) függvény végéhez az alábbi kódot illesztettem, úgy, hogy legalabb egyszer lefusson:
$user->srole = array();
$result = db_query('SELECT  b.nid, b.field_inf_value  FROM {storerole} s INNER JOIN {content_type_bolt} b 
ON s.nid = b.nid 
WHERE s.uid = %d', $user->uid);
while ($s=db_fetch_object($result)) {
  $user->srole[$s->nid] = $s->field_inf_value;
  }

A lekérdezés és a kód jó, ha a devel modul, devel load funkció segítségével megnézem a saját felhasználói adataimat, akkor megjelenik:

newsletters
Array
(
[1697] => 1697
[176] => 176
[1696] => 1696
)
roles
Array
(
[2] => authenticated user
[3] => webadmins
[4] => workmates
[5] => partners
[6] => newsadmins
)
srole
Array
(
[1453] => jog 1
[1456] => jog 2
[1649] => jog 3
[1650] => jog 4
)

Ha ugyanezt egy oldalról hívom meg, $user->srole segítségével, nem ad vissza semmit, és a devel load nézet sem mutatja az értékeket... Hol rontotam el? Tipp?
Előre is köszi, ha tudsz segíteni!

aries képe

A ?global $user?-t nem felejtetted el?

Aries
http://aries.mindworks.hu

0
0
DTB képe

Nem, igy szoktam ellenőrizni:

<?php
  global $user;
    print '<pre>';
    print_r($user);
    print '</pre>';
?>

A teljes, módositott user_load függvény igy néz ki, a kiemelt sorok az ujak, ezeket több lehetséges helyre beszurva :-) is kipróbáltam, az eredmény mindig a fent leírt....


function user_load($array = array()) {
  // Dynamically compose a SQL query:
  $query = array();
  $params = array();
 
  foreach ($array as $key => $value) {
    if ($key == 'uid' || $key == 'status') {
      $query[] = "$key = %d";
      $params[] = $value;
    }
    else if ($key == 'pass') {
      $query[] = "pass = '%s'";
      $params[] = md5($value);
    }
    else {
      $query[]= "LOWER($key) = LOWER('%s')";
      $params[] = $value;
    }
  }
  $result = db_query('SELECT * FROM {users} u WHERE '. implode(' AND ', $query), $params);
 
  if (db_num_rows($result)) {
    $user = db_fetch_object($result);
    $user = drupal_unpack($user);
 
    $user->roles = array();
    if ($user->uid) {
      $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
    }
    else {
      $user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
    }
    $result = db_query('SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = %d', $user->uid);
    while ($role = db_fetch_object($result)) {
      $user->roles[$role->rid] = $role->name;
    } 
     user_module_invoke('load', $array, $user);
  }
  else {
    $user = FALSE;
  }
// Módosítás innen   
    if ( !$user===FALSE) {   
        echo' lefutott ';
        $user->storer = array();
        $result = db_query('SELECT b.nid, b.field_inf_value FROM {storerole} s INNER JOIN {content_type_bolt} b ON s.nid = b.nid WHERE s.uid = %d', $user->uid);
        while ($s=db_fetch_object($result)) {   
           $user->storer[$s->nid] = $s->field_inf_value;
        }
    }
// Eddig
  return $user;
}

Még annyit, hogy a függvénynek ez a pontja nem mindig fut le, ezt tudom én is, de ha echot szúrok be, akkor látszik, hogy mikor hívódik meg, de az új role értékek akkor sem látszanak...:-(
Utóirat, másnap :-)

Egy megoldást találtam rá, bár nekem nem ez kellene, de hátha mást is érdekel:

<?php
global $user;
$user_uid= array('name'=>$user->name);
$myuser = module_invoke('user', 'load', $user_uid); 
 
$storer = array();
 
$result = db_query('SELECT b.nid, b.field_inf_value FROM {storerole} s INNER JOIN {content_type_bolt} b ON s.nid = b.nid WHERE s.uid = %d', $user->uid);
while ($s=db_fetch_object($result)) {
$storer[$s->nid] = $s->field_inf_value;
}
 
module_invoke('user','save',$myuser,array('storer'=>$storer)); 
 
echo '<pre>';
print_r($user);
echo '</pre>';
?>

Ezzel a megoldással az $user[data] értékéhez lehet az új értékeket adni...
Igazából az a kérdés, hogy a global $user objecthez melyik belépési ponton, melyik funkciónál kell hozzáadni a módosítást, mert az user_load nem vált be. (vagy valamit rosszul csináltam) Tipp?

0
0
pp képe

Miért nem írsz egy modult?
Kell egy .info fájl, meg egy .module fájl, aztán a .module fájlba meg a megfelelő hook.

pl.
http://api.drupal.org/api/5/function/hook_user

Én a helyedben nem a userhez, hanem a node-hoz adnék hozzá 1 mezőt. Amit kitaláltál rövid távon lehet jó, de belegondoltál abba, hogy mi lesz akkor amikor 1 userhez 1000 node tartozik? Erre az adatra mindig szükség van amikor egy user bejelentkezik? Nyílván nincs csak akkor amikor valamit csinálnak a node-al. -> form_alter és nodeapi hook kell neked szerintem.

pp

0
0
DTB képe

Köszi a segítséget, a hook_user lesz a jó megoldás. Saját modult azért nem irok, mert ez a jog, role, nem a lekérdezésben szereplő node-hoz kötödik, az csak egy adathordozó. Másképp, a node-ok egy egy bolt nevei, ami mint adat és mint jogosultság is egyformán lényeges. Mivel bolt 20-30 van, felhasználó jóval több, ezért nekem célszerűbbnek látszott az uid, nid párosítás. Tovább bonyolítja a helyzetet, hogy a bolt hozzáférését akár az user is szabályozhatja... Mindegy, ezt már megoldom, most megnézem az user_hook-kal mire megyek.
Köszönöm a segítséget!
DTB

0
0
pp képe

Legalább próbáld meg!
Nem olyan nehéz!

"enmodulom" könyvtárba létrehozol egy enmodulom.info fájlt (nézz utána mit kell bele írni) valamint egy enmodulom.module fájlt, amibe beleteszel egy enmodulom_user függvényt. Ez lesz a hook_user megvalósítása. Máshogyan nem tudod használni a hook_user-t.

pp

0
0
DTB képe

Nem, nem félek, már irtam modulokat, csak itt nem erről van szó.
Van egyetlen egy statikus oldal, ahova a bolti alkalmazottak egy sima form-on beküldenek adatokat, amiket csak a saját boltjában kell látni, illetve boltonként egy ember ezeket a beírásokat felülbírálhatja. Tehát ez a tartalom nem kötődik a drupalhoz, ezt csak muszály megcsinálni, mert a korábbi honlapon volt hasonló. A tartalom sem node-okba tárolódik, mert boltonként naponta 20-30 adatbeküldést csinálnak, ami alatt előbb utóbb összecsinálná magát az apache meg az sql.(normál, közös pc-n fut mindkettő) Tehát igazából nem tudom hirtelenjében, mihez kötném a modult.... mindenesetre átgondolom a jogosultság kezelést, és annak a megvalósítását még egyszer. Az alap-probléma, az "új role" látszik/nem látszik mindenesetre nem oldódott meg, nem tudtam rájönni, hogy mi a hiba.
Köszönöm a segítséget,
DTB

0
0