Liferay 为多个 portlet 创建自定义 PanelCategory

Liferay create a custom PanelCategory for multiple portlet

我使用 Liferay 7.2 和 Liferay IDE (eclipse)。我创建了两个单独的 Liferay 管理 portlet 来创建数据库条目的视图。我在第一个 portlet“Teachers”中添加了一个名为 school 的新面板,该面板在 application.list Package.

中生成了代码

这里是代码 - PanelApp.java

    @Component(
    immediate = true,
    property = {
        "panel.app.order:Integer=300",
        "panel.category.key=" + TeachersPanelCategoryKeys.CONTROL_PANEL_CATEGORY
    },
    service = PanelApp.class
)
public class TeachersPanelApp extends BasePanelApp {

    @Override
    public String getPortletId() {
        return TeachersPortletKeys.TEACHERS;
    }

    @Override
    @Reference(
        target = "(javax.portlet.name=" + TeachersPortletKeys.TEACHERS+ ")",
        unbind = "-"
    )
    public void setPortlet(Portlet portlet) {
        super.setPortlet(portlet);
    }

}

.

   public class TeachersPanelCategoryKeys {
    
        public static final String CONTROL_PANEL_CATEGORY = "Teachers";
    
    }

这里是代码 - PanelCategory.java

@Component(
immediate = true,
property = {
    "panel.category.key=" + PanelCategoryKeys.SITE_ADMINISTRATION,
    "panel.category.order:Integer=300"
},
service = PanelCategory.class)

public class TeachersPanelCategory extends BasePanelCategory {

@Override
public String getKey() {
    return TeachersPanelCategoryKeys.CONTROL_PANEL_CATEGORY;
}

@Override
public String getLabel(Locale locale) {
    return LanguageUtil.get(locale, "School");
}}

这里是portlet.java

的代码
    @Component(
        immediate = true,
        property = {
            "com.liferay.portlet.add-default-resource=true",
            "com.liferay.portlet.display-category=category.hidden",
            "com.liferay.portlet.header-portlet-css=/css/main.css",
            "com.liferay.portlet.layout-cacheable=true",
            "com.liferay.portlet.private-request-attributes=false",
            "com.liferay.portlet.private-session-attributes=false",
            "com.liferay.portlet.render-weight=50",
            "com.liferay.portlet.use-default-template=true",
            "javax.portlet.display-name=Teachers",
            "javax.portlet.expiration-cache=0",
            "javax.portlet.init-param.template-path=/",
            "javax.portlet.init-param.view-template=/view.jsp",
            "javax.portlet.name=" + TeachersPortletKeys.TEACHERS,
            "javax.portlet.resource-bundle=content.Language",
            "javax.portlet.security-role-ref=power-user,user",
    
        },
        service = Portlet.class
    )
    public class TeachersPortlet extends MVCPortlet {
 // some code to get entries from db
        
        
        @Override
        public void doView(final RenderRequest renderRequest, final RenderResponse renderResponse)
                throws IOException, PortletException {
    
// some code 

现在我想在同一个面板“School”下添加第二个创建的 portlet“Students”。我以与“教师”相同的方式创建它,但现在我有两个学校面板。如下图所示。

我只想显示一个名为学校的面板类别,列表中同时包含教师和学生。

我不知道我怎么能想到那样做。

在您实施 TeachersPanelCategory 时,我假设您也在实施 StudentsPanelCategory。从命名的角度来看,我希望有一个 SchoolPanelCategory。

我目前不知道 ControlPanel portlet 实际上是如何声明它们的关联面板的,但是那个地方就是您选择通用“学校”面板并为两者使用相同拼写的地方。

换句话说:如果您部署两个具有相同名称的面板,我会期待您在此处记录的内容。确保您只部署其中之一

编辑:我想知道 TeachersPanelCategoryKeys.CONTROL_PANEL_CATEGORY 被定义为什么,以及相应的(假定的,未显示)StudentsPanelCategoryKeys.CONTROL_PANEL_CATEGORY。两个类别都有相同的标签,但如果它们有不同的键,它们就会不同。我不确定当您部署两个具有相同密钥的组件时会发生什么:您应该只部署一个。

Edit2:我之前错过了代码:您正在为第一个类别生成“教师”的密钥,并将标签生成为“学校”。我假设您的其他类别的关键是“学生”。 Liferay 按键组织类别 - 如果键不同,那么您最终会得到两个不同的类别。使他们的密钥与他们的名字更相似(例如,创建一个 SchoolCategory 并将您的 portlets/panelApps 与之相关联:

@Component(
immediate = true,
property = {
    "panel.category.key=" + PanelCategoryKeys.SITE_ADMINISTRATION,
    "panel.category.order:Integer=300"
},
service = PanelCategory.class)

public class SchoolPanelCategory extends BasePanelCategory {

  @Override
  public String getKey() {
    return "school"; // this is the category that you want to associate with
  }

  @Override
  public String getLabel(Locale locale) {
    return LanguageUtil.get(locale, "School");
  }
}

@Component(
  immediate = true,
  property = {
    "panel.app.order:Integer=300",
    "panel.category.key=school" // referencing the category created above
      // (use the same for your StudentsPanelApp)
    },
    service = PanelApp.class
)
public class TeachersPanelApp extends BasePanelApp {

  @Override
  public String getPortletId() {
    return TeachersPortletKeys.TEACHERS;
  }

  @Override
  @Reference(
    target = "(javax.portlet.name=" + TeachersPortletKeys.TEACHERS+ ")",
    unbind = "-"
  )
  public void setPortlet(Portlet portlet) {
    super.setPortlet(portlet);
  }
}

(关键行请参见代码中的单行注释。如果愿意,请替换为适当的常量)