胡长城(银狐999)BLOG

专注SOA,MDA,EAI,BPM,工作流,J2EE;个人主页http://www.javafox.org

用户操作
[即时聊天] [发私信] [加为好友]
胡长城ID:james999
566286次访问,排名69好友0人,关注者69
J2EE,Workflow,BPM,EAI,SOA,工作流
james999的文章
原创 187 篇
翻译 0 篇
转载 2 篇
评论 635 篇
银狐999的公告
个人主要工作流文档可从 javafox live网络硬盘下载

最近评论
d_yang:反射, 是因为没用好.
downdoc2:把思路和一些方法多讲讲把
kwlong2008:来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,
收藏
    相册
    50 Relational Blogs
    Hongsoft博客
    J2EE与ERP禅话
    Peter's Blog
    俠盜躶奔漢
    切尔斯基(RSS)
    动物园的猪
    胡奇
    赵斌BLog
    阿飞外传
    55 Workflow Preacher
    Ekkart Kindler
    Michael zur Muehlen
    Wil van der Aalst
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 Liferay Portal额外研究(4):修改用户登录后的默认布局和内容收藏

    新一篇: Liferay Portal额外研究(5):对多分发命令Action的支持(方案一) | 旧一篇: Liferay Portal额外研究(三):IFrame Portlet的session丢失问题解决


    Liferay额外研究(一):
    http://blog.csdn.net/james999/archive/2006/07/26/979938.aspx 
    Liferay额外研究(二):
    http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx 
    Liferay额外研究(三):http://blog.csdn.net/james999/archive/2006/08/08/1037326.aspx

        Liferay在用户第一次登陆后,都会为其产生一个默认的私有首页Layout。 在Liferay早期版本,可以在系统管理员管理界面中,配置默认的group layout。但是在4.1版本中已经没有这个功能,所以默认情况下,新注册的用户,在登陆后,首先看到的其私有place都是一样的内容,而这些内容都是liferay提供的。
     
        对我们自定的Company来说,这肯定是不合适的,我们需要自己定义用户登录后,默认显示的内容和布局。
     
        后来在Liferay forum中,找到了一篇帖子,给了解决此种问题的解决办法:在portlet-ext.properties中配置一个 default.user.layout.group 属性(自定义的),用于指明默认的layout-group。在ServicePreAction类的扩展修改 addDefaultLayouts 操作,满足特定的需求应用。这种扩展的方式就是,将指定layout-group拷贝给用户第一默认的,这样就不会再使用liferay默认的了。—— 当然这样的方式是比较简单的,可能在系统实施过程中,有比这更加复杂的需求。

     
    新建默认的Community
    首先,通过新增一个新的Community,命名为User_Default,并新增一个private的page与内容.
     
    配置默认的Community
    首先在ext项目的 ext-ejb目录下,修改portal-ext.properties文件,增加如下设置:
     
    default.user.layout.group=User_Default

    然后通过build,将portal-ext.properties移动到 ext项目的
        ext\servers\tomcat\webapps\ROOT\WEB-INF\classes 目录下。
     
    构造LayoutCopy类
    public class LayoutCopy {
        
        
    private static Log _log = LogFactory.getLog(LayoutCopy.class);
        
        
    private User user;

        
    private String ownerId;

       
    private Group userGroup;
       
    public LayoutCopy(User user) {
           
    super();

           
    this.user = user;

            
    this.ownerId = getOwnerId(user.getGroup().getGroupId(), false);
           
    this.userGroup = user.getGroup();
       }


       
    public void copyDefaultUserLayout(HttpServletRequest httpReq)
               
    throws SystemException, PortalException {
          
    // set in the portal-ext.properties:
           
    // default.user.layout.group=Default User
           
    // and create then group/community "Default User" 
           
    // CWPPropsUtil.DEFUALT_USER_LAYOUT_GROUP = "default.user.layout.group"
           Group group = GroupLocalServiceUtil.getGroup(user.getCompanyId(),
                   PropsUtil.get(
    "default.user.layout.group"));

           
    try {
               String groupOwnerId 
    = getOwnerId(group.getGroupId(), true);
               List privateLayouts 
    = LayoutLocalServiceUtil
                       .getLayouts(groupOwnerId);

               
    for (Iterator itr = privateLayouts.iterator(); itr.hasNext();) {
                   Layout layout 
    = (Layout) itr.next();
                   Layout newLayout 
    = copyLayout(layout);
                   copyPreferences(httpReq, newLayout, layout);
               }

           }
     catch (PortalException e) {
               _log.error(
    "Cannot copy private layouts", e);
           }
     catch (Exception e) {
               _log.error(
    "Cannot copy public layouts", e);
           }


           
    try {
               String groupOwnerId 
    = getOwnerId(group.getGroupId(), false);
               List publicLayouts 
    = LayoutLocalServiceUtil
                       .getLayouts(groupOwnerId);

               
    for (Iterator itr = publicLayouts.iterator(); itr.hasNext();) {
                   Layout layout 
    = (Layout) itr.next();
                   Layout newLayout 
    = copyLayout(layout);
                   copyPreferences(httpReq, newLayout, layout);
               }

           }
     catch (PortalException e) {
               _log.error(
    "Cannot copy public layouts", e);
           }
     catch (Exception e) {
               _log.error(
    "Cannot copy public layouts", e);
           }


       }


       
    public void resetLayout(HttpServletRequest httpReq) throws SystemException, PortalException {
           String ownerId 
    = getOwnerId(user.getGroup().getGroupId(), false);
           LayoutLocalServiceUtil.deleteLayouts(ownerId);
           PortletPreferencesLocalServiceUtil.deletePortletPreferences(ownerId);

           ownerId 
    = getOwnerId(user.getGroup().getGroupId(), true);
           LayoutLocalServiceUtil.deleteLayouts(ownerId);
           PortletPreferencesLocalServiceUtil.deletePortletPreferences(ownerId);

           copyDefaultUserLayout(httpReq);
       }


       
    public Layout copyLayout(Layout groupDefaultLayout) throws SystemException,
               PortalException 
    {
           Layout layout 
    = LayoutLocalServiceUtil.addLayout(
                   userGroup.getGroupId(), user.getUserId(), groupDefaultLayout
                          .isPrivateLayout(), groupDefaultLayout
                           .getParentLayoutId(), groupDefaultLayout.getName(user
                           .getLocale()), groupDefaultLayout.getType(),
                   groupDefaultLayout.isHidden(), 
    null);

           LayoutLocalServiceUtil.updateLayout(layout.getLayoutId(), layout
            .getOwnerId(), groupDefaultLayout.getTypeSettings());
           layout 
    = LayoutLocalServiceUtil.updateLookAndFeel(layout.getLayoutId(),
                   layout.getOwnerId(), groupDefaultLayout.getThemeId(),
                   groupDefaultLayout.getColorSchemeId());

           
    // layoutMapping.put(groupDefaultLayout.getPrimaryKey(),
           
    // layout.getPrimaryKey());

           
    return layout;
       }


       
    protected void copyPreferences(HttpServletRequest httpReq, Layout layout,
               Layout copyLayout) 
    throws Exception {

           String companyId 
    = layout.getCompanyId();

           LayoutTypePortlet copyLayoutTypePortlet 
    = (LayoutTypePortlet) copyLayout
                   .getLayoutType();

           List copyPortletIds 
    = copyLayoutTypePortlet.getPortletIds();

           
    for (int i = 0; i < copyPortletIds.size(); i++{
               String copyPortletId 
    = (String) copyPortletIds.get(i);

               
    // Copy preference

               PortletPreferencesPK prefsPK 
    = PortletPreferencesFactory
                       .getPortletPreferencesPK(httpReq, copyPortletId, layout
                               .getPlid());

               PortletPreferencesLocalServiceUtil.getPreferences(companyId,
                       prefsPK);

               PortletPreferencesPK copyPrefsPK 
    = PortletPreferencesFactory
                       .getPortletPreferencesPK(httpReq, copyPortletId, copyLayout
                               .getPlid());

               PortletPreferencesImpl copyPrefsImpl 
    = (PortletPreferencesImpl) PortletPreferencesLocalServiceUtil
                       .getPreferences(companyId, copyPrefsPK);

               PortletPreferencesLocalServiceUtil.updatePreferences(prefsPK,
                       copyPrefsImpl);

               
    // Copy portlet setup

               prefsPK 
    = new PortletPreferencesPK(copyPortletId, layout
                       .getLayoutId(), layout.getOwnerId());

               PortletPreferencesLocalServiceUtil.getPreferences(companyId,
                       prefsPK);

               copyPrefsPK 
    = new PortletPreferencesPK(copyPortletId, copyLayout
                       .getLayoutId(), copyLayout.getOwnerId());

               copyPrefsImpl 
    = (PortletPreferencesImpl) PortletPreferencesLocalServiceUtil
                       .getPreferences(companyId, copyPrefsPK);

               PortletPreferencesLocalServiceUtil.updatePreferences(prefsPK,
                       copyPrefsImpl);
           }

       }


       
    private String getOwnerId(String groupId, boolean privateLayout) {
           
    if (privateLayout) {
               
    return Layout.PRIVATE + groupId;
           }
     else {
               
    return Layout.PUBLIC + groupId;
           }

       }


    }
     
     
    修改com.liferay.portal.events.ServicePreAction类
     
        是在 ext工程的 ext-ejb/src下修改,新建com.liferay.portal.events包,并把原始的ServicePreAction类拷贝至此,然后修改,修改后通过ext-ejb下的build.xml编译部署。
     
    ServicePreAction类中新增一个addDefaultLayouts方法:
    protected void addDefaultLayouts(HttpServletRequest httpReq, User user)
                    throws PortalException, SystemException {
                if (user.hasPrivateLayouts()) {
                    return;
                }
               (new LayoutCopy(user)).copyDefaultUserLayout(httpReq);
    }
     
    然后,修改run方法中对原始addDefaultLayouts方法的调用方法:
    if (layoutsRequired) { 
        String user_layout_group = PropsUtil.get("default.user.layout.group");
        if(user_layout_group==null || user_layout_group.length()==0){
                addDefaultLayouts(user);
        }else{
                addDefaultLayouts(req, user);
        }
    }
     

    发表于 @ 2006年08月29日 16:47:00|评论(loading...)|编辑

    新一篇: Liferay Portal额外研究(5):对多分发命令Action的支持(方案一) | 旧一篇: Liferay Portal额外研究(三):IFrame Portlet的session丢失问题解决

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 银狐999