你想要完成的是什么,但它在很大程度上取决于你的连接器如何工作.
为了使用您的规则,您必须在this.exec或this.getstate中添加代码.每种选择都有利弊.
>如果您将代码添加到this.getstate,您的代码可能会针对单个操作执行多次(例如:当您选择多个文件夹时,该功能在您单击第一个文件夹时执行,在最后一个文件夹上执行,当您在右侧时执行点击).
但是,使用this.getstate,您可以在任何不符合要求(规则)的情况下隐藏选项(按钮).
>向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;
}
}
说明:
>规则nr 3很简单,因为您可以通过Javascript访问所选项目的数量.所以你只需要计算所选哈希的数量.如果该数字大于1,则表示用户选择了多个项目,并且不应显示该菜单.
>规则nr 2有点棘手,因为你需要“验证”所选的哈希,这就是为什么我开始说这取决于连接器的工作方式.
例如,我有一个自定义PHP连接器,其中文件夹结构是通过数据库表定义的.尽管所有文件都物理存储在硬盘驱动器上,但元数据存储在同一个表中(主要是因为所有权限都是通过数据库定义的).在我的情况下,执行ajax调用并检查给定的散列是否是根文件夹有点容易,因为该信息存储在数据库中,我可以通过简单的查询检索该信息.
由于我无法确定连接器的工作方式,因此通用解决方案是使用选定的哈希对服务器执行ajax调用,并验证该哈希是否为根文件夹.服务器应返回一个对象,其属性isRoot为true或false.