Как изменить значение дополнительного поля в задаче
Менять значение дополнительного поля при редактировании задачи достаточно просто: все дополнительные поля содержатся в HashMap внутри SecuredTaskTriggerBean, с которым оперируют триггеры для задач. Хранятся они в виде пар "Заголовок", "Значение", причем значение передается в строковом виде.
Таким образом, чтобы изменить значение поля, нужно в Task Edit/Before триггере вызвать
public SecuredTaskTriggerBean execute(SecuredTaskTriggerBean task) throws GranException { ... task.setUdfValue("Заголовок поля", "Значение"); ...
Значение, установленное в Before-триггере запишется автоматически. В InsteadOf и After триггерах нужно записывать принудительно, через вызов task.update();
Примечание: здесь task - это передаваемый в триггер параметр
Можно также изменить значение дополнительного поля задачи в After-триггере, выполнив
SecuredUDFAdapterManager am = AdapterManager.getInstance().getSecuredUDFAdapterManager(); am.setTaskUDFValueSimple(task.getSecure(), task.getId(), "date_udf", "11.03.11 17:55");
Примечания:
- здесь task - это передаваемый в триггер параметр
- date_udf - заголовок поля
- передаваемый параметр - это дата и время. Их формат зависит от локали пользователя, выполняющего скрипт. Поэтому более правильный способ передачи даты и времени:
Calendar now = Calendar.getInstance(); now.setTimeZone(TimeZone.getTimeZone(securedTaskBean.getSecure().getUser().getTimezone())); now.set(Calendar.HOUR_OF_DAY, 17); now.set(Calendar.MINUTE, 55); now.set(Calendar.SECOND, 0); now.set(Calendar.MILLISECOND, 0); now.set(Calendar.MONTH, Calendar.MARCH); now.set(Calendar.YEAR, 2011); now.set(Calendar.DAY_OF_MONTH, 11); String df = securedTaskBean.getSecure().getUser().getDateFormatter().parse(now);
В этом случае значение поля будет соответствовать 11 марта 2011 года 17:55 по часовому поясу пользователя, вызвавшего скрипт. Если нужно установить время в другом формате или в другом часовом поясе - используйте соответствующие Locale и TimeZone.
При смене значения дополнительного поля способом, указанным выше, это значение не попадет в HashMap триггера, однако после After-триггера эти данные все равно не используются.
Если же значение дополнительного поля нужно поменять не при редактировании задачи, а, например, в bulk-скрипте, нам придется сначала создать и инициализировать SecuredTaskTriggerBean.
Проще всего это сделать, если значение требуется установить в уже существующей задаче и известен ее id или номер (их значения можно получить, например, перебирая задачи из списка).
... /* Создаем SecuredTaskBean через id */ SecuredTaskBean theTask = new SecuredTaskBean(id, sc); // sc - это SessionContext, его можно получить из любого secured-объекта, вызвав getSecure() /* Создаем SecuredTaskTriggerBean */ SecuredTaskTriggerBean sttb = new SecuredTaskTriggerBean(theTask, new HashMap()); // HashMap - это как раз наш список дополнительных полей, можно передавать его уже инициализированным /* Устанавливаем нужное значение */ sttb.setUdfValue("Заголовок поля", "Значение"); sttb.update(); ...