几天前,我很难找到默认情况下在每个dashlet的标题栏中添加自定义操作的最佳方法。
在这个阶段,我知道每个dashlet的webscript中的操作都被设置为一个小部件。例如,在 docsummary.get.js :
中 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];
然后,小部件在呈现页面时进行实例化。
我已经找到了下一个方法:
每次呈现页面时,在自定义JS片段中使用我需要的操作扩充每个窗口小部件实例的“actions”数组。我使用这样的技术执行了一些测试但没有成功:http://acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/
通过添加自定义操作来修改Alfresco.widget.DashletTitleBarActions的原型。我相信它不起作用,因为在实例化小部件时总是会覆盖“actions”对象,正如您在上面的代码中看到的那样。
为每个dashlet的webscript创建一个扩展模块,为每个Alfresco.widget.DashletTitleBarActions小部件定义添加自定义操作,类似于Dave Drapper在帖子http://blogs.alfresco.com/wp/ddraper/2012/05/22/customizing-share-javascript-widget-instantiation-part-1/中解释
获取每个dashlet div容器,并在页面准备好后添加直接操作DOM所需的操作。它应该可以工作,但我觉得它有点脏和不一致,所以我想避免它。
有人能想象一个更好,更可行的解决方案吗?
答案 0 :(得分:4)
让我们首先向单个现有的dashlet添加一个动作。正如您在(3)中建议的那样,您可以定义一个可扩展性模块,通过拦截和修改其模型来更改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({...})
}
}
}
您在对象文字中添加的内容取决于您的操作的实现方式。如果您需要一些客户端行为(而不是静态链接),那么您还需要使用CustomEvent
绑定它 - 请参阅RSS Feed小面板org/alfresco/components/dashlets/rssfeed.get.html.ftl
作为示例。
可扩展性模块的缺点是您需要为每个dashlet定义显式扩展JS文件。您可以轻松地将上面的代码放在一个中心文件中,然后将其包含在需要它的每个dashlet扩展中,例如。
<import resource="classpath:alfresco/site-webscripts/org/myco/utils/dashlet.utils.js">
答案 1 :(得分:1)
我会在这里采用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++)
{
如您所见,它会反转操作参数的顺序,然后添加开始循环操作。因此,如果您希望您的操作成为第一个或最后一个,您可以编辑此文件并添加自定义操作:
myAction = {
"cssClass": "customCSS"
, "tooltip": this.msg("slingshot.messages.generic.tooltip")
, "eventOnClick": ...
...
}
this.options.actions.push(myAction);
// now move on with the rest of the loop
for (...)
当然,这需要覆盖共享自己的js文件,而不是扩展它。如果你不能这样做,那么你必须在每个包含share.js的页面上包含一个自定义JS文件,并确保它在 share.js 之后但在任何小部件之前执行准备就绪,并覆盖小部件本身的 onReady 方法,以便它执行此操作。