WordPress Rollen en mogelijkheden een real life-voorbeeld

Dit is een vierdelige serie-zelfstudie over het onderwerp WordPress-gebruikers, rollen en mogelijkheden. De serie behandelt de architectuur en het ontwerp van gebruikersrollen in WordPress; markeer de belangrijkste functies voor interactie met gebruikers en het beheren van rollen en mogelijkheden; en in de laatste zelfstudie gaan we een realistisch voorbeeld geven dat het nut van deze API aantoont.


Invoering

Deze tutorial zal gericht zijn op het bouwen van een praktische oplossing met behulp van het WordPress rollen- en capaciteitenysteem. Als je de laatste twee tutorials hebt gemist, raad ik je aan ze te bekijken. Het eerste deel "WordPress Roles and Capabilities: The Basics" verklaart het ontwerp van dit systeem; terwijl het tweede deel "WordPress Roles and Capabilities: Functions of Note" zich concentreert op de functies en klassen die WordPress aanbiedt om te communiceren met het systeem.

De oplossing die in deze zelfstudie wordt voorgesteld, is dezelfde als die ik gebruik voor een van mijn premium WordPress-plug-ins. Ik heb het gekozen nadat ik verschillende benaderingen geprobeerd heb. Het is eenvoudig, kort en ingekapseld in één klas. Je kunt het eenvoudig aanpassen voor je eigen plug-in. De code is beschikbaar op GitHub; en heeft geen licentie. Het komt ook met geen garanties en u bent vrij om het te gebruiken en in licentie te geven zoals u dat wilt.


Stap 1 Het scenario

We bouwen een WordPress-plug-in met een speciaal clientbeheerderspaneel. Dit beheerderspaneel moet alleen toegankelijk zijn voor een beperkte groep gebruikers. Deze gebruikers kunnen worden geselecteerd door de blogbeheerder. Hij kan verschillende rollen, gebruikers of allemaal inschakelen voor toegang tot het clientbeheerderspanel of functies.

Afgezien daarvan hebben we een beperkte mediabibliotheektoegang nodig voor gebruikers met toegang tot het Client Panel. WordPress heeft een speciale mogelijkheid om bestanden te openen en te uploaden naar de mediabibliotheek: "upload bestanden"Dit geeft de gebruiker (of rol) echter volledige toegang tot de Mediabibliotheek. Dit is geen goede zaak, vooral dat foto's (of bestanden) niet kunnen worden hiërarchisch onder verschillende categorieën, waar u de toegang voor elke bibliotheek kunt beperken.

We moeten de toegang tot de mediabibliotheek alleen beperken tot de bestanden die de gebruiker heeft geüpload. Hij zou geen toegang moeten hebben tot de uploads van andere gebruikers. Deze beperking moet alleen worden toegepast op gebruikers die niet over de "upload bestanden"mogelijkheid. Andere gebruikers en rollen maken zich geen zorgen over deze beperking omdat ze al volledige toegang hebben tot de mediabibliotheek.

Onze blog heeft deze vier categorieën gebruikers:

De eerste twee sets gebruikers zijn degenen die geen toegang hebben tot het plugin-clientpaneel. Ik heb benadrukt dat er gebruikers zijn die toegang hebben tot de mediabibliotheek en een set die dat niet doet. Het is essentieel dat onze oplossing de eerste twee categorieën niet beïnvloedt en hun mogelijkheden intact laat.

Met dat in gedachten, zou onze klas twee dingen moeten doen:

  • Stel de juiste machtigingen in voor de derde en vierde set gebruikers
  • Schakel een beperkte mediabibliotheek in voor toegang tot de vierde categorie. Het moet ervoor zorgen dat na het uitschakelen van de plug-in of het wijzigen van de gebruikersrechten, deze categorie gebruikers hun oorspronkelijke rechten terugkrijgen.

Stap 2 De interface van de plug-in

Voordat we onze klas gaan maken, laten we een beter idee hebben van de plug-in. De plug-in heeft een vrij eenvoudige structuur. Het is samengesteld uit twee verschillende menu's: één voor de beheerder en het dient als een administratief paneel, alleen toegankelijk voor gebruikers met een capaciteit van "manage_options"Het tweede menu is voor clients en geeft toegang tot het Client Panel.wptuts_client_page"mogelijkheid.

