Saját modul által definiált perm-el rendelkező felhasználók listája, hogyan?

BeGa képe

Nem találtam a tárgyban jelölt funkcióra api-t. Lényeg hogy a drupál adatbázisától eltérő adatbázisban tárolunk adatokat. Az ott tárolt adatok közül kell szűrni, ott elérhető adatok (területi elhelyezkedés) , alapján.
De a jogok kiadásakor csak azokat a user-eket szeretném listázni akik rendelkeznek a modul álltal definiált perm-el.
Csopottagságot le tudok kérdezni, de remélem hogy van egyszerübb, jobb(!) megoldás is.

Köszönöm előre is a segítséget

Sweetchuck képe

Én sem találtam rá API-t, de attól még lehet hogy van.

Ha users táblát összekapcsolod a users_roles táblával akkor megkapod hogy egy felhasználó mely
csoportokba tartozik.
De akkor még nem tudod, hogy a csoportnak milyen jogai vannak. Ezért az előző kettőhöz (pontosabban a users_roles-hez) hozzákapcsolod még a permission táblát.
Viszont az 1 bizonyos perm-re való szűrés nem lesz zökkenő mentes, hiszen a permission.perm mező egy stringben tárolja a csoport összes jogosultságát, VesszőSzóköz határolóval.
Problémát jelenthet továbbá az is, hogy a string eleje és vége nem tartalmazza a határolót.
Az alábbi függvények tesztelése eredményre vezethet:
find_in_set
instr
locate
Továbbá a határoló gondokra a
concat

A példa alapján a find_in_set() csak a vesszőt tekinti határolónak.

0
0
Sweetchuck képe

Most hogy próbálom összerakni az SQL mondatot, rájöttem hogy az elöbb néhány dolgot nem vettem számításba. :-)

0
0
Sweetchuck képe

SELECT
		*
	FROM
		users_roles as ur
			INNER JOIN
			role as r
			ON(ur.rid = r.rid)
				INNER JOIN
				permission as p
				ON(
					p.rid = r.rid
					AND
					LOCATE(' edit own blog,', CONCAT(' ', p.perm, ',')) > 0
				)

fontos észrevételezni hogy:
$perm = ' ' . $perm . ','

Egy minden helyzetben helyesen működő kód ettől sokkal bonyolultab lenne. Mert:
1) Egy felhasználó minden esetben bele tartozik 1 csoportba. Vagy "anonymous user" vagy "authenticated user" de ezt a tagságot a users_roles tábla nem tárolja. Tehát ha azt a saját modulod által definiált perm-et megkapja az "authenticated user" csoport akkor a fenti lekérdezés üres rekord halmazt ad vissza. (RIGHT JOIN-nal meg NULL érték lesz az ur.uid helyén)

2)Kisebbik gond, hogy az egyes számú felhasználó (users.uid = 1) gondolkodás nélkül megkap minden jogot.

3)Mindig kifelejtek valamit. Majd ide írom. :-)

0
0
BeGa képe

Nagyon szépen köszönöm!
A megoldás mellett különösen a "hangosan" gondolkodást!
Ez így működik, többre nincs szükségem.

BeGa

0
0

BeGa

pp képe

Nem ástam bele nagyon a témába, de én ezt csinálnám?

db_query("SELECT ur.uid as uid FROM {permission} p LEFT JOIN {users_roles} ur ON ur.rid=p.rid WHERE p.perm LIKE '%%%s%%'  ORDER BY uid",'access content');

Itt ugye ha van NULL érték, akkor az azt jelenti, hogy vagy az anonimous, vagy/és mindenki rendelkezik azzal a joggal, tehát értelmetlen a lista. A user-t meg úgy is érdemes a user_load-al betölteni, tehát elég az uid ;)

A bejegyzés a helyes sql használat miatt született {} és %s használata. (tudom, hogy tudjátok, de hátha lesz olyan aki nem.)

pp

0
0
BeGa képe

Akkor megpróbálom összegyúrni a két megoldást :-)
Engedelmetekkel.

A lekérdezés eredményével egy $form 'select' elemet töltök fel, így nálam:

SELECT DISTINCT u.uid, u.name
FROM {users_roles} as ur
LEFT JOIN {permission} as p
ON( p.rid = ur.rid AND LOCATE(" %s,", CONCAT(" ", p.perm, ",")) > 0 )
LEFT JOIN {users} as u on ( u.uid = ur.uid )';

- A like megoldás nem ad pontos választ , részleges átfedések is lehetnek.
- a Distinct akkor kell - mint nálam pl -, amikor több csoport is megkapja ugyanazt az engedélyt.

BeGa

0
0

BeGa

Sweetchuck képe

Eszembe jutott hogy mit akartam írni a hármas ponthoz. :-)
A zárolt felhasználók nem biztos hogy kellenek abba a választó listába.
users.status mező.

0
0