在上一篇文件 ”Liferay如何自定义字段设计不同用户的默认布局“的基础上,新增需求。
要求用户登入进来后,不允许删除和移动目前现有的布局,就像 “layout.static.portlets.start.”这种配置效果。
但是由于目前的"layout.static.portlets.start."这种肯定满足不了要求。
解决方案:
新建ext工程,新建 com.liferay.portal.model.impl.LayoutTypePortletImpl
重写方法 getStaticPortlets(String position)
protected List<Portlet> getStaticPortlets(String position)
throws PortalException, SystemException {
String[] portletIds = getStaticPortletIds(position);
List<Portlet> portlets = new ArrayList<Portlet>();
Layout layout = getLayout();
//根据不同的角色制定不同的用户布局
long userId = layout.getUserId();
UserInfo userInfoTemp = null;
if(mapCurrUser == null || !mapCurrUser.containsKey(userId)){
mapCurrUser = new HashMap<Long, Object>();
//根据不同的角色制定不同的用户布局
userInfoTemp = UserInfoLocalServiceUtil.findByLiferayUserIdForUserInfo(userId);
mapCurrUser.put(userId, userInfoTemp);
System.out.println("current User : " + userId + " +++ " + mapCurrUser.get(userId));
}else{
userInfoTemp = (UserInfo)mapCurrUser.get(userId);
}
for (String portletId : portletIds) {
//去掉验证
// if (Validator.isNull(portletId) ||
// hasNonstaticPortletId(portletId)) {
//
// continue;
// }
Portlet portlet = PortletLocalServiceUtil.getPortletById(
getCompanyId(), portletId);
if (portlet != null) {
Portlet staticPortlet = portlet;
if (portlet.isInstanceable()) {
// Instanceable portlets do not need to be cloned because
// they are already cloned. See the method getPortletById in
// the class PortletLocalServiceImpl and how it references
// the method getClonedInstance in the class PortletImpl.
}
else {
staticPortlet = (Portlet)staticPortlet.clone();
}
staticPortlet.setStatic(true);
// if (position.startsWith("layout.static.portlets.start")) {
// staticPortlet.setStaticStart(true);
// }
//modify by yuqian 20160305
String portalExtFix = "";
if(userInfoTemp.getUserType().equals("TH")){ //老师
portalExtFix = "layout.teacher.role.static.portlets.start";
}
if(userInfoTemp.getUserType().equals("PA")){ //家长
portalExtFix = "layout.parent.role.static.portlets.start";
}
if(userInfoTemp.getUserType().equals("ST")){ //学生
portalExtFix = "layout.student.role.static.portlets.start";
}
if(userInfoTemp.getPosition() != null && !userInfoTemp.getPosition().equals("")){ //领导布局
portalExtFix = "layout.leader.role.static.portlets.start";
}
if (position.startsWith(portalExtFix)) {
staticPortlet.setStaticStart(true);
}
System.out.println("portalExtFix : " + portalExtFix);
portlets.add(staticPortlet);
}
}
return portlets;
}
重写方法 getAllPortlets(String columnId)
public List<Portlet> getAllPortlets(String columnId)
throws PortalException, SystemException {
String columnValue = getColumnValue(columnId);
String[] portletIds = StringUtil.split(columnValue);
List<Portlet> portlets = new ArrayList<Portlet>(portletIds.length);
for (String portletId : portletIds) {
Portlet portlet = PortletLocalServiceUtil.getPortletById(
getCompanyId(), portletId);
if ((portlet != null) && !portlet.isUndeployedPortlet()) {
portlets.add(portlet);
}
}
// List<Portlet> startPortlets = getStaticPortlets(
// PropsKeys.LAYOUT_STATIC_PORTLETS_START + columnId);
Layout layout = getLayout();
//根据不同的角色制定不同的用户布局
long userId = layout.getUserId();
String keyPrefixTemp = "";
UserInfo userInfoTemp = null;
if(mapCurrUser == null || !mapCurrUser.containsKey(userId)){
mapCurrUser = new HashMap<Long, Object>();
//根据不同的角色制定不同的用户布局
userInfoTemp = UserInfoLocalServiceUtil.findByLiferayUserIdForUserInfo(userId);
mapCurrUser.put(userId, userInfoTemp);
}else{
userInfoTemp = (UserInfo)mapCurrUser.get(userId);
}
if(userInfoTemp != null){
if(userInfoTemp.getPosition() != null && !userInfoTemp.getPosition().equals("0")){ //领导布局
System.out.println("curr is leader...");
keyPrefixTemp = "layout.leader.role.static.portlets.start.";
}
if(userInfoTemp.getUserType().equals(TeachContants.TEACHER_USER_POSITION)){ //老师
System.out.println("curr is teacher...");
keyPrefixTemp = "layout.teacher.role.static.portlets.start.";
}
if(userInfoTemp.getUserType().equals(TeachContants.PARENT_USER_POSITION)){ //家长
System.out.println("curr is parent...");
keyPrefixTemp = "layout.parent.role.static.portlets.start.";
}
if(userInfoTemp.getUserType().equals(TeachContants.STUDENT_USER_POSITION)){ //学生
System.out.println("curr is student...");
keyPrefixTemp = "layout.student.role.static.portlets.start.";
}
}else{
System.out.println("curr User is null");
keyPrefixTemp = PropsKeys.LAYOUT_STATIC_PORTLETS_START;
}
List<Portlet> startPortlets = getStaticPortlets(
keyPrefixTemp + columnId);
// for(Portlet pTemp :startPortlets){
// System.out.println("pTemp=============" + pTemp.getPortletId());
// }
List<Portlet> endPortlets = getStaticPortlets(
PropsKeys.LAYOUT_STATIC_PORTLETS_END + columnId);
System.out.println("2________________curr Time :"+System.currentTimeMillis());
return addStaticPortlets(portlets, startPortlets, endPortlets);
}
修改portal-ext.properties配置
layout.leader.role.static.portlets.start.column-1[user]=xxx,xxx
layout.leader.role.static.portlets.start.column-2[user]=xxx,xxx
layout.leader.role.static.portlets.start.column-3[user]=xxx,xxx
layout.leader.role.static.portlets.start.column-4[user]=xxx,xxx
layout.student.role.static.portlets.start.column-1[user]=xxx,xxx
layout.student.role.static.portlets.start.column-2[user]=xxx,xxx
layout.parent.role.static.portlets.start.column-1[user]=xxx,xxx
layout.parent.role.static.portlets.start.column-2[user]=xxx,xxx
layout.teacher.role.static.portlets.start.column-1[user]=xxx,xxx
layout.teacher.role.static.portlets.start.column-2[user]=xxx,xxx
layout.teacher.role.static.portlets.start.column-3[user]=xxx,xxx
layout.teacher.role.static.portlets.start.column-4[user]=xxx,xxx