Deze mogelijkheid bestaat niet in WordPress; we moeten het toevoegen en toewijzen aan de opgegeven gebruikers of rollen. Maar laten we eerst eens kijken naar de plug-in.

 / * Plugin Naam: WordPress Rollen Plug-in Plug-in URI: https://github.com/omarabid/WordPress-Roles-Plugin Beschrijving: A WordPress Roles Plugin Auteur: Abid Omar Auteur URI: http://omarabid.com Versie: 1.0 * / // Voeg een Admin-gebruikersmenu toe aan het WordPress Dashboard add_action ('admin_menu', 'wptuts_admin_menu'); functie wptuts_admin_menu () add_menu_page ('Beheerderstoegang', 'Beheerderstoegang', 'manage_options', 'wptuts-admin', 'wptuts_admin_page');  function wptuts_admin_page () echo 'Admin-pagina';  // Voeg een gebruikersmenu toe aan het WordPress Dashboard add_action ('admin_menu', 'wptuts_client_menu'); functie wptuts_client_menu () add_menu_page ('Client Access', 'Client Access', 'wptuts_client', 'wptuts-client', 'wptuts_client_page');  function wptuts_client_page () echo 'Client-pagina'; 

We hebben twee "ADMIN_MENU"actiehaken die het beheerdersmenu toevoegen voor zowel de beheerder als de client. We kunnen het beperken tot slechts één haak die beide toevoegt, maar ik geef er de voorkeur aan om beide te scheiden."add_menu_page"functie haakt naar een andere functie die de pagina-inhoud zal weergeven.

Vervolgens moeten we onze Roles-klasse initialiseren. De klassecode wordt in een ander bestand geplaatst; en het initialisatieproces wordt uitgevoerd tijdens de "in het"hook die ervoor zorgt dat WordPress klaar is met laden.

De constructorfunctie accepteert drie parameters:

  • $ all Boolean (optioneel) Als u de client toegang wilt geven aan alle gebruikers op de blog, kunt u dit instellen op true en de resterende parameters negeren.
  • $ rollen Array (optioneel) Een array met rollen-id's die toegang hebben tot het clientvenster.
  • $ gebruikers Array (optioneel) Een array met gebruikersnamen voor gebruikers die toegang hebben tot het clientpaneel.
 // Laadt en initialiseert de role class add_action ('init', 'wptuts_start_plugin'); functie wptuts_start_plugin () require_once ('roles_class.php'); $ all = false; $ roles = array ('subscriber'); $ users = array (3); nieuwe wpttuts_roles ($ all, $ roles, $ users); 

Stap 3 De klassen Rollen

De eigenschappen

De klasse heeft slechts 3 eigenschappen: $ all, $ rollen en $ gebruikers. Dit zijn dezelfde variabelen die u doorgeeft aan de constructorfunctie. De waarde van de variabelen is niet gewijzigd in ons voorbeeld; maar in een echt praktisch geval, wilt u misschien samenvoegen met een andere bron. Hiervoor hebt u de set_entities functie. Je kunt het aanpassen aan je eigen behoeften.

 / ** * @var boolean * / private $ all; / ** * @ var array * / private $ -rollen; / ** * @ var array * / private $ gebruikers; / ** * Stel de toestemmingsentiteiten in * * @param boolean $ all * @param array $ roles * @param array $ users * / private function set_entities ($ all, $ roles, $ users) $ this-> all = $ allemaal; $ this-> roles = $ roles; $ this-> users = $ users; 

De Constructorfunctie

