hook_permission Drupal 7 toegangsrechten voor verschillende rollen
In de vorige lessen hebben we pagina’s en blokken op verschillende plaatsen weergegeven, en we hebben ook de eigenschappen 'access arguments' en 'access callback' gebruikt om toegangsbeperkingen tot pagina’s te definiëren. In deze les zullen we de mogelijkheid creëren om de toegangsrechten tot bewerkingen flexibeler te beheren via administratieve pagina’s. Hiervoor zullen we gebruikmaken van hook_permission() (in Drupal 6 heette dit hook_perm()).
hook_permission()
Bepaalt de rechten (permissions) voor gebruikers.
Deze hook kan permissies toevoegen, zodat je module bepaalt welke ervan op de gebruikersrechtenpagina worden weergegeven. Ook wordt deze hook gebruikt om volledige of gedeeltelijke toegang te regelen tot acties (actions) die door de module worden uitgevoerd.
Toegangsrechten worden gecontroleerd met behulp van user_access().
Geretourneerde waarden
Een array waarvan de sleutels de naam van de permissie zijn, en de waarden arrays met de volgende sleutel-waardeparen bevatten:
title: De leesbare naam van de permissie, die wordt weergegeven op de permissiepagina. Deze waarde moet worden omhuld met de functie t(), zodat deze later kan worden vertaald naar een andere taal.
description: (optioneel) Een beschrijving van wat de permissie doet. Ook deze moet worden omhuld met de functie t() voor vertaling.
restrict access: (optioneel) Een Booleaanse waarde (0 of 1, true of false) die op TRUE kan worden gezet om aan te geven dat de sitebeheerder deze permissie alleen aan vertrouwde gebruikers moet toewijzen. Deze eigenschap moet worden gebruikt voor permissies die, indien misbruikt, een beveiligingsrisico kunnen vormen. (Bijvoorbeeld: “Beheer invoerfilters” en “Volledige controle over nodes”, die door de Drupal-core worden geleverd). Wanneer deze op TRUE is ingesteld, zal de standaardfoutmelding die is gedefinieerd in user_admin_permissions() worden weergegeven via theme_user_permission_description() en worden gekoppeld aan de weergegeven permissie op de beheerderspagina. Standaard is restrict access ingesteld op FALSE.
warning: (optioneel) Een vertaalbaar foutbericht dat voor deze permissie op de beheerderspagina wordt weergegeven. Deze eigenschap overschrijft de automatische foutmelding die via restrict access wordt gegenereerd als deze op TRUE is ingesteld. Deze eigenschap moet zelden worden gebruikt, om te zorgen dat alle permissies duidelijk en consistent blijven en vergelijkbaar zijn met andere beveiligingswaarschuwingen. Gebruik description om extra informatie te geven over wat deze permissie doet.
Laten we deze hook toevoegen aan de code van de vorige les:
function sitemade_permission(){ return array('view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } function sitemade_menu(){ $items = array(); // initialiseer de array met onze menu-items $items['admin/config/content/page_example'] = array( // voeg een pagina toe op het pad 'admin/config/content/page_example' 'title' => 'Voorbeeldpagina', // paginatitel 'description' => 'Een gewone pagina', // paginabeschrijving 'page callback' => '_page_example', // functie die de inhoud van de pagina retourneert 'access arguments' => array('view page example'), // stel toegangsrechten in zoals in hook_permission ); return $items; // retourneer de lijst met pagina’s } function _page_example($content = NULL) { $content = ''; // initialiseer de inhoudsvariabele als leeg $query = db_select('node_revision', 'n'); // selecteer de tabel node_revision waarin de huidige revisie van de node wordt opgeslagen $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // voeg de tabel field_revision_body toe waarin het body-veld wordt opgeslagen $query->innerJoin('node', 'd', 'n.nid=d.nid'); // voeg de tabel node toe waarin de titel van de node zich bevindt $query->fields('n', array('title'), array('nid'), array('vid')); // selecteer velden $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // beperk tot content type “news” $query->orderBy('n.timestamp', 'DESC'); // sorteer zodat de nieuwste nieuwsberichten eerst komen $query->range(0, 10); // selecteer enkel de laatste 10 $result = $query->execute(); // voer de query uit while($nodes = $result->fetch()){ // verwerk het resultaat $content .= '<h3>' . $nodes->title . '</h3>'; // toon de titel $content .= $nodes->body_value; // toon de body } return $content; // retourneer de inhoud }
Nu zal er op de permissiepagina admin/people/permissions een nieuwe permissie verschijnen:
Wijs deze permissie alleen toe aan de beheerder, zodat gewone gebruikers deze pagina niet kunnen bekijken. Wanneer een gewone gebruiker nu de pagina admin/config/content/page_example probeert te openen, zal Drupal de toegang weigeren met fout 403.
In de volgende les maken we een beheerderspagina met een formulier voor het instellen van onze site-instellingen met behulp van de Drupal Forms API.