О зимлетах №6: Создание зимлета для управления тэгами.
В данной статье описан процесс создания зимлета, способного управлять тэгами. Главная его задача это дать пользователю возможность изменять состояния объектов (например "срочно", "выполнено", "в процессе") без удаления тэгов руками.
Введение.
В этой статье мы рассмотрим создание крайне полезного зимлета. Его задача очень проста. Обычно пользователи Zimbra создают тэги к письмам, названия которых описывают письма с точки зрения завершённости задачи: «to do», «done», «urgent» и другие. По-умолчанию в Zimbra для смены одного тэга на другой приходится вначале удалить старый, а затем назначить новый. Согласитесь, что это не удобно. Вы же создадите зимлет, который будет автоматически удалять старый тэг при установке нового!
Разработка.
Как говорилось в предыдущей статье, любой зимлет состоит из нескольких файлов. Definition File — обязателен. Все же остальные файлы могут быть, а могут и не быть. В статье про создание зимлета «Привет, Зимбра!» мы использовали только Definition File. Его было полностью достаточно. Второстепенные файлы становятся необходимы, когда в зимлет вносится специфический функционал, который нельзя описать с помощью Definition File.
Definition File.
Первым делом создайте файл описания зимлета com_maki_exclusivetag.xml.
<zimlet name="com_maki_exclusivetag" version="1.0" description="Exclusive tag - Removes all other tags when a tag is added"> <include>exclusivetag.js</include> <handlerObject>com_maki_exclusivetag_Handler</handlerObject> </zimlet>
Здесь все максимально просто. В первой строке указывается имя зимлета, его версия и описание. Во второй строке указывается файл с исходным кодом, а в третьей строке имя функции, описанной в прикреплённом файле, которая будет вызываться при инициализации зимлета.
Более подробно о XML файлах зимлетов будет рассказано в следующих статьях.
Java Script File.
Теперь создадим файл с расширением exclusivetag.js. В него мы будем добавлять код, который написан ниже. Я буду комментировать каждое значимое выполняемое в нем действие, чтобы архитектура внутреннего строения зимлета стала понятной.
function com_maki_exclusivetag_Handler() { }; // Пустая функция – читайте для чего она нужна ниже. com_maki_exclusivetag_Handler.prototype = new ZmZimletBase(); // Здесь Вы получаете объект на базу данных зимлетов, // через которую осуществляется управление. com_maki_exclusivetag_Handler.prototype.constructor = com_maki_exclusivetag_Handler; // В качестве конструктора класса указывается пустая функция, // описанная выше – нам ничего не надо делать на старте зимлета. com_maki_exclusivetag_Handler.prototype.init = function() { }; // Метод, который будет вызываться средой для обработки зимлетов // при инициализации – нам ничего не надо делать при инициализации, // так как зимлет у нас предельно простой и каких либо подключаемых // баз данных нет. Подробней о структуре кода зимлета будет рассказано // в следующих статьях. com_maki_exclusivetag_Handler.prototype.onTagAction = function(items, tag, doTag) { // Переопределяем функцию, которая вызывается при работе с тэгами. if (!doTag) return; var appController = appCtxt.getAppController(); for (var i = 0; i < items.length; i++) { for (var j = 0; j < items[i].tags.length; j++) { this._removeTag(items[i].id, items[i].tags[j]); } } // Получаем указатель на элемент управления приложением и удаляем // все тэги у выбранных галочками писем. }; com_maki_exclusivetag_Handler.prototype._removeTag = function(itemId, tagId) { var soapDoc = AjxSoapDoc.create("MsgActionRequest", "urn:zimbraMail"); var actionNode = soapDoc.set("action"); actionNode.setAttribute("id", itemId); actionNode.setAttribute("op", "!tag"); actionNode.setAttribute("tag", tagId); appCtxt.getAppController().sendRequest({soapDoc:soapDoc, asyncMode:true}); }; // Для каждого письма проделываем операцию по замене старых // тэгов на один новый. Более подробно о происходящем здесь // будет описано в следующих статьях, посвященных именно // программированию зимлетов.
Теперь необходимо добавить оба файла в ZIP архив с именем как и у файла с описание (за исключением его расширения) и положить получившийся архив в папку «zimlets» в Вашей пользовательской директории, а после этого перезапустить Zimbra Desktop. Подробнее об этом написано в статье «Создание зимлета “Hello, Zimbra”».
О программировании зимлетов на Java Script будет рассказано подробнее в следующих статьях.
Итог.
Если Вы не хотите создавать зимлет самостоятельно, то можете скачать готовый. Поздравляю Вас, Вы только что получили полноценный, работающий и действительно полезный зимлет. Это оказалось реально просто. Конечно, есть некоторые подводные камни, которые не раскрыты в этой статье, но для этого есть следующие статьи цикла о зимлетах, которые помогут Вам во всем разобраться.