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);
}
}
(关键行请参见代码中的单行注释。如果愿意,请替换为适当的常量)
我使用 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);
}
}
(关键行请参见代码中的单行注释。如果愿意,请替换为适当的常量)