Alfresco ECM – удобная платформа для организации корпоративного документооборота и совместной работы. Пользователи могут генерировать новые документы, порождая их в процессе прозрачных обсуждений. Естественно, хочется получать уведомления о новых постах и комментариях к документам. По умолчанию Alfresco может транслировать RSS ленты событий пользователя, где участник может видеть все события, происходящие на его сайтах. Здесь есть досадное неудобство: в RSS не приходит текст комментария, тело и тема в RSS Alfresco полностью совпадают. Как это исправить, я опишу далее.
Все действия пользователей попадают в подсистему Activity Service. Само действие совершается посредством подпрограмм JavaScript, в функциях которых имеется вызов процедур отправки в хранилище событий. Почему-то разработчики Alfresco Community сознательно заложили туда отправку одинаковых тела и темы RSS.
Сформированное сообщение проходит через шаблонизатор, который оборачивает строки в соответствии с локальными языковыми настройками.
Пример из файла activity-list.get.properties:
org.alfresco.comments.comment-updated={1} updated comment on {0}
Переменные в фигурных скобках – это и есть те сущности, которые попадают в Activity Service. Их значение описывается в самом файле в виде комментария:
## 0 = Item title / page link, 1 = User profile link, 2 = custom0, 3 = custom1, 4 = Site link
Файл activity-list.get.properties существует для каждого языка, в том числе и для русского. Таким образом, именно благодаря этому шаблону сообщений мы можем получать русскоязычный текст в нашем RSS. Сразу обратим внимание на переменную custom0, ее код – {2}, и она не используется в этом файле. Мы будем ее использовать.
{4} - ссылка на сайт, {0} - в зависимости от контекста либо заголовок, либо ссылка на страницу, {1} - ссылка на профиль пользователя.
Чтобы обернуть текстовые сообщения в вид потока RSS, используется файл activity-list.get.atomfeed.ftl. Обратим внимание на его странную особенность:
<#assign detailHTML = msg(activity.type, itemLink, userLink, activity.custom0, activity.custom1)> <#if mode = "user" && !activity.suppressSite><#assign detailHTML = msg("in.site", detailHTML, siteLink)></#if> <#if activity.custom0 != ""><#assign detailHTML = activity.custom0></#if> <summary type="html"> <![CDATA[${msg(detailHTML)}]]> </summary>
Особенность в том, что механизм получения title и summary практически идентичен (title по коду выше, я не стал его здесь приводить). Красным я выделил добавленную мной строку. Ее суть в том, чтобы при непустом поле custom0 выводить его в качестве тела сообщения RSS, иначе по умолчанию туда выведется то же самое, что и в title.
Теперь необходимо подготовить сами сообщения для использования поля custom0. Ниже я опишу, какие изменения и в каких файлах нужно сделать.
Директория \Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\repository\links
Файл links.post.json.js
var siteId = url.templateArgs.site; var linkUrl = json.get("url"); var data = { title: json.get("title"), page: json.get("page") + "?linkId=" + nodeName, custom0: json.get("description") + "<br/><a href='" + linkUrl + "'>" + linkUrl + "</a>" };
Файл links.put.json.js – сделать то же самое, что указано выше.
Директория \Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\repository\discussions\posts
Файл forum-post.put.json.js
var data = { title: topicData.post.properties.title, page: json.get("page") + "?topicId=" + topicData.topic.name, custom0: model.postData.post.content, params: { topicId: topicData.topic.name } }
Файл forum-post-replies.post.json.js
var data = { title: topicData.post.properties.title, page: json.get("page") + "?topicId=" + topicData.topic.name, custom0: model.postData.post.content }
Директория \Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts\org\alfresco\repository\discussions\forum
Файл forum-posts.post.json.js
var data = { title: model.postData.post.properties.title, page: json.get("page") + "?topicId=" + model.postData.topic.name, custom0: model.postData.post.content }
После применения всех вышеуказанных действий Alfresco начнет использовать поле custom0 и выводить его в качестве тела сообщения. Таким образом, в RSS можно делать абсолютно любые преобразования, и даже добавлять события по своему усмотрению.