Koppelings matrix.. Hoe maak je die?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dirk Huizinga

Dirk Huizinga

12/02/2019 21:50:25
Quote Anchor link
Hoi guys,

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.
 
PHP hulp

PHP hulp

19/03/2019 03:54:21
 
- Ariën -
Beheerder

- Ariën -

12/02/2019 22:14:17
Quote Anchor link
Maar wat bedoel je met die matrix?
Wil je dit visueel als tabel vormgeven zodat je per gebruiker de rollen kan instellen?
 
Dirk Huizinga

Dirk Huizinga

12/02/2019 22:38:24
Quote Anchor link
de matrix zou inzichtelijk moeten maken welke personen welke rollen heeft gekoppeld.
ik denk dat tabel vorm het mooiste resultaat zou geven
 
- Ariën -
Beheerder

- Ariën -

12/02/2019 22:57:30
 
Dirk Huizinga

Dirk Huizinga

13/02/2019 15:33:05
Quote Anchor link
oef.... dank je wel... maar zover gaat mijn kennis nog niet ...
pittig hoor. Gaat een hele kluif worden.
 
Adoptive Solution

Adoptive Solution

13/02/2019 15:40:08
Quote Anchor link
De vraag en het antwoord verschillen alleen in woorden.

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
 
Dirk Huizinga

Dirk Huizinga

13/02/2019 16:09:35
Quote Anchor link
Hoi 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
 
Adoptive Solution

Adoptive Solution

13/02/2019 16:26:24
Quote Anchor link
Wat maakt het uit of je
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.
 
Dirk Huizinga

Dirk Huizinga

13/02/2019 16:36:12
Quote Anchor link
Het maakt in zoverre uit, dat als je nog niet zo'n ervaren php'er bent dit best voor een enorme uitdaging kan zorgen hoor. Om zaken inzichtelijk te krijgen kunnen matrixen enorm helpen.

Maar this way schiet ik niet veel mee op... bedankt voor je reacties
 
- Ariën -
Beheerder

- Ariën -

13/02/2019 16:49:14
Quote Anchor link
Als je nog niet zo ervaren bent, is het toch een mooi moment om te ontdekken hoe het werkt? ;-)
 
Dirk Huizinga

Dirk Huizinga

13/02/2019 18:55:39
Quote Anchor link
klopt. dat is wel zo.. maar oom goegel legt het uit op een manier dat het bijna op hoger wiskunde lijkt
 
- Ariën -
Beheerder

- Ariën -

13/02/2019 19:28:10
Quote Anchor link
Gewoon trial and error en proberen te begrijpen wat het doet, en de php.net manual erbij houden.
 
Thomas van den Heuvel

Thomas van den Heuvel

14/02/2019 00:21:37
Quote Anchor link
Teken dit gewoon eens uit?

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>&nbsp;</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 '&nbsp;';
                    }

                    ?>
</td><?php
                }
            ?>
</tr><?php
        }
    ?>
</tbody>
</table>
</body>
</html>
Gewijzigd op 14/02/2019 01:00:10 door Thomas van den Heuvel
 
Dirk Huizinga

Dirk Huizinga

14/02/2019 20:12:51
Quote Anchor link
Hoi Thomas,

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.
 
- Ariën -
Beheerder

- Ariën -

14/02/2019 23:22:30
Quote Anchor link
Ik geef toe dat het best complex is. Voor een rechtensysteem heb ik dit pas ook gemaakt.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
    )
    )


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)
PHP script in nieuw venster Selecteer het PHP script
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
    <table>
                    <thead>
                    <tr>
                        <th>&nbsp;</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:
https://i.ibb.co/2kpQgg3/afbeelding.png
Gewijzigd op 16/02/2019 09:18:08 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

15/02/2019 23:42:24
Quote Anchor link
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
 
- Ariën -
Beheerder

- Ariën -

15/02/2019 23:52:27
Quote Anchor link
Geduld blijven hebben en doorzetten. Zo heb ik mijn rechtensysteem-matrix ook opgebouwd.
We mogen blij zijn dat we print_r en var_dump hebben om array's en variabelen te debuggen. ;-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.