Как добавить пользовательское действие по умолчанию в строку заголовка дашлета в 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];

Затем виджет создается, когда страница отображается.

Я выяснил следующие подходы:

  1. Добавляйте в массив "actions" каждого экземпляра виджета нужное мне действие в пользовательском фрагменте JS каждый раз, когда отображается страница. Я выполнил некоторые тесты без успеха, используя такие методы: http://acidmartin.wordpress.com/2012/03/19/getting-instance-names-of-a-javascript-object/

  2. Измените прототип Alfresco.widget.DashletTitleBarActions, добавив мое настраиваемое действие. Я считаю, что он также не работает, так как объект "действия" всегда переопределяется при создании экземпляра виджета, как вы можете видеть в вставленном выше коде.

  3. Создайте модуль расширения для веб-скрипта каждого дашлета, который добавляет настраиваемое действие для каждого определения виджета Alfresco.widget.DashletTitleBarActions, аналогично тому, как Дейв Дрэппер объясняет в своем посте http://blogs.alfresco.com/wp/ddraper/2012/05/22/customizing-share-javascript-widget-instantiation-part-1/

  4. Получите каждый контейнер 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. метод самого виджета, так что он делает это.

Другие вопросы по тегам