Liferay theme 上传logo分析

简介:

结论: 

theme上传logo会做以下事情:

(1)用UploadPortletRequest对象来处理页面的<input type=file>

(2)对于上传的logo图片为空,则抛出异常。

(3)对于上传的logo图片不为空,则先从数据库中找到当前layout,为logo定义logoId,并吧logoId添加到当前layout并存回数据库,然后根据布尔变量设定,来决定是否吧这个logo关联到hook,以及这个这个logo图片是否要持久化。

 

过程展示:

当在Liferay中的某个theme选择上传logo,并点击"save"按钮:

如下所示

 

具体分析:

它会去触发struts动作/group_pages/edit_layout_set,我们在struts-config.xml中找到匹配选项:

 
 
  1. <action path="/group_pages/edit_layout_set" type="com.liferay.portlet.layoutsadmin.action.EditLayoutSetAction"> 
  2.             <forward name="portlet.layouts_admin.edit_layouts" path="portlet.layouts_admin.edit_layouts" /> 
  3.             <forward name="portlet.layouts_admin.error" path="portlet.layouts_admin.error" /> 
  4.         </action> 

 

可以发现,它对应的动作类是EditLayoutSetAction类的updateLogo方法:

 
 
  1. protected void updateLogo( 
  2.             ActionRequest actionRequest, long liveGroupId, 
  3.             long stagingGroupId, boolean privateLayout, boolean hasLogo) 
  4.         throws Exception { 
  5.  
  6.         UploadPortletRequest uploadPortletRequest = 
  7.             PortalUtil.getUploadPortletRequest(actionRequest); 
  8.  
  9.         boolean useLogo = ParamUtil.getBoolean(actionRequest, "useLogo"); 
  10.  
  11.         InputStream inputStream = null
  12.  
  13.         try { 
  14.             File file = uploadPortletRequest.getFile("logoFileName"); 
  15.  
  16.             if (useLogo && !file.exists()) { 
  17.                 if (hasLogo) { 
  18.                     return
  19.                 } 
  20.  
  21.                 throw new UploadException("No logo uploaded for use"); 
  22.             } 
  23.  
  24.             if (file.exists()) { 
  25.                 inputStream = new ByteArrayFileInputStream(file, 1024); 
  26.             } 
  27.  
  28.             if (inputStream != null) { 
  29.                 inputStream.mark(0); 
  30.             } 
  31.  
  32.             LayoutSetServiceUtil.updateLogo( 
  33.                 liveGroupId, privateLayout, useLogo, inputStream, false); 
  34.  
  35.             if (inputStream != null) { 
  36.                 inputStream.reset(); 
  37.             } 
  38.  
  39.             if (stagingGroupId > 0) { 
  40.                 LayoutSetServiceUtil.updateLogo( 
  41.                     stagingGroupId, privateLayout, useLogo, inputStream, false); 
  42.             } 
  43.         } 
  44.         finally { 
  45.             StreamUtil.cleanUp(inputStream); 
  46.         } 
  47.     } 

 

这个方法我们仔细分析:

首先,在06行和14行定义了一个UploadPortletRequest对象,这个对象可以用来处理文件上传的操作,也就是从图示的文件上传控件中上传文件,因为上传文件的<input type="file",name="logoFileName",所以我们在14行uploadPortletRequest.getFile(fileName)就可以取得我们所上传的文件,也就是我们上传的图标。

然后第16-22行对于File对象为空进行了处理,这种情况下也就是没有上传任何文件就点了“save”,所以就会抛出没有logo的异常。

第24行,对于这个图标,我们打开一个字节文件输入流指向这个图标文件,然后调用32行的LayoutSetServiceUtil的updateLogo方法来更新图标,我们继续跟进:

