如何将默认自定义操作添加到dashlet';Alfresco Share中的s标题栏
几天前,我一直在努力寻找在每个dashlet的标题栏中默认添加自定义操作的最佳方法 在这个阶段,我知道在每个dashlet的webscript中,操作都被设置为一个小部件。例如,在docsummary.get.js中:如何将默认自定义操作添加到dashlet';Alfresco Share中的s标题栏,alfresco,custom-action,alfresco-share,dashlet,Alfresco,Custom Action,Alfresco Share,Dashlet,几天前,我一直在努力寻找在每个dashlet的标题栏中默认添加自定义操作的最佳方法 在这个阶段,我知道在每个dashlet的webscript中,操作都被设置为一个小部件。例如,在docsummary.get.js中: var dashletTitleBarActions = { id : "DashletTitleBarActions", name : "Alfresco.widget.DashletTitleBarActions", useMessa
var dashletTitleBarActions = {
id : "DashletTitleBarActions",
name : "Alfresco.widget.DashletTitleBarActions",
useMessages : false,
options : {
actions: [
{
cssClass: "help",
bubbleOnClick:
{
message: msg.get("dashlet.help")
},
tooltip: msg.get("dashlet.help.tooltip")
}
]
}
};
model.widgets = [docSummary, dashletResizer, dashletTitleBarActions];
然后,当呈现页面时,小部件被实例化
我已经找到了下一个方法:
有人能想出一个更好、可行的解决方案吗?让我们从向单个现有dashlet添加操作开始。正如您在(3)中所建议的,您可以定义一个可扩展性模块,通过拦截和修改dashlet的模型来更改dashlet的行为 博客文章和后续文章详细介绍了创建可扩展性模块,但这里的技巧是提供一个控制器JavaScript扩展,用于定位
DashletTitleBarActions
小部件并将您的操作添加到其中,例如
if (model.widgets)
{
for (var i = 0; i < model.widgets.length; i++)
{
var widget = model.widgets[i];
if (widget.id == "DashletTitleBarActions")
{
widget.actions.push({...})
}
}
}
让我们从向单个现有dashlet添加操作开始。正如您在(3)中所建议的,您可以定义一个可扩展性模块,通过拦截和修改dashlet的模型来更改dashlet的行为 博客文章和后续文章详细介绍了创建可扩展性模块,但这里的技巧是提供一个控制器JavaScript扩展,用于定位
DashletTitleBarActions
小部件并将您的操作添加到其中,例如
if (model.widgets)
{
for (var i = 0; i < model.widgets.length; i++)
{
var widget = model.widgets[i];
if (widget.id == "DashletTitleBarActions")
{
widget.actions.push({...})
}
}
}
我会在这里走2号路 这个小部件的定义在share.js文件({share.context}/js/share.js)中。对于Alfresco 4.2,DashletTitleBarActions在第1700行左右定义。在小部件的onReady处理程序中,有一个处理操作的循环
// Reverse the order of the arrays so that the first entry is furthest to the left...
this.options.actions.reverse();
// Iterate through the array of actions creating a node for each one...
for (var i = 0; i < this.options.actions.length; i++)
{
当然,这需要覆盖共享的js文件,而不是扩展它。如果你做不到这一点,那么你就必须在每个包含share.JS的页面上都包含一个自定义JS文件,并确保它在share.JS之后但在任何小部件准备就绪之前执行,然后覆盖小部件本身的onReady方法,这样它就可以做到这一点。我在这里选择第二条路 这个小部件的定义在share.js文件({share.context}/js/share.js)中。对于Alfresco 4.2,DashletTitleBarActions在第1700行左右定义。在小部件的onReady处理程序中,有一个处理操作的循环
// Reverse the order of the arrays so that the first entry is furthest to the left...
this.options.actions.reverse();
// Iterate through the array of actions creating a node for each one...
for (var i = 0; i < this.options.actions.length; i++)
{
当然,这需要覆盖共享的js文件,而不是扩展它。如果你不能做到这一点,那么你就必须在每个包含share.JS的页面上包含一个自定义JS文件,并确保它在share.JS之后但在任何小部件准备就绪之前执行,然后覆盖小部件本身的onReady方法,这样它就可以执行此操作。你想添加什么样的操作?考虑到你的答案,我相信无论你怎么说,2都是正确的方式。一个像帮助每个dashlet一样的动作。尽管如此,我相信选项2可以被放弃,因为即使我修改了原始的share.js(定义了objet Alfresco.widget.DashletTitleBarActions),它也不会工作,因为每个dashlet的webscript都覆盖了上面代码段中的“actions”对象。这意味着任何可能的“预加载”操作都将被删除…选项(2)不合适,因为您永远不应该修改核心Alfresco JS类的原型。我认为,如果我可以像@zladuric在回答中解释的那样覆盖onReady方法,但不更改原始share.JS文件,那么选项2将是合适的。我强烈认为一个坏的做法和一个不适当的解决方案的事实,改变露天的源代码,无论资源是什么。那将是我最后的资源,我不同意。您永远不应该修改Alfresco类,即使这些修改位于另一个文件中。相反,您应该使用
YAHOO.lang.extend()
使用您自己的实现(应该在您自己的命名空间中)扩展这些类,然后使用可扩展性模块插入自定义类的名称。您希望添加什么类型的操作?考虑到你的答案,我相信无论你怎么说,2都是正确的方式。一个像帮助每个dashlet一样的动作。尽管如此,我相信选项2可以被放弃,因为即使我修改了原始的share.js(定义了objet Alfresco.widget.DashletTitleBarActions),它也不会工作,因为每个dashlet的webscript都覆盖了上面代码段中的“actions”对象。这意味着任何可能的“预加载”操作都将被删除…选项(2)不合适,因为您永远不应该修改核心Alfresco JS类的原型。我认为,如果我可以像@zladuric在回答中解释的那样覆盖onReady方法,但不更改原始share.JS文件,那么选项2将是合适的。我强烈认为一个坏的做法和一个不适当的解决方案的事实,改变露天的源代码,无论资源是什么。那将是我的v