【问题标题】:How do I render a velocity template inside a issue tab panel?如何在问题选项卡面板中呈现速度模板?
【发布时间】:2015-08-06 09:37:33
【问题描述】:

我按照这个非常简单的教程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>

【问题讨论】:

    标签: java velocity jira-plugin atlassian-plugin-sdk


    【解决方案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);
    

    一旦你有了baseUrlwebworkEncoding,你就可以开始初始化VelocityManagerVelocityParamFactory 这两个类允许你创建一个管理器,它允许你编码你的模板或获取模板的主体以及获取每个速度模板的默认参数。

    VelocityManager vm = ComponentAccessor.getVelocityManager();
    VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();
    

    在这些初始化之后,您应该创建一个分配给VelocityParamFactory 的上下文值Map,以便您获取和设置每个模板的参数。您可以传入稍后在速度模板中使用的值。

    Map context = vp.getDefaultVelocityParams(); 
    

    通过使用您之前设置的映射context,您可以开始使用put 方法将值分配给上下文变量,以便稍后在速度模板中使用。

    context.put("testVariable", ["Value can be a string or an array or a collection"]);
    

    一旦你有了它,假设你想渲染速度模板,你可以使用getBody 方法或getEncodedBody 方法。两者本质上都做同样的事情,但工作方式却大不相同。我建议阅读如何使用每一个,以及哪个用例对 or 是正确的。

    String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);
    

    您需要设置 templatePathtemplateFilebaseUrlwebWorkEncoding,最后是 context,其中包含您放入上下文中的任何参数,然后将在速度模板中返回变量renderedText 作为字符串。

    根据您在 Jira 中执行的方式和操作,有几种不同的方法可以将其传递给您的视图。我将把它留给你来弄清楚,但我创建 IssueTabPanel 的目的是如下所示:

    return Collections.singletonList(new GenericMessageAction( renderedText ));
    

    所以 ti 应该看起来像这样:

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

    这是我从研究中对它的工作原理的理解。这可能不是最好的方法,也可能不是绝对正确的方法,但这种方法会奏效!如果有人对此有任何补充以使其更加清晰和彻底,请对其进行编辑或将其转换为 wiki。

    【讨论】:

    • Dyllen,在没有来自 atlassian 的任何文档的情况下,您做得很好!这是我根据 JIRA 资源编译的关于这个主题的简短教程:answers.atlassian.com/questions/15835336/answers/15836488
    • @VolodymyrKrupach 嘿,谢谢伙计,非常感谢您的回答。认为 Atlassian 的文档在该主题上如此稀疏,这真是太疯狂了。这是我的第一个 JIRA 插件,所以我一定会犯错误,很高兴知道还有其他人遇到同样的问题,为这个问题开发简单的解决方案。我喜欢你如何更好地实现你的,所以我继续切换我的代码:)!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多