In een eerste stap initialiseert de constructorfunctie de $ all, $ rollen en $ gebruikers variabelen met behulp van de set_entitites () functie. Vervolgens wordt een privéfunctie aangeroepen voor het instellen van de mogelijkheden en een andere voor de beperking van de mediabibliotheek. Dit zijn precies de stappen die we in ons scenario hebben gedefinieerd.

 / ** * Maakt een nieuw exemplaar van de Roles-klasse * * @param boolean $ all * @param array $ roles * @param array $ users * / function __construct ($ all = false, $ roles = array (), $ gebruikers = array ()) // Stel de toegestane entiteiten $ this-> set_entities in ($ all, $ roles, $ users); // Stel de gebruikerstoegangspermissie $ this-> set_permissions () in; // Mediabibliotheek Filter $ this-> media_filter (); 

Statische functies

Statische functies vereisen geen klasse-initialisatie. Ze lijken op onafhankelijke functies, maar zijn eenvoudigweg gekoppeld aan de opgegeven klasse. Ik heb besloten om sommige functies statisch te houden omdat ze onafhankelijk kunnen worden gebruikt; en je zou ze nuttig kunnen vinden in een andere context.

Deze functies zijn filter_roles () en filter_users (); die zijn gekoppeld aan twee andere functies role_has_caps () en user_has_caps (). De functies spelen het deel van een filter. Ze filteren rollen (of gebruikers) op basis van de mogelijkheden die ze hebben en niet hebben.

Beide functies accepteren twee argumenten:

  • $ omvatten reeks Een reeks mogelijkheden die de rol heeft.
  • $ sluiten reeks Een reeks mogelijkheden die de rol niet heeft.
 / ** * Filter alle rollen van het blog op basis van de mogelijkheden * * @static * @param array $ include Array of capabilities om * @param array $ te omvatten, exclusief Array of capabilities om * @return array * / static function filter_roles ($ include, $ exclude) $ filtered_roles = array (); globale $ wp_roles; $ roles = $ wp_roles-> get_names (); foreach ($ roles as $ role_id => $ role_name) $ role = get_role ($ role_id); if (self :: role_has_caps ($ role, $ include) &&! self :: role_has_caps ($ role, $ exclude)) $ filtered_roles [] = $ role_id;  return $ filtered_roles;  / ** * Filter alle gebruikers van het blog op basis van de mogelijkheden * * @static * @param array $ include Array of capabilities om * @param array $ op te nemen $ array uitsluiten van mogelijkheden om * @return array * / static function filter_users ( $ include, $ exclude) $ filtered_users = array (); $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); if (self :: user_has_caps ($ user, $ include) &&! self :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ user-> ID;  return $ filtered_users; 

De functies doorlopen alle rollen en gebruikers in de database. Voor elke rol (of gebruiker) controleert het of het over de vereiste mogelijkheden beschikt en niet de mogelijkheden heeft om uit te sluiten. Deze controle wordt gedaan met de role_has_caps () en user_has_caps () functies.

Deze twee functies (role_has_caps () en user_has_caps ()) accepteer twee argumenten:

  • $ rol (of $ user) Draad De rol-ID of de gebruikers-ID.
  • $ caps reeks Een reeks mogelijkheden om te controleren.

Als de rol (of gebruiker) de opgegeven mogelijkheden heeft in de $ caps array, de functie retourneert true. In het andere geval retourneert de functie false. De functie doorloopt in principe elke mogelijkheid en controleert of de rol (of gebruiker) de opgegeven mogelijkheid heeft.

 / ** * Geeft true als een rol de mogelijkheden in de gepasseerde array heeft * * @static * @param $ role * @param $ caps * @return bool * / static function role_has_caps ($ role, $ caps) foreach ($ caps als $ cap) if (! $ role-> has_cap ($ cap)) return false;  return true;  / ** * Geeft true als een gebruiker over de mogelijkheden in de gepasseerde array beschikt * * @static * @param $ user * @param $ caps * @return bool * / static function user_has_caps ($ user, $ caps) foreach ( $ caps as $ cap) if (! $ user-> has_cap ($ cap)) return false;  return true; 

Toestemmingen toevoegen

Dit is de eerste stap bij het opleggen van de wet van onze plug-in. Ik heb de functionaliteit verdeeld over 3 functies: een voor het instellen van machtigingen voor alle gebruikers, een voor het instellen van machtigingen voor de rollen en een andere voor het instellen van machtigingen voor de opgegeven gebruikers. De hoofdfunctie bepaalt eenvoudig welke functies moeten worden gekozen.

 / ** * Stel de toegangsrechten in voor het menu en de pagina's * / private function set_permissions () $ this-> set_all_permissions (); if (! $ this-> all) $ this-> set_roles_permissions (); $ This-> set_users_permissions (); 

De set_all_permissions () functie lus door alle gebruikers in de blog en voeg (of verwijder) de "wptuts_client"mogelijkheid afhankelijk van de waarde van de $ all variabel. We krijgen de volledige lijst met gebruikers die de. Gebruiken get_users () functie; en initialiseer een nieuwe WP_User object om toegang te krijgen tot de add_cap () en remove_cap () functies.

 / ** * Stel de rechten in voor ALLE gebruikers * / persoonlijke functie set_all_permissions () $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); if ($ this-> all) $ user-> add_cap ('wptuts_client');  else $ user-> remove_cap ('wptuts_client'); 

