Plug jouw access in een Drupal View

05 Jun 2014

Joris Snoek
Digital Consultant
+31 (0)20 - 261 14 99

Stel: je hebt een View gebouwd in een Drupal systeem. En je wilt dat slechts een select deel van de ingelogde gebruikers deze view-pagina mag zien.

Nu kan je dat vaak afvangen middels instellingen in je view ('view access'), maar wat als het soort access wat jíj nodig hebt daar niet tussen staat?

Een voorbeeld binnen deze context:

Je bouwt een Drupal social intranet waarin je wilt samenwerken in afgeschermde groepen. Binnen de groep heb je bijvoorbeeld een lijst met 'group members', die je hebt opgebouwd in een view.

Je wilt natuurlijk dat alléén mensen die in deze afgeschermde groep zitten, deze lijst kunnen zien.

Drupal Grants API niet toepasbaar

Voor de doorgewinterde Drupal coders onder ons: omdat een user-view geen lijst met nodes is, kan je niet gebruikt maken van Drupal's Grants API.

Oplossing: een view access plugin

In OpenLucius (een social intranet, gebouwd in Drupal) liepen we tegen dit vraagstuk aan. En ook hier kwam een Drupal hook to the rescue. Het betreft een 'views hook', waarmee je 'view access plugins' kunt aanmelden.

Dit komt er op neer dat je toegang tot een view kunt afvangen in code. En wel in jouw eigen code, dus jóuw manier van toegang geven.

Howto in 5 stappen:

(We gaan er vanuit dat onderstaande code in een module staat met de namespace 'olcore'.)

1) View access plugin maken

Maak een custom 'views access plugin', in dit geval dus voor een check op 'is group member'.

Allereerst een nieuwe 'plugin' file toevoegen in de root van je module folder, met bijvoorbeeld de naam 'olcore_access_plugin.inc'. Door deze naamgeving is het duidelijk waar de file voor bedoeld is.

/**
* @file
* This file is for custom views access to group-users
*/

/**
* Access plugin that provides property based access control.
*/
class olcore_access_plugin extends views_plugin_access {

  // summary title
  function summary_title() {
    return t('Custom openlucius access plugin for groups');
  }

  // determine if the user has access to the view
  function access($account) {
    return olcore_views_group_access($account);
  }

  function get_access_callback() {
    return array('olcore_views_group_access', array());
  }
}

De functie olcore_views_group_access() is de custom access callback voor de toegangscontrole.

 

2) .info file

Vervolgens moet deze plugin ingeladen worden, dat doe je in de .info file van je module.

files[] = olcore_access_plugin.inc

 

3.) .module file

Nu moet de plugin nog even "aangemeld" worden bij views, dat doe je met de hook_views_plugins().

/**
* Implements hook_views_plugins()
*/
function olcore_views_plugins() {
  $plugins = array(
    'access' => array(
      'test' => array(
        'title' => t('Custom Access check for groups'),
        'help' => t('this is a custom access plugin for group access'),
        'handler' => 'olcore_access_plugin',
        'path' => drupal_get_path('module', 'olcore'),
      ),
    ),
  );
  return $plugins;
}

 

4.) .module file

Nu hoeft alleen de daadwerkelijke 'access functie' nog geschreven te worden. Hierin bepaal je welke Drupal users toegang krijgen tot de view.

Voor onze module is dat olcore_views_group_access(), deze functie bevat dus de logica voor de toegangsverlening.

function olcore_views_group_access($account = NULL) {
  global $user;
  // check if this function is being called from the view group-users
  if (arg(0) == 'group-users') {
    $group_id = arg(1);
    // if someone is in the group return TRUE otherwise return FALSE.
    return _olcore_user_in_group($group_id, $user -> uid);
  }
  return FALSE;
}

 

5) Keep calm & flush cache

Nu nog even de cache flushen en je kunt in views gebruik maken van je eigen access plugin:
Drupal views acccess plugin

Wrap up

Vragen, aanvullingen? Let me know!

--
Cheers, Joris

Comments

Nóg meer
kennis nodig?

Check ons ons blog archief >