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

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

person djowinz    schedule 24.05.2015    source источник


Ответы (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.

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));

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

person Community    schedule 25.05.2015
comment
Диллен, вы проделали отличную работу, чтобы заставить его работать без какой-либо документации от Atlassian! Вот мой краткий учебник по этой теме, который я составил на основе исходников JIRA: answers.atlassian.com/questions/15835336/answers/15836488 - person Volodymyr Krupach; 25.05.2015
comment
@VolodymyrKrupach Эй, спасибо, чувак, я очень ценю твой ответ. Безумно думать, что документация Atlassian настолько скудна по этому вопросу. Это мой первый плагин для JIRA, поэтому я обязательно буду делать ошибки, и здорово знать, что есть другие люди, сталкивающиеся с теми же проблемами, которые разрабатывают простые решения этой проблемы. Мне нравится, как вы реализовали свою намного лучше, поэтому я пошел дальше и изменил свой код :)! Спасибо!! - person djowinz; 25.05.2015
comment
› вы реализовали свой Я просто посмотрел исходники JIRA и скопировал оттуда, и это то, что мы должны делать, когда нет документации :-). - person Volodymyr Krupach; 25.05.2015