2016-05-19 14 views
6

Ich arbeite an einer benutzerdefinierten share-Taste mit dem Elfinder, gibt es Tutorial zum Anpassen des Rechtsklick-Menüs, und ich habe es implementiert. Allerdings gibt es einige Regeln, die ich mag für das MenüBenutzerdefiniert das Rechtsklick-Menü von Elfinder (ein jquery-Datei-Manager-Plugin)

1) For folder only, exclude the button for file 
2) For root level only, exclude the button for sub level folder 
3) For single folder only, if select more than one folder will exclude the button 

hier anzuwenden ist der aktuelle Code, gerade jetzt die Share-Taste, aber nicht mit den oben genannten Regeln:

elFinder.prototype.i18.zh_TW.messages['cmdsharefolder'] = 'Share'; 
    elFinder.prototype._options.commands.push('sharefolder'); 
    elFinder.prototype.commands.sharefolder = function() { 
     this.exec = function (hashes) { 
      //open share menu 
     } 
     this.getstate = function() { 
      return 0; 
     } 
    } 

Und die elfinder Beispiel:

var elfinder = $('#elfinder').elfinder({ 
    url: '<?= $connector; ?>', 
    soundPath: '<?= site_url('assets/plugins/elFinder/sounds/rm.wav'); ?>', 
    height: 700, 
    lang: 'zh_TW', 
    uiOptions: { 
     // toolbar configuration 
     toolbar: [ 
      ['back', 'forward'], 
      ['reload'], 
      ['mkdir', 'upload'], 
      ['copy', 'cut', 'paste', 'rm'], 
      ['rename'], 
      ['view', 'sort'] 
     ] 
    }, 
    contextmenu: { 
     navbar: ['open', '|', 'copy', 'cut', 'paste', 'duplicate', '|', 'rm', '|', 'info'], 
     cwd: ['reload', 'back', '|', 'upload', 'mkdir', 'paste', '|', 'info'], 
     files: [ 
      'open', 'quicklook', 'sharefolder', '|', 'download', '|', 'copy', 'cut', 'paste', 'rm', '|', 'rename', '|', 'info' 
     ] 
    }, 
    ui: ['toolbar', 'tree', 'stat'] 
}).elfinder('instance'); 

die Probleme sind:

1), wie die Regeln ab anzuwenden Ove? (Wenn die Regeln nicht gelten, kann Abhilfe mit Kontrollkästchen und Popup-Alarm-Box, schlagen Sie bitte die Möglichkeit für die Überprüfung, danke)

2) gibt es eine Möglichkeit zu erfassen, welcher Ordner ausgewählt ist, z. Vollordnerpfad etc ...

Hier wird der doc ich studiert habe, ist die Musterkoffer für den allgemeinen Gebrauch: https://github.com/Studio-42/elFinder/wiki/Custom-context-menu-command

Vielen Dank für die Unterstützung.

+0

Ich denke, Sie müssen spielen in. Getstate() Es muss "das", das "Dateien" enthält, so würde ich es analysieren und darauf basierend würde 'zurück -1 | 0;' – faster

+0

Ordner haben die Klasse "directory" zugewiesen, vielleicht könntest du den Knopf abhacken, abhängig von der Anwesenheit der Klasse? Nicht sicher über die Wurzel ... dieses ähnliche Thema kann mehr Licht als ich werfen: http://stackoverflow.com/questions/28926500/how-to-get-current-directory-in-elfinder – LordNeo

Antwort

2

Was Sie erreichen möchten, ist möglich, hängt aber stark davon ab, wie Ihr Connector funktioniert.

Um mit Ihren Regeln zu arbeiten, müssen Sie entweder Code in this.exec oder this.getstate hinzufügen. Für jede Option gibt es Vor- und Nachteile.

  1. Wenn Sie den Code hinzufügen, um Ihren Code this.getstate könnte für eine einzelne Aktion (zB mehr als einmal ausgeführt werden: Wenn Sie mehrere Ordner auswählen, wird die Funktion, wenn Sie auf dem ersten Ordner klicken ausgeführt, auf der letzten und wenn du mit der rechten Maustaste klickst).

    Mit this.getstate können Sie jedoch die Option (Schaltfläche) in jeder Situation ausblenden, die die Anforderungen (Regeln) nicht erfüllt.

  2. Das Hinzufügen von Code zu this.exec stellt sicher, dass der Code nur einmal pro Aktion ausgeführt wird, aber die Schaltfläche ist immer vorhanden, auch wenn die Regeln nicht zutreffen.

    Wenn Sie dies wählen, müssen Sie mit einer Art von Warn- oder Dialogmeldungen an den Benutzer arbeiten, um ihn zu informieren, warum das Freigabe-Menü nicht angezeigt wird.

Im folgenden Code habe ich this.getstate verwendet, aber Sie können den Code this.exec bewegen. Auf der Seite Javascript müssen Sie etwas verwenden:

elFinder.prototype.i18.zh_TW.messages['cmdsharefolder'] = 'Share'; 
elFinder.prototype._options.commands.push('sharefolder'); 
elFinder.prototype.commands.sharefolder = function() { 
    var self = this, 
     fm = self.fm; 

    this.exec = function (hashes) { 
     // Display the share menu 
    }; 

    this.getstate = function() { 
     var hashes = self.fm.selected(), result = 0; 
     // Verifies rule nr 3: For single folder only, 
     // if select more than one folder will exclude the button 
     if (hashes.length > 1) { 
      return -1; 
     } 

     // Rule 1 and 2 exclude itself. By this I mean that rule nr 2 
     // takes precedence over rule nr 1, so you just need to check 
     // if the selected hash is a root folder. 
     $.ajax({ 
      url: 'file-manager/check-rule-on-hash', 
      data: hashes, 
      type: 'get', 
      async: false, 
      dataType: 'json', 
      success: function(response) { 
       if (!response.isRoot) { 
        result = -1; 
       } 
      } 
     }); 

     return result; 
    } 
} 

Erläuterung:

  1. Regel nr 3 ist einfach, da Sie Zugriff auf die Anzahl der ausgewählten Elemente durch Javascript haben. Sie müssen also nur die Anzahl der ausgewählten Hashes zählen. Wenn diese Zahl größer als 1 ist, bedeutet dies, dass der Benutzer mehr als einen Artikel ausgewählt hat und das Menü nicht angezeigt werden sollte.

  2. Regel Nr. 2 ist ein wenig komplizierter, weil Sie den ausgewählten Hash "validieren" müssen, und deshalb habe ich angefangen zu sagen, dass dies davon abhängt, wie Ihr Connector funktioniert.

    Zum Beispiel habe ich einen benutzerdefinierten PHP-Connector, wo die Ordnerstruktur durch eine Datenbanktabelle definiert ist. Obwohl alle Dateien physisch auf der Festplatte gespeichert sind, werden die Metadaten in derselben Tabelle gespeichert (meistens weil alle Berechtigungen über die Datenbank definiert sind). In meinem Fall ist es ein Leichtes, einen Ajax-Aufruf durchzuführen und zu überprüfen, ob ein bestimmter Hash ein Stammordner ist, weil diese Information in der Datenbank gespeichert ist und ich diese Information mit einer einfachen Abfrage abrufen kann.

Da ich die generische Lösung sein kann. Nicht sicher, wie Sie Ihren Anschluss funktioniert, ist ein Ajax-Aufruf an den Server auszuführen, mit dem ausgewählten Hash, und zu überprüfen, ob die Hash ein Stammordner ist Der Server sollte ein Objekt mit der Eigenschaft isRoot zurückgeben, das entweder true oder false ist.