Как отобразить шаблон скорости внутри панели вкладок проблемы?

Я следовал этому чрезвычайно простому учебнику 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));

Это мое понимание того, как это работало на основе исследований. Возможно, это не лучший способ сделать это и может быть не совсем правильным, но этот метод будет работать! Если у кого-то есть дополнения к этому, чтобы сделать его более понятным и подробным, отредактируйте его или превратите в вики.

Другие вопросы по тегам