О зимлетах №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 будет рассказано подробнее в следующих статьях.

Итог.

Если Вы не хотите создавать зимлет самостоятельно, то можете скачать готовый. Поздравляю Вас, Вы только что получили полноценный, работающий и действительно полезный зимлет. Это оказалось реально просто. Конечно, есть некоторые подводные камни, которые не раскрыты в этой статье, но для этого есть следующие статьи цикла о зимлетах, которые помогут Вам во всем разобраться.

1989