2016-05-19 23 views
6

我正在與elfinder一起定製共享按鈕,有關於如何自定義右鍵菜單的教程,並且我已經實現了它。不過,也有一些規則,我想申請菜單自定義elfinder的右鍵菜單(一個jquery文件管理器插件)

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 

下面是當前的代碼,現在有分享按鈕,但不符合上述規則:

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; 
     } 
    } 

而且elfinder例如:

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'); 

的問題是:

1)如何應用這些規則AB奧雅納? (如果規則不適用,可以通過檢查和彈出警告框來解決,請建議檢查的方式,謝謝)

2)有沒有什麼方法可以捕獲選擇哪個文件夾,例如:完整的文件夾路徑等等

這是我所研究的文檔,樣本情況下是用於一般用途: https://github.com/Studio-42/elFinder/wiki/Custom-context-menu-command

非常感謝幫助。

+0

我想你需要玩.getstate() 必須有'這',其中包含'文件',所以我會分析它,並基於'將返回-1 | 0;' – faster

+0

文件夾具有分配的「目錄」類,也許你可以根據類的存在破解按鈕?不確定根...這個相似的主題可能會比我更多的光:http://stackoverflow.com/questions/28926500/how-to-get-current-directory-in-elfinder – LordNeo

回答

2

你試圖完成什麼是可能的,但它很大程度上取決於連接器的工作方式。

爲了符合您的規則,您必須在this.execthis.getstate中添加代碼。每個選項都有優點和缺點。

  1. 如果您添加代碼,this.getstate你的代碼可能會被多次執行單個動作(例如:當您選擇多個文件夾,當你點擊第一個文件夾執行該功能,就上當你點擊右鍵時)。

    但是,使用this.getstate您可以在任何不符合要求(規則)的情況下隱藏選項(按鈕)。

  2. 將代碼添加到this.exec可確保代碼僅在每次操作中執行一次,但即使規則不適用,該按鈕也始終存在。

    如果您選擇此選項,您需要使用某種警報或對話消息來告知用戶爲什麼不顯示共享菜單。

在下面的代碼,我用this.getstate,但你可以將代碼移植到this.exec。在JavaScript端需要使用這樣的事情:

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; 
    } 
} 

說明:

  1. 規則NR 3是很容易的,因爲你有機會獲得通過JavaScript所選項目的數量。所以你只需要計算所選散列的數量。如果該數字大於1,則表示用戶選擇了多個項目,並且不應顯示該菜單。

  2. 規則nr 2有點棘手,因爲你需要「驗證」所選的散列,這就是爲什麼我開始說這取決於你的連接器如何工作。

    例如,我有一個自定義的PHP連接器,其中的文件夾結構是通過數據庫表定義的。雖然所有文件都物理存儲在硬盤上,但元數據存儲在同一張表上(主要是因爲所有權限都是通過數據庫定義的)。在我的情況下,執行ajax調用並檢查給定的散列是否爲根文件夾是相當容易的,因爲該信息存儲在數據庫中,並且可以通過簡單查詢檢索該信息。

因爲我不能確定你的連接器是如何工作的,通用的解決方案是執行一個AJAX調用服務器,與所選的哈希,並驗證是否該散列是一個根文件夾。服務器應該返回一個對象,其屬性爲isRoot,即truefalse

相關問題