De set_roles_permissions () functie doorloopt alle rollen in de blog en verwijdert de "wptuts_client"capability. Daarna loopt het door rollen in de $ rollen array en voegt de "wptuts_clientDe eerste stap was om ervoor te zorgen dat we de mogelijkheid van rollen die eerder mogelijk waren, opschonen.

 / ** * Stel de machtigingen in voor Rollen * / private function set_roles_permissions () global $ wp_roles; $ roles = $ wp_roles-> get_names (); foreach ($ roles as $ role_id => $ role_name) $ role = get_role ($ role_id); $ Rol-> remove_cap ( 'wptuts_client');  if (! empty ($ this-> roles)) foreach ($ this-> roles as $ role_id) $ role = get_role ($ role_id); $ Rol-> add_cap ( 'wptuts_client'); 

De set_users_permissions () functie doet hetzelfde als de laatste functie. Het enige verschil is dat het zich richt op gebruikers in plaats van rollen.

 / ** * De machtigingen voor specifieke gebruikers instellen * / private function set_users_permissions () $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); $ Gebruiksvriendelijkheid> remove_cap ( 'wptuts_client');  if (! empty ($ this-> users)) foreach ($ this-> users as $ user_id) $ user = new WP_User ($ user_id); $ Gebruiksvriendelijkheid> add_cap ( 'wptuts_client'); 

Mediabibliotheekfilter

Nu hebben we de juiste rechten voor de juiste entiteiten ingesteld. (Als gebruiker of als rol) We moeten ook de toegang tot de mediabibliotheek beperken voor de vierde categorie die we in het scenario hebben onderscheiden.

Deze categorie rollen (of gebruikers) heeft de "wptuts_client"mogelijkheid, maar heeft niet de"upload bestanden"mogelijkheid. En dat is waar onze filterfuncties in het spel komen. Ze zullen ons helpen bij het filteren en retourneren van deze categorie rollen (of gebruikers).

Voor deze categorie voegen we twee mogelijkheden toe "upload bestanden"en"remove_upload_files". De "upload bestanden"geeft volledige toegang tot de mediabibliotheek en de andere mogelijkheid zal worden gebruikt om de berichten in de mediabibliotheek te filteren, en het zal ook worden gebruikt om de"upload bestanden"mogelijkheid eens de"wptuts_client"mogelijkheid is ook verwijderd.

 / ** * Beperken mediatoegang * / persoonlijke functie media_filter () // Pas het mediafilter toe voor huidige klanten $ roles = self :: filter_roles (array ('wptuts_client'), array ('upload_files')); $ users = self :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roles, 'upload_files'); $ this-> roles_add_cap ($ roles, 'remove_upload_files'); $ this-> users_add_cap ($ users, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // Beperk mediabibliotheektoegang add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // Voor schoonmaakdoeleinden $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = self :: filter_users (array ('remove_upload_files'), array ('wptuts_client')); $ this-> roles_remove_cap ($ clean_roles, 'upload_files'); $ this-> roles_remove_cap ($ clean_roles, 'remove_upload_files'); $ this-> users_remove_cap ($ clean_users, 'upload_files'); $ this-> users_remove_cap ($ clean_users, 'remove_upload_files'); 

