Как добавить пользовательское действие по умолчанию в строку заголовка дашлета в Alfresco Share
Так как несколько дней назад я изо всех сил пытался найти лучший способ добавить пользовательское действие в строке заголовка каждого дашлета по умолчанию.
На этом этапе я знаю, что действия настроены как виджет в веб-скрипте каждого дашлета. Например, в 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];
Затем виджет создается, когда страница отображается.
Я выяснил следующие подходы:
Добавляйте в массив "actions" каждого экземпляра виджета нужное мне действие в пользовательском фрагменте JS каждый раз, когда отображается страница. Я выполнил некоторые тесты без успеха, используя такие методы: http://acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/
Измените прототип Alfresco.widget.DashletTitleBarActions, добавив мое настраиваемое действие. Я считаю, что он также не работает, так как объект "действия" всегда переопределяется при создании экземпляра виджета, как вы можете видеть в вставленном выше коде.
Создайте модуль расширения для веб-скрипта каждого дашлета, который добавляет настраиваемое действие для каждого определения виджета Alfresco.widget.DashletTitleBarActions, аналогично тому, как Дейв Дрэппер объясняет в своем посте http://blogs.alfresco.com/wp/ddraper/2012/05/22/customizing-share-javascript-widget-instantiation-part-1/
Получите каждый контейнер div дашлета и добавьте необходимое действие, непосредственно манипулируя DOM, когда страница будет готова. Это должно работать, но я считаю это немного грязным и непоследовательным, поэтому я бы хотел этого избежать.
Кто-нибудь может представить лучшее и выполнимое решение?
2 ответа
Начнем с добавления действия в один существующий дашлет. Как вы предлагаете в (3), вы можете определить модуль расширяемости, чтобы изменить поведение дашлета, перехватывая и изменяя его модель.
Создание модуля расширяемости хорошо освещено в статье блога и последующих постах, но хитрость здесь заключается в том, чтобы обеспечить расширение 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-канал org/alfresco/components/dashlets/rssfeed.get.html.ftl
для примера.
Недостатком модуля расширяемости является то, что вам потребуется определить файл JS явного расширения для каждого дашлета. Вы можете легко поместить приведенный выше код в центральный файл, а затем включить его в каждое расширение дашлета, где это необходимо, например,
<import resource="classpath:alfresco/site-webscripts/org/myco/utils/dashlet.utils.js">
Я бы взял дорогу № 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 общих ресурсов, а не расширять его. Если вы не можете сделать это, вам нужно будет включить собственный файл JS на каждую страницу, где также включен файл share.js, и убедиться, что он выполняется после share.js, но до того, как какой-либо из виджетов будет готов, и перезаписать onReady. метод самого виджета, так что он делает это.