可以发现它最终调用的是LayoutSetServiceImpl的updateLogo方法:

 
 
  1. public void updateLogo( 
  2.             long groupId, boolean privateLayout, boolean logo, 
  3.             InputStream inputStream, boolean cleanUpStream) 
  4.         throws PortalException, SystemException { 
  5.  
  6.         GroupPermissionUtil.check( 
  7.             getPermissionChecker(), groupId, ActionKeys.UPDATE); 
  8.  
  9.         layoutSetLocalService.updateLogo( 
  10.             groupId, privateLayout, logo, inputStream, cleanUpStream); 
  11.     } 

它先去检查这个update动作的permission,然后在去调用LayoutSetLocalService的updateLogo方法,其最终是调用LayoutSetLocalServiceImpl的updateLogo方法:

 
 
  1. public void updateLogo( 
  2.             long groupId, boolean privateLayout, boolean logo, InputStream is, 
  3.             boolean cleanUpStream) 
  4.         throws PortalException, SystemException { 
  5.  
  6.         LayoutSet layoutSet = layoutSetPersistence.findByG_P( 
  7.             groupId, privateLayout); 
  8.  
  9.         layoutSet.setModifiedDate(new Date()); 
  10.         layoutSet.setLogo(logo); 
  11.  
  12.         if (logo) { 
  13.             long logoId = layoutSet.getLogoId(); 
  14.  
  15.             if (logoId <= 0) { 
  16.                 logoId = counterLocalService.increment(); 
  17.  
  18.                 layoutSet.setLogoId(logoId); 
  19.             } 
  20.         } 
  21.  
  22.         layoutSetPersistence.update(layoutSet, false); 
  23.  
  24.         if (logo) { 
  25.             imageLocalService.updateImage( 
  26.                 layoutSet.getLogoId(), is, cleanUpStream); 
  27.         } 
  28.         else { 
  29.             imageLocalService.deleteImage(layoutSet.getLogoId()); 
  30.         } 
  31.     } 

 

从这里可以看出,它会先从数据库中读取当前LayoutSet,然后把logo的对应logoId添加到layoutSet中,然后把这个layoutSet写回数据库中。最后它根据bool变量logo ,来决定是否吧这个logo对应的Image写入数据库和绑定hook.





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/980604,如需转载请自行联系原作者

目录
相关文章
|
5月前
|
存储
ant-design Upload上传组件使用 action上传
ant-design Upload上传组件使用 action上传
116 0
|
5月前
|
前端开发 JavaScript 容器
ElementPlus Image 图片
ElementPlus Image 图片
35 0
|
区块链
gitbook 插件 图标与LOGO
gitbook 插件 图标与LOGO
gitbook 插件 图标与LOGO
html+css实战181-header-logo和导航
html+css实战181-header-logo和导航
128 0
html+css实战181-header-logo和导航
|
Dart 开发者
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
236 0
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(二)
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
360 0
【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )(一)
|
Android开发 iOS开发 C++
Flutter设置App的应用名字和应用logo图标的方法(android ios web)
在前面的几期给大家介绍了flutter的安装以及一些简单的配置,还运行了helloword 那么接下来就带领大家了解如何设置应用名称以及图标 Flutter设置App的应用名字和应用logo图标的方法,
650 0
Flutter设置App的应用名字和应用logo图标的方法(android ios web)
|
Android开发 iOS开发 C++
Flutter 设置 App 的应用名字和应用 logo 图标的方法
Flutter 设置 App 的应用名字和应用 logo 图标的方法, 知识点虽然简单,但是不知道这个知识点就不行,所以还是要记录下来,分享一下。 其实,Flutter 设置 App 的应用名称和图标是要分开来操作的,Android 和 iOS 是分开设置对应的 App 名称和图标的,这一点一定要注意。也可以把 Android 和 iOS 的应用名称和图标分开设置,可以设置不一样,但是毕竟一个 App 为了保证一致性,还是不要这样做,老老实实保证 Android 和 iOS 两个端的应用信息保持一致吧。
1033 0
Flutter 设置 App 的应用名字和应用 logo 图标的方法
|
Web App开发 前端开发