NextGEN Gallery: Galerien nur für bestimmte Benutzer freigeben

nextgen-gallery-customfield

Wie können einzelne Galerien nur für bestimmte Benutzer freigegeben werden?

Das kann für Seiten sinnvoll sein, für die differenzierte Zugriffsberechtigungen gelten sollen, beispielsweise Kundenbereiche, Firmennetze, Community- oder auch Familien-Seiten, in denen nicht jeder alle Galerien sehen soll.

Das NextGEN-Gallery-Plugin bringt selbst keine detaillierte Rechteverwaltung mit. Die enthaltene Rollenverwaltung erlaubt nur einige globale Einstellungen, die für alle Alben und Galerien gelten. Auch mit WordPress-Bordmitteln oder anderen Rollen-Plugins wäre die Zugriffsteuerung auf einzelne NextGEN-Galerien nur auf Posting-Ebene möglich.

Man müsste also für jede einzelne Galerie, für die man bestimmte Berechtigungen vergeben möchte, ein separates Posting erstellen. Oder man müsste Galerien mit gleichen Zugriffsberechtigungen in Alben zusammenfassen und jeweils separate Postings für diese Alben erstellen. Man könnte nicht so einfach neue Galerien vorhandenen Album-Postings hinzufügen, sondern müßte die dort gesetzten Berechtigungen beachten.

Bei größeren Bildersammlungen oder mehreren Benutzern wäre dies recht umständlich und unübersichtlich. Außerdem wären die Layout-Möglichkeiten eingeschränkt, da einzelne Postings in der Regel einfach untereinander angeordnet werden. Ein schickes Layout mit nebeneinander angeordneten Galerie-Thumbnails wäre ohne spezielle Anpassungen am verwendeten Theme nicht möglich.

Vier einfache Schritte führen zum Ziel

Benötigt wird also eine Möglichkeit, die Zugriffsrechte für jede einzelne Galerie steuern zu können, ohne dafür komplexe Strukturen zu verwalten oder spezielle Theme-Anpassungen vornehmen zu müssen. Das geht so:

nextgen-gallery-customfield

Neues “Custom Field” in den “Gallery Settings”

1. NextGEN Custom Fields installieren. Damit ist es möglich, zusätzliche Felder zu NextGEN-Galerien und -Bildern hinzuzufügen. Nach der Installation erscheint im WordPress-Menü der Punkt “NGG Custom Fields”. Dort wird ein neues “Gallery Custom Field” erstellt. Ein passender [Display Name] wäre “Berechtigte“, als [Field Type] wird “Text Input” gewählt.

Wird nun eine Galerie geöffnet (NextGEN-Menü | Manage Galleries), findet sich dort die neue Eingabezeile “Custom Fields“. Dort werden nun alle für diese Galerie berechtigten Benutzernamen eingetragen, als kommagetrennte Aufzählung.

Hinweis: Wird später eine neue Galerie angelegt, muss das vorhandene CustomField über das Menü “NGG Custom Fields” noch mit dieser Galerie verknüpft werden, damit es auch in der neuen Galerie erscheint.

2. User Specific Content installieren. Dieses Plugin erlaubt es, Seiten und Postings so zu schützen, dass generell nur angemeldete Benutzer zugreifen können. Grundlage für die benutzerspezifische Zugriffssteuerung für einzelne Galerien.

3. Erstellen der neuen PHP-Datei isUserPermitted.php. In diese wird die Methode zur Abfrage der Zugriffsberechtigung geschrieben. Diese Datei enthält nur diese eine Methode und wird dort abgelegt, wo auch die Custom-Templates liegen, also in “wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/view/”.

<!-- ../ngglegacy/view/isUserPermitted.php -->
<?php
  function isUserPermitted($gal) {
    global $current_user; 
    get_currentuserinfo();
    $loginUser = strtolower($current_user->user_login);
    // Get gallery-specific restrictUser-list
    $restrictUser = nggcf_get_gallery_field($gal->gid, "Berechtigte"); 
    $restrictUser = trim($restrictUser);
    $author_user = get_userdata((int) $gal->author);
    $autor = $author_user->display_name;
    // echo ($loginUser . " / " .$restrictUser . " / " . $autorUser);
    $userInArray = FALSE;
 
    // Empty means -> no restriction
    if (empty($restrictUser)) {
      $restrictUser = "Alle";
    } else {
      $userArray = explode(",", $restrictUser);
      $cleanedUserArray = array_map('trim', $userArray);
      $userArray = array_map('strtolower', $cleanedUserArray);
      $userInArray = in_array($loginUser, $userArray);

      // Accept gallery author
      if ($userInArray != TRUE) {
        if (strtolower($autor) == $loginUser) {
          $restrictUser = $restrictUser . ", " . $autor;
          $userInArray = TRUE;
        }
      }
    }
    
    if (current_user_can( 'add_users' ) || 
       $restrictUser == "Alle" || $userInArray) {
      return TRUE;
    }
     return FALSE;
  }
