在Liferay的基础上进行二次开发,我们都比较困惑的一个问题是:如何控制新注册用户登录后的页面?
关于新用户的缺省页面,最核心的代码是在com.liferay.portal.events.ServicePreAction类中的addDefaultLayout(User user)和getDefaultLayout(User user, boolean signedIn)。
12.1 源代码阅读
这部分代码,代码量并不大,大家可以自行阅读一下。代码的意思,大致总结如下:
1、在run()中,判断用户是否有Power User角色,如果有,则调用addDefaultLayout。
2、在addDefaultLayout中,判断用户是否已经有自己的Community,如果没有,就会读取参数 default.user.layout.name、default.user.layout.template.id等进行创建,并设置各个 column_id的portlet。
3、判断是否已经有自己的Community,实际上是在判断userGroup的Community。
4、然后,在getDefaultLayout获取应该显示的Layout。如果指定了layout,就现实制定的layout;否则,登录用户,检查有权限的私有layout;否则,检查公共layout。
从这个流程可以看出,可以从几个角度来入手解决这个问题:
1、 从用户角色入手,不给新用户Power User角色。
2、 通过配置文件,设置新用户的layout,以及各个column的portlet清单。
3、 大动手术,直接重载ServicePreAction类
12.2 从用户角色着手解决的方案
在Enterprise这个Portlet中,选择"用户"这个Tab,然后是Default Community And Roles,里面,把Power User删掉,并保存。
然后重新注册的用户,缺省就不会创建新的Community。同时,又没有分配其他Community给他,因此他只有一个Guest这个Community是可用的,登陆之后也会回到缺省页面。
这种方案适用于:普通登录用户没有其他的功能,主要还是在Guest这个Community。www.liferay.com应该就是采用这种处理方式。
考虑到多数情况下,除了公共页面,我们还需要给用户一些私有的页面。这时,我们可以创建一个私有的Community如Blog,在这个Community 中创建若干的Layout,并且添加好portlet。作为设计的所有注册用户的缺省登录后的页面。然后,管理员在Enterprise这个 Portlet中,选择"用户"这个Tab,然后是Default Community And Roles,里面,在Community这个Textarea里面,输入把Blog这个Community名字,并保存。
这样,新注册的用户,登陆之后,就会显示Blog这个Community。
这个方案的关键设置,就是在Default Community And Roles里面。两点:一、新注册用户缺省没有Power User权限;二、新注册用户,缺省可以访问设置的私有Community。
12.3 从配置文件着手解决的方案
在portal.properties中有几个重要的配置参数,分别是
default.user.layout.name=Home
default.user.layout.template.id=2_columns_ii
default.user.layout.column-1=82,23,61,65,
default.user.layout.column-2=8,11,36,33,
default.user.layout.column-3=
default.user.layout.column-4=
default.user.layout.name,暂时没看其作用,估计没有太大的影响。我们关心的应该是后面两类参数:
default.user.layout.template.id:页面的布局
default.user.layout.column-?:每一个column中有哪些portlet。具体含义,自己开发过Layout的话,就很容易理解。
我们的工作也就相对简单了,只需要定制这两个参数即可。比如,我想在第二栏的最开始,放一个Calculator Portlet,那只需要设置为
default.user.layout.column-2=13,8,11,36,33,
注意:Liferay不建议我们直接修改portal.properties文件,因此需要把这些参数拷贝到portal-ext.properties中进行修改。
这个方法的问题也比较明显:对于哪些需要设置Preference才能正常工作的portlet,这种方法就不好使。比如ID为56的Portlet "Journal Content",是Liferay的使用最频繁的portlet,但这种方法,不能为其设置所选择的文章。这个问题,我没有找到比较好的解决方法。
曾经尝试在配置文件中直接写portlet的实例名,但不成功,仍然是未设置状态。
这个方案适用于:每个用户需要有自己的工作台,并且工作台的内容并不是以内容呈现为主。
12.4 重载ServicePreAction类的方案
这个方案,应该是最灵活的一个方案了,当然对开发技术以及对Liferay的底层知识有较高要求。有兴趣的可以自行研究,我仅简单说说如何重载。
1、 在 ext环境中创建一个新类,并派生自ServicePreAction。然后重新实现方法addDefaultLayout(User user)。在里面做自己想做的任何事情。例如新类的全名为com.ext.portal.events.ServicePreExtAction
2、 在portal-ext.properties中添加一行
servlet.service.events.pre=com.ext.portal.events.ServicePreExtAction
Liferay的案例EducaMadrid,"Germinus was able customize the look and feel of the portal according to the user's hierarchal role and/or grade. Teachers have a "desktop" that displayed classroom materials, and students would see more student oriented UI. As the students progressed to higher grades, the actual interface becomes increasingly more complex",我猜测,应该就是采用了重载ServicePreAction的方法,为不同的角色或年级,设置不同的页面样式。
转自:http://blog.csdn.net/sumongh_pan/archive/2007/03/29/1545639.aspx
关于新用户的缺省页面,最核心的代码是在com.liferay.portal.events.ServicePreAction类中的addDefaultLayout(User user)和getDefaultLayout(User user, boolean signedIn)。
12.1 源代码阅读
这部分代码,代码量并不大,大家可以自行阅读一下。代码的意思,大致总结如下:
1、在run()中,判断用户是否有Power User角色,如果有,则调用addDefaultLayout。
2、在addDefaultLayout中,判断用户是否已经有自己的Community,如果没有,就会读取参数 default.user.layout.name、default.user.layout.template.id等进行创建,并设置各个 column_id的portlet。
3、判断是否已经有自己的Community,实际上是在判断userGroup的Community。
4、然后,在getDefaultLayout获取应该显示的Layout。如果指定了layout,就现实制定的layout;否则,登录用户,检查有权限的私有layout;否则,检查公共layout。
从这个流程可以看出,可以从几个角度来入手解决这个问题:
1、 从用户角色入手,不给新用户Power User角色。
2、 通过配置文件,设置新用户的layout,以及各个column的portlet清单。
3、 大动手术,直接重载ServicePreAction类
12.2 从用户角色着手解决的方案
在Enterprise这个Portlet中,选择"用户"这个Tab,然后是Default Community And Roles,里面,把Power User删掉,并保存。
然后重新注册的用户,缺省就不会创建新的Community。同时,又没有分配其他Community给他,因此他只有一个Guest这个Community是可用的,登陆之后也会回到缺省页面。
这种方案适用于:普通登录用户没有其他的功能,主要还是在Guest这个Community。www.liferay.com应该就是采用这种处理方式。
考虑到多数情况下,除了公共页面,我们还需要给用户一些私有的页面。这时,我们可以创建一个私有的Community如Blog,在这个Community 中创建若干的Layout,并且添加好portlet。作为设计的所有注册用户的缺省登录后的页面。然后,管理员在Enterprise这个 Portlet中,选择"用户"这个Tab,然后是Default Community And Roles,里面,在Community这个Textarea里面,输入把Blog这个Community名字,并保存。
这样,新注册的用户,登陆之后,就会显示Blog这个Community。
这个方案的关键设置,就是在Default Community And Roles里面。两点:一、新注册用户缺省没有Power User权限;二、新注册用户,缺省可以访问设置的私有Community。
12.3 从配置文件着手解决的方案
在portal.properties中有几个重要的配置参数,分别是
default.user.layout.name=Home
default.user.layout.template.id=2_columns_ii
default.user.layout.column-1=82,23,61,65,
default.user.layout.column-2=8,11,36,33,
default.user.layout.column-3=
default.user.layout.column-4=
default.user.layout.name,暂时没看其作用,估计没有太大的影响。我们关心的应该是后面两类参数:
default.user.layout.template.id:页面的布局
default.user.layout.column-?:每一个column中有哪些portlet。具体含义,自己开发过Layout的话,就很容易理解。
我们的工作也就相对简单了,只需要定制这两个参数即可。比如,我想在第二栏的最开始,放一个Calculator Portlet,那只需要设置为
default.user.layout.column-2=13,8,11,36,33,
注意:Liferay不建议我们直接修改portal.properties文件,因此需要把这些参数拷贝到portal-ext.properties中进行修改。
这个方法的问题也比较明显:对于哪些需要设置Preference才能正常工作的portlet,这种方法就不好使。比如ID为56的Portlet "Journal Content",是Liferay的使用最频繁的portlet,但这种方法,不能为其设置所选择的文章。这个问题,我没有找到比较好的解决方法。
曾经尝试在配置文件中直接写portlet的实例名,但不成功,仍然是未设置状态。
这个方案适用于:每个用户需要有自己的工作台,并且工作台的内容并不是以内容呈现为主。
12.4 重载ServicePreAction类的方案
这个方案,应该是最灵活的一个方案了,当然对开发技术以及对Liferay的底层知识有较高要求。有兴趣的可以自行研究,我仅简单说说如何重载。
1、 在 ext环境中创建一个新类,并派生自ServicePreAction。然后重新实现方法addDefaultLayout(User user)。在里面做自己想做的任何事情。例如新类的全名为com.ext.portal.events.ServicePreExtAction
2、 在portal-ext.properties中添加一行
servlet.service.events.pre=com.ext.portal.events.ServicePreExtAction
Liferay的案例EducaMadrid,"Germinus was able customize the look and feel of the portal according to the user's hierarchal role and/or grade. Teachers have a "desktop" that displayed classroom materials, and students would see more student oriented UI. As the students progressed to higher grades, the actual interface becomes increasingly more complex",我猜测,应该就是采用了重载ServicePreAction的方法,为不同的角色或年级,设置不同的页面样式。
转自:http://blog.csdn.net/sumongh_pan/archive/2007/03/29/1545639.aspx