Как отобразить шаблон скорости внутри панели вкладок проблемы?
Я следовал этому чрезвычайно простому учебнику https://bitbucket.org/bhushan154/jira-issue-tab-panel-tutorial/wiki/Home чтобы добавить новую панель вкладок вопросов. Он показывает, как вы можете добавить простой контент на страницу, используя stringBuilder. В идеале я хотел бы использовать шаблон скорости, так как с ним гораздо проще работать и соответствующим образом отделять логику. У меня есть файл шаблона, который содержит:
<div class="mod-header">
<h3>$i18n.getText('service-now-tab-panel.label')</h3>
</div>
Я попытался поиграться с этой попыткой заставить его отображать данные соответствующим образом, он ничего не делает и не выводит контент на страницу с описанием проблемы. Вот контроллеры, которые сейчас босые, так как мне нужно пройти этот блокпост.
package com.verys.jira.plugins.panels;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.atlassian.jira.plugin.issuetabpanel.AbstractIssueTabPanel;
import com.atlassian.jira.plugin.issuetabpanel.IssueTabPanel;
import com.atlassian.jira.issue.tabpanels.GenericMessageAction;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.crowd.embedded.api.User;
import java.util.Collections;
import java.util.List;
public class ServiceNowTabPanel extends AbstractIssueTabPanel implements IssueTabPanel
{
private static final Logger log = LoggerFactory.getLogger(ServiceNowTabPanel.class);
public List getActions(Issue issue, User remoteUser)
{
return Collections.singletonList(new GenericMessageAction("" + issue.getReporter().getDisplayName() + ""));
}
public boolean showPanel(Issue issue, User remoteUser)
{
return true;
}
}
Документация по отрисовке скоростных шаблонов на панелях с вкладками проблем крайне скудна и практически отсутствует. Если кто-то может просто указать мне правильное направление, это было бы здорово. Также здесь находится файл свойств
<issue-tabpanel key="service-now-tab-panel" name="Service Now Tab Panel" i18n-name-key="service-now-tab-panel.name" class="com.verys.jira.plugins.panels.ServiceNowTabPanel">
<description key="service-now-tab-panel.description">The Service Now Tab Panel Plugin</description>
<label key="service-now-tab-panel.label">Plugin Test</label>
<order>10</order>
<resource type="velocity" name="view" location="templates/tabpanels/service-now-tab-panel.vm"/>
<supports-ajax-load>true</supports-ajax-load>
</issue-tabpanel>
1 ответ
Для рендеринга шаблонов скорости вам необходимо импортировать 5 классов.
import com.atlassian.jira.config.properties.APKeys;
import com.atlassian.jira.config.properties.ApplicationProperties;
import com.atlassian.jira.util.VelocityParamFactory;
import com.atlassian.velocity.VelocityManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.config.properties.APKeys;
Внутри вашей функции вам нужно инициализировать ComponentAccessor и получить свойства приложения
ApplicationProperties ap = ComponentAccessor.getApplicationProperties();
Если у вас есть свойства приложения "ap", вы можете получить ключи приложения, от которых зависит Velocity manager.
String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);
Как только у вас есть baseUrl
& ваш webworkEncoding
Затем вы можете перейти к инициализации VelocityManager
& VelocityParamFactory
Эти два класса позволяют вам создать менеджер, который позволяет вам кодировать ваш шаблон или получать тело вашего шаблона, а также получать параметры по умолчанию для каждого шаблона скорости.
VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();
После того, как они инициализированы, вы должны создать Map
значений контекста, которые назначены VelocityParamFactory
которые позволяют вам получить и установить параметры для каждого шаблона. Которые вы можете передать в значениях для последующего использования в вашем шаблоне скорости.
Map context = vp.getDefaultVelocityParams();
Используя карту context
Вы установили ранее, вы можете начать присваивать значения переменной контекста, используя put
метод для последующего использования в шаблоне скорости.
context.put("testVariable", ["Value can be a string or an array or a collection"]);
Если у вас есть предположение, что вы хотите визуализировать шаблон скорости, вы можете использовать getBody
метод или getEncodedBody
метод. Оба по сути делают одно и то же, но работают по-разному. Я предлагаю прочитать о том, как использовать каждый из них, и какой вариант использования является правильным для или.
String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);
Вам нужно установить templatePath
, templateFile
, baseUrl
, webWorkEncoding
и, наконец, context
который содержит любой из параметров, которые вы помещаете в контекст, который затем будет возвращен в шаблон скорости в переменную renderedText
как строка
В зависимости от того, как и что вы делаете в Jira, есть несколько способов передать это на ваш взгляд. Я оставлю это на ваше усмотрение, чтобы выяснить, но то, что я сделал, создав IssueTabPanel, было сделать так, как показано ниже:
return Collections.singletonList(new GenericMessageAction( renderedText ));
Так что все вместе должно выглядеть так:
ApplicationProperties ap = ComponentAccessor.getApplicationProperties();
String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);
VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();
Map context = vp.getDefaultVelocityParams();
context.put("test", "test");
String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);
return Collections.singletonList(new GenericMessageAction(renderedText));
Это мое понимание того, как это работало на основе исследований. Возможно, это не лучший способ сделать это и может быть не совсем правильным, но этот метод будет работать! Если у кого-то есть дополнения к этому, чтобы сделать его более понятным и подробным, отредактируйте его или превратите в вики.