?>

4. Erstellen eines Album-Templates, das bei Anzeige der enthaltenen Galerien die Zugriffsrechte beachtet. Als Basis wird das mitgelieferte Custom-Template “album-compact.php” verwendet. Es wird zunächst als “album-restricted.php” gespeichert und bindet dann die PHP-Methode zur Prüfung der Zugriffsrechte ein:

<!-- ../ngglegacy/view/album-restricted.php -->

<div class="ngg-albumoverview">

 <?php
  require_once("isUserPermitted.php");
 ?>

   <!-- List of galleries -->
   // ...

Direkt unterhalb dieser eingebundenen PHP-Datei startet der Loop, mit dem die Galerien aufgelistet werden. In diesen Loop wird nun noch eine Abfrage eingesetzt, die die Berechtigungsprüfung aufruft:

 
   <!-- List of galleries -->
   <?php foreach ($galleries as $gallery) : ?>

     <?php
       if (isUserPermitted($gallery)) {
     ?>

       <div class="ngg-album-compact">
         <div class="ngg-album-compactbox">
         // ...

       </div>

     <?php } ?>

   <?php endforeach; ?>

Damit werden nur jene Galerien aufgelistet, für die der jeweils angemeldete Benutzer als berechtigt eingetragen wurde.
Als zusätzliches Bonbon könnte man die berechtigten Nutzer für jede Galerie anzeigen. Dazu wird die Abfrage noch etwas erweitert:


   <!-- List of galleries -->
   <?php foreach ($galleries as $gallery) : ?>

     <?php
       if (isUserPermitted($gallery)) {
         $restrictUser = nggcf_get_gallery_field($gallery->gid, 
           "Berechtigte");
         $restrictUser = trim($restrictUser);
         if (empty($restrictUser)) {
           $restrictUser = "Alle";
         }
     ?>

       <div class="ngg-album-compact">
         <div class="ngg-album-compactbox">
         // ...

         <?php if (@$gallery->counter > 0) : ?>
         // ...
           <span><?php echo("Sichtbar für: " . $restrictUser); ?></span>
 
         <?php endif; ?>
       </div>

     <?php } ?>

   <?php endforeach; ?>

Ergebnis

Das war es schon fast!

Jeder Galerie können nun Benutzernamen zugeordnet werden, und das angepasste Album zeigt nur noch Galerien an, für die der angemeldete  Benutzer als Berechtigter eingetragen ist.

Das erstellte Album-Template album-restricted.php muss noch in das NextGEN-Plugin-Verzeichnis kopiert werden, nach “../ngglegacy/view/album-restricted.php”, wo auch die anderen Custom-Templates liegen. Um es zu verwenden, kann es entweder global in den “Gallery Settings | NextGEN Basic Compact Album | Template” gesetzt werden. Alternativ kann es in einem Beitrag mit Compact-Album speziell für diesen einzelnen Beitrag aktiviert werden:

nextgen-gallery-settings-2

“Compact Album” im Beitrag

Falls das neue Template nicht in der Auswahlliste (neben album-compact.php und album-extend.php) zu finden ist, liegt es entweder noch nicht im richtigen Verzeichnis oder verfügt noch nicht über die richtigen Dateiberechtigungen.


Diese hier vorgestellte Berechtigungsprüfung kann analog für das Extended-Album oder für Thumbnail-Galerien verwendet werden – entscheidend ist die Prüfung der Benutzernamen im Ausgabe-Loop desjenigen Templates, mit dem die jeweiligen Gallery-Inhalte ausgegeben werden.
Falls auch das NextGEN Widget zur Anzeige neuer oder zufälliger Bilder verwendet wird, sollte auch dieses Widget benutzerspezifisch gefiltert werden, damit es dem Nutzer nur Bilder aus Galerien anzeigt, für die er berechtigt ist.

Inspiriert wurde dieser Blogbeitrag von NextGEN Gallery – Restrict gallery access to specific users. Dort wird eine ganz ähnliche Methode für einzelne Benutzer vorgestellt, die ich hier etwas erweitert und ausgefeilt habe.

Ein Kommentar

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *