Kontextmenüs und Schaltflächen im Dateiexplorer anpassen

Nutzbar ab: Version

Über ein Javascript-Ereignis kann das Kontextmenü vor der Anzeige im Dateiexplorer individuell erweitert bzw. angepasst werden.

Um die Darstellung anzupassen, ist eine JS-Datei unter folgendem Pfad abzulegen /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/explorer/post.include.js . Beim Einsatz in der Cloud wird [IHR-LAYOUT-PROJEKT] durch /cloud ersetzt. Diese Datei enthält eine JS-Funktion wOnBeforeShowContextMenu , welche vor der Anzeige des Kontextmenüs aufgerufen wird.

Allgemeines

Bitte beachten Sie, dass die folgenden Beispiele auf individuelle PHP-Skripte zugreifen. Wir möchten Sie nachdrücklich darauf hinweisen, dass diese Skripte die erforderlichen Sicherheitsmaßnahmen, wie u.a. die Überprüfung des Anmeldestatus (wUserCur::getType) oder der Schutz vor Cross-Site-Scripting (wRequest::getParametersSecure), enthalten sollten. Es ist wichtig, sicherzustellen, dass Ihre Anwendungen vor unberechtigtem Zugriff und anderen potenziellen Sicherheitsbedrohungen geschützt sind. Stellen Sie sicher, dass Sie alle geeigneten Sicherheitsvorkehrungen treffen, bevor Sie solche Beispiele in Produktionsumgebungen einsetzen.

Diverse Funktionsbeispiele

Das Quelltext-Beispiel zeigt unterschiedliche Möglichkeiten für zusätzliche Funktionen im Dateiexplorer auf.

Inhalt der post.include.js Datei

function wOnBeforeShowContextMenu(selectionData){

  //console.log(selectionData['header']);
  //console.log(selectionData['content']);
  
  // Schaltfläche für Verzeichnis erstellen im Kontextmenü ausblenden
  //if(wFilemanager.path == '/wDeutsch/xxx'){
  //  wFilemanager.wRemoveContextMenuFunction('createDir');
  //}
 
  if(selectionData['header']['numberFiles'] >= 1 && selectionData['header']['numberDirs'] == 0){
    var filePathes = '?';
    for(var path in selectionData['content']){
      //console.log(selectionData['content'][path]['type']);

      //wFilemanager.wRemoveContextMenuFunction('preview');    
      //wFilemanager.wRemoveContextMenuFunction('download'); 
      //wFilemanager.wRemoveContextMenuFunction('upload');
            
      //wFilemanager.wRemoveContextMenuFunction('share.sendLink');
      //wFilemanager.wRemoveContextMenuFunction('share.showLink');
     
      //wFilemanager.wRemoveContextMenuFunction('share.facebook');          
      //wFilemanager.wRemoveContextMenuFunction('share.twitter');
      //wFilemanager.wRemoveContextMenuFunction('share.google');
      
      //wFilemanager.wRemoveContextMenuFunction('open');
      //wFilemanager.wRemoveContextMenuFunction('edit');
      //wFilemanager.wRemoveContextMenuFunction('options');
      //wFilemanager.wRemoveContextMenuFunction('upload');
      //wFilemanager.wRemoveContextMenuFunction('checkin');
      //wFilemanager.wRemoveContextMenuFunction('checkout');
      //wFilemanager.wRemoveContextMenuFunction('rename');
      //wFilemanager.wRemoveContextMenuFunction('delete');
      //wFilemanager.wRemoveContextMenuFunction('refresh');
      //wFilemanager.wRemoveContextMenuFunction('cut');
      //wFilemanager.wRemoveContextMenuFunction('copy');
       
      //wFilemanager.wRemoveContextMenuFunction('restoreArchiving');

      filePathes += 'path[]=' + path + '&';
      //break;
    }
    /*Bei Mehrfachauswahl wird ein Button ergänzt, der die Pfade als Array übergibt.*/
    //wFilemanager.wAppendContextMenuFunction('requestDelete', {'icon' : '/prepareToDelete.gif', 'caption' : 'Zum Löschen vormerken', 'action' : "window.open('/[GlobalesProjekt]/wGlobal/scripts/php/prepareToDelete.php=" + filePathes.slice(0,-1) + "')"});
  }
  else if(selectionData['header']['numberDirs'] >= 1 && selectionData['header']['numberFiles'] == 0){
    for(var path in selectionData['content']){
      //console.log(selectionData['content'][path]['type']);

      //wFilemanager.wRemoveContextMenuFunction('open');
      //wFilemanager.wRemoveContextMenuFunction('edit');
      //wFilemanager.wRemoveContextMenuFunction('options');
      //wFilemanager.wRemoveContextMenuFunction('upload');
      //wFilemanager.wRemoveContextMenuFunction('checkin');
      //wFilemanager.wRemoveContextMenuFunction('checkout');
      //wFilemanager.wRemoveContextMenuFunction('rename');
      //wFilemanager.wRemoveContextMenuFunction('delete');
      //wFilemanager.wRemoveContextMenuFunction('refresh');
      //wFilemanager.wRemoveContextMenuFunction('cut');
      //wFilemanager.wRemoveContextMenuFunction('copy');
         
      //wFilemanager.wAppendContextMenuFunction('requestSync', {'icon' : '/syncDir.gif', 'caption' : 'Verzeichnis synchronisieren', 'action' : "window.open('/syncDir.php?path=" + path + "')"});
      //break;
  
      /*
      // Beispiel für eine serverseitige Abfrage über AJAX
      wGetUrl('/_hasPermissionToShowReport.php?path=" + path + "', function(responseStr){
        // wenn das zuvor genannte Skript eine "1" zurückgibt (z.B. print "1";):
        if(responseStr == 1){
          wFilemanager.wAppendContextMenuFunction('requestReport', {'icon' : '', 'className' : 'wui-context-menu-selection-entry-delete', 'caption' : 'Report anzeigen', 'action' : "window.open('/showReport.php?path=" + path + "')"});
        }
        wFilemanager.wShowMenuContext();    
      });
      */
    } 
  } 
  else{
    //wFilemanager.wRemoveContextMenuFunction('refresh');  
    //wFilemanager.wRemoveContextMenuFunction('paste');
    //wFilemanager.wRemoveContextMenuFunction('createDir');
    //wFilemanager.wRemoveContextMenuFunction('createFile');  
   
    //wFilemanager.wAppendContextMenuFunction('requestReport', {'icon' : '/showReport.gif', 'caption' : 'Report anzeigen', 'action' : "window.open('/showReport.php?path=" + path + "')"});
  }
   
  // Funktionsaufruf nur dann nochmals am Ende, wenn dieser in den Abfragen zuvor nicht schon gesetzt ist:
  wFilemanager.wShowMenuContext(); 
}

function wOnAfterShowDir(){

  // Schaltfläche für Hochladen von Dateien im Dateiexplorer ausblenden
  //if(wFilemanager.path == '/wDeutsch/aktuelles'){
  //  wFilemanager.hideButton('upload');
  //}
  //else{
  //  wFilemanager.showButton('upload');
  //}

  // Schaltfläche für Verzeichnis erstellen im Dateiexplorer ausblenden
  //if(wFilemanager.path == '/wDeutsch/xxx'){
  //  wFilemanager.hideButton('createDir');
  //}

  // Einträge der Sprachwahl im Dateiexplorer (Erweitertes Sprachmanagement) formatieren (ab CMS-Version 19 (018.007.211.000))
  try{
    wFilemanager.addStyleToSelectableLanguage('/de-fr', 'opacity:0.5');
    wFilemanager.addStyleToSelectableLanguage('/de-hu', 'background:#ffffcc');
    wFilemanager.getElementSelectableLanguage('/de-gr').style.display = 'none';
  }
  catch(e){}
}

Beispiel für eine serverseitige Abfrage über AJAX

