Gdrcd dubbio permessi legati alle corporazioni
Gdrcd dubbio permessi legati alle corporazioni postato il 07/08/2021 18:30:47 nel forum programmazione, open source e hosting e modificato da haruka il 08/08/2021 00:22:17
Ho un problemino e non riesco a venirne a capo.
Dunque, in land ho permesso ai giocatori di entrare in due corporazioni.
Sto poi cercando di lavorare sul forum in modo da garantire l'accesso ovviamente solo a chi fa parte di una corporazione.
In forum/visit.inc.php ho questo:
$res = gdrcd_query("SELECT ruolo.gilda, ruolo.capo, ruolo.gestione FROM ruolo JOIN clgpersonaggioruolo ON clgpersonaggioruolo.id_ruolo = ruolo.id_ruolo WHERE clgpersonaggioruolo.personaggio = '".gdrcd_filter('in', $_SESSION['login'])."'", 'result');
while($row2 = gdrcd_query($res, 'fetch')) {
$_SESSION['gilda'] = $row2['gilda'];
$_SESSION['capo'] = $row2['capo'];
$_SESSION['gestione'] = $row2['gestione'];
$_SESSION['img_gilda'] .= $row2['immagine'].',';
}
gdrcd_query($res, 'free');
Il mio problema è che questa query legge solo il codice della prima delle due corporazioni.
Quindi, esempio,
var_dump($_SESSION['gilda']);
in un personaggio che ha due id_ruolo, il primo associato alla gilda con id 2 e l'altro associato alla gilda con id 15, mi restituisce
string(1) "2"
A seguire io ho un controllo sulla bacheca.
else if ( ($row['gestione'] == 1) && (strpos($_SESSION['gilda'], $row['proprietari']) === false) && ($_SESSION['permessi'] < MODERATOR) ){
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non fai parte di questa corporazione1 </div>';
Ho creato delle bacheche gestionali, quindi ($row['gestione'] == 1 si riferisce proprio a questo: se una bacheca è o meno di gestione.
Il codice sopra funziona in parte. Il problema è che delle due corporazioni ne riconosce solo una (quella con id 2, in questo caso), di conseguenza questo presonaggio può entrare nel forum (di gestione) della prima corporazione (id 2) ma non può entrare nel forum (di gestione) della seconda corporazione (quella con id 15).
Come risolvo? :°(
Pagine → 1
08/08/2021 00:39:05
Prima ti recuperi l'elenco delle gilde di cui fa parte il pg con una query come questa:
$query = "SELECT
r.gilda
FROM clgpersonaggioruolo AS pr
LEFT JOIN ruolo AS r
ON pr.id_ruolo = r.id_ruolo
WHERE
pr.personaggio = '" . gdrcd_filter_in($_SESSION['login']) . "'";
eti salvi i risultat in un array che dovrà essere tipo:
$gilde_pg = array(12,25);
e poi fai il confronto con:
$permessi = in_array($row['proprietari'],$gilde_pg)
? true
: false;
in pratica controlli se il valore del'id della gilda è nell'array delle gilde di cui fa parte il pg, e se è nell'array inposta i permessi true altrimenti a false.
Occiamente questo er ail concetto a grandi linee poi andrebbe sistemato per bene, io mi sono fatto una funzione che in base al tipo di bacheca e i proprietari passato come argomento, mi restituisce se il pg ha accesso o meno alla bacheca, per render eil tutto più modulare.
08/08/2021 10:59:28 e modificato da haruka il 08/08/2021 11:02:03
dyrr ha scritto: Prima ti recuperi l'elenco delle gilde di cui fa parte il pg con una query come questa:
$query = "SELECT
r.gilda
FROM clgpersonaggioruolo AS pr
LEFT JOIN ruolo AS r
ON pr.id_ruolo = r.id_ruolo
WHERE
pr.personaggio = '" . gdrcd_filter_in($_SESSION['login']) . "'";
eti salvi i risultat in un array che dovrà essere tipo:
$gilde_pg = array(12,25);
e poi fai il confronto con:
$permessi = in_array($row['proprietari'],$gilde_pg)
? true
: false;
in pratica controlli se il valore del'id della gilda è nell'array delle gilde di cui fa parte il pg, e se è nell'array inposta i permessi true altrimenti a false.
Occiamente questo er ail concetto a grandi linee poi andrebbe sistemato per bene, io mi sono fatto una funzione che in base al tipo di bacheca e i proprietari passato come argomento, mi restituisce se il pg ha accesso o meno alla bacheca, per render eil tutto più modulare.
Intanto grazie, ci sto provando.
Mi aiuti a capire una cosa?
Qui:
$gilde_pg = array(12,25);
Cosa indicano 12 e 25? Cioè perché proprio 12 e 25?
08/08/2021 15:29:05
Erano gli id di due gilde fittizzie da usare solo come esempio.
La prima query ti ritornerà come risultati l'id delle gilde, che durante il ciclo while di recupero dei dati dovrai inserire in un array strutturato come nell'esempio.
09/08/2021 12:09:23 e modificato da haruka il 09/08/2021 12:10:20
Ci sono quasi ma non ci sono ^^'
Sono riuscita ad estrapolare i proprietari della bacheca e l'id delle corporazioni a cui è affiliato un personaggio. E a metterli dentro while.
Infatti se nel codice inserisco
$proprietari = $row['proprietari'];
$gildepg = $row_guilds['id_gilda'];
echo $proprietari;
echo $gildepg;
[/code]
Vedo una cosa di questo tipo
215 2
Dove in effetti, il primo 2 è l'id della gilda cui appartiene la bacheca richiamato da echo $proprietari;
15 2, così con lo spazio in mezzo, sono gli id delle gilde di cui fa parte il personaggio stampati da echo $gildepg;
Invece con
$proprietari = $row['proprietari'];
var_dump ($proprietari);
$gildepg = $row_guilds['id_gilda'];
var_dump ($gildepg);
Quello che ottengo è questo
string(1) "2" string(2) "15" NULL string(1) "2"
E già quel NULL mi puzza.
A questo punto ho messo un if di controllo su cui poi andrò a sviluppare l'accesso o meno del pg alla bacheca.
if (strpos($proprietari, $gildepg) !== false) {
echo "true";
}
Succede che nel caso di cui sopra:
215 2
il controllo non viene superato.
Se però entro in una bacheca della corporazione 15, sì
1515true 2
Quello che riesco a capire nella mia ignoranza è che al momento la variabile gilde pesca i due id delle gilde del personaggio (15 e 2) ma fallisce il confronto con la variabile $proprietari.
Ho provato così
$gildepg = $row_guilds['id_gilda'];
$listagildepg = explode(" ",$gildepg);
echo $listagildepg;
if (in_array($proprietari, $listagildepg )) {
echo "true";
}
Quello che ottengo è:
se sono in una bacheca della gilda 2
2Array Array
se sono in una bacheca della gilda 15
15Arraytrue Array
09/08/2021 12:50:17 e modificato da dyrr il 09/08/2021 13:02:05
nel while non ti sweve l'id del proprietario della gilda la cosa dovrebbe essere un:
//inizializza l'array delle gilde dei pg
$gilde_pg =array();
//inizializza il valore dei permessi di visualizzazione impostandoli a false
$permessi = false;
//recupero degli id delle gilde del pg
$query = "SELECT
r.gilda
FROM clgpersonaggioruolo AS pr
LEFT JOIN ruolo AS r
ON pr.id_ruolo = r.id_ruolo
WHERE
pr.personaggio = '" . gdrcd_filter_in($_SESSION['login']) . "'";
$result = gdrcd_query($query,'result');
//SEL IL PG APPARTIENE LMENO AD UNA GILDA
if(gdrcd_query($result,'num_rows') != 0) {
//CICLA LE GILDE DI APPARTENENZA DEL PG
while ($record = gdrcd_query($result, 'fetch')){
//aggiunge l'id della gilda all'elenco delle gilde di appartenenza del pg
array_push($gilde_pg,$record['gilda']);
}
}
gdrcd_query($result,'free');
//SE L'ID DELLA GILDA PROPRIETARIA E' ALL'INTERNO DELL'ARRAY DELLE GILDE DEI PG
if( in_array($row['proprietari'],$gilde_pg)) {
//imposta i permessi di visualizzazione a true
$permessi = true;
}
Qui il codice è indentato e visualizzato meglio:
https://gist.github.com/Dyrr/de1181230e16eaa8b0270e6c4d1e8911 ↗
N.B.: Lo ho scritto senza poterlo testare potrebbe esserci qualche piccolo errore di sintassi ma il concetto di come funziona è quello.
Visto ch eil contorlli di appartenenza servono in più punti del forum, il mio consiglio è di rachciudere il tutto in una funzione da poter richiamare all'occorrenza:
09/08/2021 14:51:11 e modificato da haruka il 09/08/2021 15:20:05
No niente, come non detto.
**
Ancora grazie per tutto l'aiuto dyrr.
Sto usando gdrcd 5.5
Nella fretta prima ho dimenticato di dire con la tua query non ero riuscita e quindi sono andata a pescare qualcosa di simile dalla scheda del pg, dove in effetti vengono stampati entrambi i simboli.
L'intestazione del mio codice adesso è così:
$row = gdrcd_query("SELECT tipo, proprietari, gestione, descrtipoforum FROM araldo WHERE id_araldo = ".gdrcd_filter('num', $_REQUEST['what'])."");
$guilds = gdrcd_query("SELECT ruolo.nome_ruolo, ruolo.gilda, ruolo.immagine, gilda.visibile, gilda.id_gilda, gilda.nome AS nome_gilda FROM clgpersonaggioruolo LEFT JOIN ruolo ON ruolo.id_ruolo = clgpersonaggioruolo.id_ruolo LEFT JOIN gilda ON ruolo.gilda = gilda.id_gilda WHERE clgpersonaggioruolo.personaggio = '".gdrcd_filter('in', $_SESSION['login'])."'", 'result');
while($row_guilds = gdrcd_query($guilds, 'fetch')) {
// echo ''.$row_guilds['nome_gilda'].'';
$proprietari = $row['proprietari'];
echo $proprietari;
$gildepg = $row_guilds['id_gilda'];
$listagildepg = explode(" ",$gildepg);
echo $listagildepg;
if (in_array($proprietari, $listagildepg )) {
echo "true";
}
Poi a seguire ho:
$estraipg = gdrcd_query("SELECT * FROM personaggio WHERE nome = '".$_SESSION['login']."'");
$gestionegilda1 = $estraipg['gestionegilda1'];
$gestionegilda2 = $estraipg['gestionegilda2'];
gestionegilda1 e gestionegilda2 li ho inseriti io per i permessi di gestione della prima e della seconda gilda.
E i controlli per ora sono:
if ( ($row['gestione'] == 1 ) && ($estraipg['gestionegilda1'] == 0 && $estraipg['gestionegilda2'] == 0) ) {
{
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non sei gestore di questa corporazione</div>';
?> <div class="link_back">
<a href="main.php?page=forum">
<?php echo gdrcd_filter('out', $MESSAGE['interface']['forums']['link']['back']); ?>
</a>
</div>
<?php
}//Questo if controlla se il pg non ha permessi di accesso alle bacheche di gestione
}
else if ( ($row['gestione'] == 1 ) && ( (in_array($proprietari, $listagildepg )) || $_SESSION['permessi'] < MODERATOR ) ){
echo '<div class="error">Errore: non puoi visualizzare questa bacheca perché non fai parte di questa corporazione </div>';
?>
<div class="link_back">
<a href="main.php?page=forum">
<?php echo gdrcd_filter('out', $MESSAGE['interface']['forums']['link']['back']); ?>
</a>
</div>
<?php
} //Questo if controlla se si è almeno admin della land, se la bacheca è una bacheca di gestione della gilda e se si fa parte di quella gilda. Se queste condizioni non sono vere restituisce errore.
Il secondo però non va. Ed infatti mi fa accedere anche a bacheche di gestione dove il pg non dovrebbe leggere, cioè di cui non è "proprietario"
25/08/2021 11:37:01
Più che effettuare tutti i controlli direttamente nella stessa pagina del Forum, credo che sia più pratico (anche in una ottica futura rispetto al tuo progetto) realizzare una funzione che, passando l'id della bacheca ( o anche solo i proprietari, se è necessario ), controlli se l'utente appartiene o meno al gruppo/gruppi di appartenenza della Bacheca ( similmente a quanto aveva accennato @Dyrr stesso).
Potresti utilizzare come riferimento la funzione che ti avevo proposto in questo thread: https://www.gdr-online.com/readforum.asp?id=248837 ↗
Eventualmente puoi aggiungere anche un ulteriore parametro per controllare se l'utente possiede o meno il ruolo gestione, così come lo hai impostato tu.
Kasa.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Cafuné ↗
CRSED: F.O.A.D. ↗
Storie di Agarthi ↗
The Coven ↗
State of Survival ↗
New Orleans ↗
Sea of Conquest ↗