Nadat we de mogelijkheden voor deze categorie hebben ingesteld, houden we vast aan de "parse_query"filter. Met dit filter kunnen we de berichten wijzigen waarnaar geretourneerd wordt WP_Query. In ons geval gaan we de "schrijver"queryvariabele. Dit resulteert in het retourneren van alleen berichten die zijn gemaakt door de opgegeven auteur.

 / ** * Beperk mediabibliotheektoegang * * @param $ wp_query * / public function restrict_media_library ($ wp_query) if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php')) if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('auteur', $ current_user-> ID);  else if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('auteur', $ current_user-> ID); 

De volledige code

 if (! class_exists ('wpttuts_roles')) class wpttuts_roles / ** * Bepaalt of alle gebruikers de vereiste rechten hebben * * @var boolean * / private $ all; / ** * Een array met de rollen met de vereiste machtigingen * * @ var array * / private $ roles; / ** * Een array met de gebruikersnamen die over de vereiste machtigingen * * @var array * / private $ users beschikken; / ** * Maakt een nieuw exemplaar van de Roles-klasse * * @param boolean $ all * @param array $ roles * @param array $ users * / function __construct ($ all = false, $ roles = array (), $ gebruikers = array ()) // Stel de toegestane entiteiten $ this-> set_entities in ($ all, $ roles, $ users); // Stel de gebruikerstoegangspermissie $ this-> set_permissions () in; // Mediabibliotheek Filter $ this-> media_filter ();  / ** * Stel de toestemmingsentiteiten in * * @param boolean $ all * @param array $ roles * @param array $ users * / private function set_entities ($ all, $ roles, $ users) $ this-> all = $ all; $ this-> roles = $ roles; $ this-> users = $ users;  / ** * Stel de toegangsrechten voor Menu en Pages * / private function set_permissions () $ this-> set_all_permissions () in; if (! $ this-> all) $ this-> set_roles_permissions (); $ This-> set_users_permissions ();  / ** * Stel de machtigingen in voor ALLE gebruikers * / private function set_all_permissions () $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); if ($ this-> all) $ user-> add_cap ('wptuts_client');  else $ user-> remove_cap ('wptuts_client');  / ** * Stel de machtigingen in voor Rollen * / private function set_roles_permissions () global $ wp_roles; $ roles = $ wp_roles-> get_names (); foreach ($ roles as $ role_id => $ role_name) $ role = get_role ($ role_id); $ Rol-> remove_cap ( 'wptuts_client');  if (! empty ($ this-> roles)) foreach ($ this-> roles as $ role_id) $ role = get_role ($ role_id); $ Rol-> add_cap ( 'wptuts_client');  / ** * Stel de rechten in voor specifieke gebruikers * / private function set_users_permissions () $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); $ Gebruiksvriendelijkheid> remove_cap ( 'wptuts_client');  if (! empty ($ this-> users)) foreach ($ this-> users as $ user_id) $ user = new WP_User ($ user_id); $ Gebruiksvriendelijkheid> add_cap ( 'wptuts_client');  / ** * Beperken mediatoegang * / persoonlijke functie media_filter () // Pas het media filter toe voor valuta AdPress Clients $ roles = self :: filter_roles (array ('wptuts_client'), array ('upload_files')) ; $ users = self :: filter_users (array ('wptuts_client'), array ('upload_files')); $ this-> roles_add_cap ($ roles, 'upload_files'); $ this-> roles_add_cap ($ roles, 'remove_upload_files'); $ this-> users_add_cap ($ users, 'upload_files'); $ this-> users_add_cap ($ users, 'remove_upload_files'); // Beperk mediabibliotheektoegang add_filter ('parse_query', array (& $ this, 'restrict_media_library')); // Voor schoonmaakdoeleinden $ clean_roles = self :: filter_roles (array ('remove_upload_files'), array ('wptuts_client')); $ clean_users = self :: filter_users (array ('remove_upload_files'), array ('wptuts_client')); $ this-> roles_remove_cap ($ clean_roles, 'upload_files'); $ this-> roles_remove_cap ($ clean_roles, 'remove_upload_files'); $ this-> users_remove_cap ($ clean_users, 'upload_files'); $ this-> users_remove_cap ($ clean_users, 'remove_upload_files');  / ** * Een mogelijkheid toevoegen aan een matrix van rollen * * @param $ roles * @param $ cap * / private function roles_add_cap ($ roles, $ cap) foreach ($ roles as $ role) $ role = get_role ($ rol); $ Rol-> add_cap ($ cap);  / ** * Een mogelijkheid toevoegen aan een array van gebruikers * * @param $ gebruikers * @param $ cap * / private function users_add_cap ($ users, $ cap) foreach ($ users as $ user) $ user = nieuwe WP_User ($ user); $ Gebruiksvriendelijkheid> add_cap ($ cap);  / ** * Een mogelijkheid uit een matrix van rollen verwijderen * * @param $ roles * @param $ cap * / private functie roles_remove_cap ($ roles, $ cap) foreach ($ roles as $ role) $ role = get_role ($ rol); $ Rol-> remove_cap ($ cap);  / ** * Een mogelijkheid uit een reeks gebruikers verwijderen * * @param $ gebruikers * @param $ cap * / persoonlijke functie users_remove_cap ($ users, $ cap) foreach ($ users as $ user) $ user = nieuwe WP_User ($ user); $ Gebruiksvriendelijkheid> remove_cap ($ cap);  / ** * Filter alle rollen van het blog op basis van de mogelijkheden * * @static * @param array $ include Array of capabilities om * @param array $ mee te nemen $ array uitsluiten van mogelijkheden om * @return array * uit te sluiten / statische functie filter_roles ($ include, $ exclude) $ filtered_roles = array (); globale $ wp_roles; $ roles = $ wp_roles-> get_names (); foreach ($ roles as $ role_id => $ role_name) $ role = get_role ($ role_id); if (self :: role_has_caps ($ role, $ include) &&! self :: role_has_caps ($ role, $ exclude)) $ filtered_roles [] = $ role_id;  return $ filtered_roles;  / ** * Geeft true als een rol de mogelijkheden in de gepaste array heeft * * @static * @param $ role * @param $ caps * @return bool * / static function role_has_caps ($ role, $ caps) foreach ( $ caps als $ cap) if (! $ role-> has_cap ($ cap)) return false;  return true;  / ** * Filter alle gebruikers van het blog op basis van de mogelijkheden * * @static * @param array $ include Array of capabilities om * @param array $ op te nemen $ array uitsluiten van mogelijkheden om * @return array * / static function filter_users ( $ include, $ exclude) $ filtered_users = array (); $ users = get_users (); foreach ($ gebruikers als $ gebruiker) $ user = nieuwe WP_User ($ user-> ID); if (self :: user_has_caps ($ user, $ include) &&! self :: user_has_caps ($ user, $ exclude)) $ filtered_users [] = $ user-> ID;  return $ filtered_users;  / ** * Geeft true als een gebruiker over de mogelijkheden in de gepasseerde array beschikt * * @static * @param $ user * @param $ caps * @return bool * / static function user_has_caps ($ user, $ caps) foreach ( $ caps as $ cap) if (! $ user-> has_cap ($ cap)) return false;  return true;  / ** * Beperk mediabibliotheektoegang * * @param $ wp_query * / public function restrict_media_library ($ wp_query) if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/upload.php'))  if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('auteur', $ current_user-> ID);  else if (strpos ($ _ SERVER ['REQUEST_URI'], '/wp-admin/media-upload.php')) if (current_user_can ('remove_upload_files')) global $ current_user; $ wp_query-> set ('auteur', $ current_user-> ID); 

Conclusie

In deze zelfstudie heb ik geprobeerd het materiaal te gebruiken dat we van de vorige twee berichten hebben geleerd om een ​​aangepaste oplossing voor rollen en mogelijkheden te maken. De oplossing was ingekapseld in een klasse die kan worden aangepast aan uw eigen behoeften of plug-ins. Je kunt de code vinden op Github.

Als je vragen, suggesties of verbeteringen hebt, kun je dit in de reacties plaatsen.