wGetUrl('/hasPermissionToShowReport.php?path' + path, function(responseStr){
  if(responseStr == 1){
    wFilemanager.wAppendContextMenuFunction('requestReport', {'icon' : '/showReport.gif', 'caption' : 'Report anzeigen', 'action' : "window.open('/showReport.php?path=" + path + "')"});
  }
  wFilemanager.wShowMenuContext();    
});

Über die Methode wFilemanager.wRemoveContextMenuFunction lassen sich bestehende Funktionen entfernen. Über die Methode   wFilemanager.wAppendContextMenuFunction   hingegen können zusätzliche Funktionen hinzugefügt werden.

Da das Kontextmenü selbst im Ereignis über wFilemanager.wShowMenuContext() aufgerufen werden muss, lassen sich auch asynchrone Logiken über AJAX in Kombination mit dem PHP-Framework umsetzen.

Beim Einsatz von AJAX muss die Methode wShowMenuContext innerhalb des Ergebnisses aufgerufen werden, da sie sonst vor der Antwort ausgeführt werden würde.

Datei entpacken

Die Funktion zum Entpacken von Archiven (zip) im Dateiexplorer ist standardmässig nur einem Benutzer vom Benutzertyp Administrator vorbehalten. Aus Sicherheitsgründen ist dies anderen Benutzertypen nicht freigeschaltet.

Über das Einbinden einer eigenen Funktion lässt sich ein Entpacken von Dateien auch z.B. Standard Pflegebenutzern ermöglichen.

Inhalt der post.include.js Datei für eigene Datei entpacken Schaltfläche

function unpackFile(path){
  wGetUrl('/default-wGlobal/wGlobal/scripts/php/_unpackZip.php?action=unzip&path=' + path, function(responseStr){});
  wFilemanager.hideMenuContext();
  wFilemanager.reload();
}
function wOnBeforeShowContextMenu(selectionData){
 
  if(selectionData['header']['numberFiles'] >= 1 && selectionData['header']['numberDirs'] == 0){
    for(var path in selectionData['content']){
      if(selectionData['content'][path]['type'] === 'file'){

        wGetUrl('/default-wGlobal/wGlobal/scripts/php/_unpackZip.php?action=checkPermission&path=' + path, function(responseStr){
          if(responseStr == 1){
            wFilemanager.wAppendContextMenuFunction(
              'requestReport',
              {
                'icon' : '',
                'className' : 'wui-context-menu-selection-entry-unpack',
                'caption' : 'Datei entpacken',
                'action' : "unpackFile('" + path + "')"
              });
          }


          wFilemanager.wShowMenuContext();
        });

      }
    } 
  }

  // ...

  else{
    //...
  }
   
  // Funktionsaufruf nur dann nochmals am Ende, wenn dieser in den Abfragen zuvor nicht schon gesetzt ist:
  wFilemanager.wShowMenuContext(); 
}

Das in der unpackFile-Funktion verwendete PHP-Skript (hier: _unpackZip.php) finden Sie anbei. Bei Bedarf passen Sie dies an Ihre Bedürfnisse an.
Der Einsatz des Skriptes erfolgt auf eigene Gewähr!

Inhalt des Entpack-Skriptes (_unpackZip.php)

require_once($_SERVER['DOCUMENT_ROOT'].'/weblication/grid.php');

error_reporting(0);


/* Berechtigungsprüfung */
function checkPermission(string $path):bool{

  if(wUserCur::getType() === 'admin'){
    return true;
  }

  return false;

}

function unzip(string $path):bool{
  $dir = wPathName::getDirFile($path);
  return wZIP::unzip($path,$dir);
}


$path = wRequest::getParameterSecure('path') ?? null;
$action = wRequest::getParameterSecure('action') ?? null;

if(empty($action)){
  exit('0');
}

if(empty($path)){
  exit('0');
}

if(wRepository::documentExists($path) === false){
  exit('0');
}

if(wPathName::getFileExtension($path) !== 'zip'){
  exit('0');
}

if(checkPermission($path) === false){
  exit('0');
}

if($action === 'checkPermission'){
  exit('1');
}

if($action === 'unzip'){
  print unzip($path);
  exit();
}

exit('0');