Koppelings matrix.. Hoe maak je die?
ik sta weer voor 'n grote uitdaging. Ik ben op zoek hoe ik voor elkaar moet krijgen hoe ik rol-mdw matrix kan maken.
geen flauw idee hoe ik dit moet aanpakken en alle hulp is meer dan welkom.. Op voorhand bedankt voor het meedenken.
Wat ik heb is tabel met medewekers een tabel met rollen en er bestaat een koppeltabel die een relatie tussen die twee heeft. Wellicht is dat de enige tabel om de kruisjes hieronder te zetten en dat de andere twee middels een JOIN evt extra info kan toevoegen....
Rol1 Rol2 Rol3
Mdw1 x x x
Mdw2 x x
Mdw3 x
Mdw4 x
Mdw5 x x
Hoe moet ik dit aan vliegen? Werkelijk geen idee hoe en wat.
Wil je dit visueel als tabel vormgeven zodat je per gebruiker de rollen kan instellen?
ik denk dat tabel vorm het mooiste resultaat zou geven
pittig hoor. Gaat een hele kluif worden.
Zie dit topic waarin u hetzelfde vraagt.
https://www.phphulp.nl/php/forum/topic/hoe-kan-ik-gegevens-gegroepeerd-laten-tonen/102740/
De reden dat u dat niet snapt heb ik reeds in een ander topic van u uitgelegd.
Het enige verschil tussen de twee vragen is dat de matrix bij de een vertikaal wordt getoond en bij de andere horizontaal.
Gewijzigd op 13/02/2019 15:42:03 door Adoptive Solution
uhm, het lijkt op elkaar maar is niet zo..
In de vorige topic gaat het om welke rol(len) één persoon hebben . in deze topic zou ik graag naar een overzicht gaan .. welke peronen (dus meervoud) aan welker rollen (ook meervoud) zijn gekoppeld.
oh, zeg maar je tegen u hoor.... net zo fijn
1 persoon met 3 rollen hebt.
3 personen met 1 rol.
Meerdere personen met meerdere rollen
1 rol bij 1 persoon
Meerdere rollen bij meerdere personen
Etc.
En of dat nu uit 1 tabel of uit meerdere tabellen komt.
Uiteindelijk is er een resultaat.
Daarmee genereer je met loopjes in php een tabel.
Horzontaal, vertikaal.
Probeer ze allemaal. Voorbeelden zijn gegeven.
Maar this way schiet ik niet veel mee op... bedankt voor je reacties
Als je nog niet zo ervaren bent, is het toch een mooi moment om te ontdekken hoe het werkt? ;-)
klopt. dat is wel zo.. maar oom goegel legt het uit op een manier dat het bijna op hoger wiskunde lijkt
Gewoon trial and error en proberen te begrijpen wat het doet, en de php.net manual erbij houden.
Wat wil je uiteindelijk bereiken?
Een matrix met verticaal alle rollen, en horizontaal alle medewerkers.
Hiermee heb je al een spec van wat je wilt, rest echter het hoe.
Allereerst heb je alle rollen nodig om alle kolommen op te spannen (1 query).
Vervolgens heb je alle medewerkers nodig met alle bijbehorende rollen (nog 1 query).
Het is waarschijnlijk handig om al de resultaten van deze laatste query vast op te halen en in een array te stoppen zodat je daarna makkelijk de matrix (ik neem aan dat je hiervoor gewoon een HTML-tabel gebruikt?) kunt bouwen.
Dan heb je een dubbele for-loop nodig om alle rijen + kolommen van de tabel te genereren.
Allereerst loop je alle medewerkers af (buitenste for-loop - dit komt elke keer overeen met een tabelrij), en daarna alle rollen (binnenste for-loop - elke rol(positie) een tabelcel/-kolom innemen). Bij elke rol controleer je of deze gebruiker die heeft.
Zoja: zet vinkje, zonee: produceer een lege cel.
Nog zonder een letter te programmeren heb je al helemaal uitgestippeld hoe alles gaat lopen.
Het programmeren zelf is simpelweg uitrollen wat je eerder hebt bedacht.
Dit is het idee van specificeren van wat je gaat doen: het meeste denkwerk is dan al gedaan op het moment dat je code gaat kloppen.
Nota bene: je kunt ook een "proof of concept" / zogenaamde "mockup" maken, nog zonder tussenkomst van een database, die illustreert/"bewijst" wat het zou moeten doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
// https://www.phphulp.nl/php/forum/topic/koppelings-matrix-hoe-maak-je-die/102754
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>employees - role table</title>
</head>
<body><?php
$allRoles = array(
1 => 'developer',
2 => 'administrator',
3 => 'moderator',
4 => 'only human',
);
// note: organise roles in such a fashion that they are easy to check, i.e. assign role ids to the keys
$users = array(
1 => array('name' => 'GOD', 'roles' => array(1 => true)),
2 => array('name' => 'Bob', 'roles' => array(2 => true, 3 => true)),
3 => array('name' => 'Joe', 'roles' => array(3 => true)),
4 => array('name' => 'Bubba', 'roles' => array(4 => true)),
);
?><table border="1">
<thead>
<tr>
<th> </th><?php
foreach ($allRoles as $role) {
?><th><?php echo $role; ?></th><?php
}
?></tr>
</thead>
<tbody><?php
foreach ($users as $user) {
?><tr>
<td><?php echo $user['name']; ?></td><?php
foreach ($allRoles as $roleId => $dummy) {
?><td><?php
if (isset($user['roles'][$roleId])) {
echo 'V';
} else {
echo ' ';
}
?></td><?php
}
?></tr><?php
}
?></tbody>
</table>
</body>
</html>
// https://www.phphulp.nl/php/forum/topic/koppelings-matrix-hoe-maak-je-die/102754
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>employees - role table</title>
</head>
<body><?php
$allRoles = array(
1 => 'developer',
2 => 'administrator',
3 => 'moderator',
4 => 'only human',
);
// note: organise roles in such a fashion that they are easy to check, i.e. assign role ids to the keys
$users = array(
1 => array('name' => 'GOD', 'roles' => array(1 => true)),
2 => array('name' => 'Bob', 'roles' => array(2 => true, 3 => true)),
3 => array('name' => 'Joe', 'roles' => array(3 => true)),
4 => array('name' => 'Bubba', 'roles' => array(4 => true)),
);
?><table border="1">
<thead>
<tr>
<th> </th><?php
foreach ($allRoles as $role) {
?><th><?php echo $role; ?></th><?php
}
?></tr>
</thead>
<tbody><?php
foreach ($users as $user) {
?><tr>
<td><?php echo $user['name']; ?></td><?php
foreach ($allRoles as $roleId => $dummy) {
?><td><?php
if (isset($user['roles'][$roleId])) {
echo 'V';
} else {
echo ' ';
}
?></td><?php
}
?></tr><?php
}
?></tbody>
</table>
</body>
</html>
Gewijzigd op 14/02/2019 01:00:10 door Thomas van den Heuvel
bedankt voor je uitgebreide antwoord. Zal komend weekend dit eens rustig op me laten werken en kijken of ik het allemaal kan bevatten. ..
je schetst in je antwoord al precies wat de bedoeling... verticaal de rollen.. horizontaal de medewerker (van gekozen afdeling) en daar waar 'n match is een kruisje of plusje oid. Zodat je in 1 oogopslag kan zien wie welke rol toebedeeld heeft gekregen.
In dit geval heb ik eerst een array gemaakt die een boom geeft van de bestaande rechten. Puur om de matrix vorm te geven, omdat niet elke module (name)in mijn site alle acties heeft. De rechten zelf zitten in een multidimensionale die ik bij het inladen van de pagina steeds genereer aan de hand van de databasetabellen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
array(
'name' => 'tags',
'actions' => array(
'access' => true,
'create' => true,
'edit_own' => false,
'edit' => true,
'delete' => true,
'publish' => false
)
),
array(
'name' => 'reviews',
'actions' => array(
'access' => true,
'create' => true,
'edit_own' => true,
'edit' => true,
'delete' => true,
'publish' => true
)
)
'name' => 'tags',
'actions' => array(
'access' => true,
'create' => true,
'edit_own' => false,
'edit' => true,
'delete' => true,
'publish' => false
)
),
array(
'name' => 'reviews',
'actions' => array(
'access' => true,
'create' => true,
'edit_own' => true,
'edit' => true,
'delete' => true,
'publish' => true
)
)
En aan de hand hiervan bouw ik met een foreach de tabel op.
Eerst horizontaal de acties in kolommen, en dan vervolgens de acties in de kolommen.
(Noot: Het is mooier geweest als de de th's (table-heading) bovenaan met de acties ook dynamisch gegenereerd werd.)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<table>
<thead>
<tr>
<th> </th>
<th>access</th>
<th>create</th>
<th>edit_own</th>
<th>edit</th>
<th>delete</th>
<th>publish</th>
</tr>
</thead>
<tbody>';
foreach ($rightstree as $item) {
echo '<tr>
<td>' . $modules_translate[$item['name']] . '</td>';
foreach ($actions as $action) {
echo '<td>';
if ($item['actions'][$action] == true) {
echo '<select name="rights[' . $item['name'] . '][' . $action . ']">
<option value="" ' . (($rules[$item['name']][$action] !== NULL) ? '' : 'selected') . '>-</option>
<option value="1" ' . (($rules[$item['name']][$action] !== '1') ? '' : 'selected') . '>Ja</option>
<option value="0" ' . (($rules[$item['name']][$action] !== '0') ? '' : 'selected') . '>Nee</option>
</select>';
}
echo '</td>';
}
echo '</tr>';
}
echo '
</tbody>
</table>
<thead>
<tr>
<th> </th>
<th>access</th>
<th>create</th>
<th>edit_own</th>
<th>edit</th>
<th>delete</th>
<th>publish</th>
</tr>
</thead>
<tbody>';
foreach ($rightstree as $item) {
echo '<tr>
<td>' . $modules_translate[$item['name']] . '</td>';
foreach ($actions as $action) {
echo '<td>';
if ($item['actions'][$action] == true) {
echo '<select name="rights[' . $item['name'] . '][' . $action . ']">
<option value="" ' . (($rules[$item['name']][$action] !== NULL) ? '' : 'selected') . '>-</option>
<option value="1" ' . (($rules[$item['name']][$action] !== '1') ? '' : 'selected') . '>Ja</option>
<option value="0" ' . (($rules[$item['name']][$action] !== '0') ? '' : 'selected') . '>Nee</option>
</select>';
}
echo '</td>';
}
echo '</tr>';
}
echo '
</tbody>
</table>
Hopelijk geeft dit een idee hoe je het kan opbouwen, hoewel de code iets netter kon worden geschreven.
Oh ja, en de rechten staan in een array, op een soort van manier zoals de matrix aangeeft.
Voorbeeldje:
Gewijzigd op 16/02/2019 09:18:08 door - Ariën -
eerst avond puzzelen lever rampzalig gevolgen op.... de boel door ini elkaar gezakt ;-) niets werkt meer... maar ff een kopie terugzetten :-)... ik vrees een vreze :-). maar blijven door hannesen
We mogen blij zijn dat we print_r en var_dump hebben om array's en variabelen te debuggen. ;-)