本文转自:http://idempiere_guide_xb.mydoc.io/?t=216602
主题相关:http://wiki.idempiere.org/en/Add_your_theme
zk开发一个主题项目http://wiki.idempiere.org/en/Developing_Plug-Ins_-_WebUI_Themes
zk开发一个主题项目
文件位置
zk web的主题文件位置:源码:org.adempiere.ui.zk/theme/ 非源码:\idempiere-server\plugins\org.adempiere.ui.zk_3.1.0.v20160311-0602\theme\
---theme---default(默认主题),该目录下结构如下图:
制作主题
直接修改default主题 ● 拷贝default目录所有文件到新目录,作为新主题目录(比如busninessteam) ● 修改布局和素材,如下图
修改主题
修改别人制作的主题 ● 拷贝,解压缩jar文件到相应目录,只拷贝theme目录(比如busninessteam)到default目录平行位置。 ● 修改布局和素材。
主题发布
-
开发环境:1.1 新建 fragment project,使用 org.adempiere.ui.zk 作为一个host plugin1.2 该项目的根目录,即为1.2的主题结构和文件,含busninessteam/css | images | zul等。1.3 Eclipse中,复制server.product的启动配置参数,新增-DZK_THEME=busninessteam,新增该主题项目到你的工作区插件列表1.4 测试调整成功后,前台使用system用户登录,进入system configuration(系统配置),设置ZK_THEME=busninessteam,刷新浏览器。
-
已编译环境2.1 前台使用system用户登录,进入system configuration(系统配置),设置ZK_THEME=busninessteam,刷新浏览器。
主题开发
1、eclipse下创建2个项目,一个官方版本项目(比如ad380),一个自定义项目(比如myXyz,依赖前者,fork源码https://github.com/mckayERP/template)。2、在第一个项目的工作空间,新增forked的代码。3、修改utils_dev/buildCustomization.properties指向实际的路径。4、重点开始了,自定义zk webui。5、删除zkwebui文件夹下的所有东西,除了保留build_custom.xml文件。6、拷贝ad380项目中的zkwebui所有东西,记得不要覆盖build_custom.xml。7、删除zkwebui/WEB-INF/src源码树,只留下你想要修改的文件。8、myXyz只有一个自定义文件--LoginPanel.java,只是简单修改了组件“login header”的Title为“我的定制成功了!”9、eclipse的tools/lauchers中,修改myXyz的启动器为正确的名字,比如myXyz ZK(待测试,我没有环境) 10、启动myXyz ZK,这将从ad380项目中拷贝所有需要的类到myXyz项目。11、依赖Adempiere的版本,你需要手动修改utils_dev/build.xml文件,最后刷新项目文件。12、如果你自定义zk webui,新增一个服务器,并将这个模版项目加入到这个服务器。在服务器启动器上,类路径需要包含如下:C:/dev/apache/tomcat-6.0/bin/bootstrap.jar (由于iDempiere已经变成jetty,这里需要修改)adempiereTrunk/tools/lib/jnlp.jar(修改成ad380,你的项目名称)adempiereTrunk/tools/lib/javaee.jaradempiereTrunk/tools/lib/jcommon-1.0.18.jaradempiereTrunk/tools/lib/jfreechart-1.0.15.jaradempiereTrunk/tools/lib/log4j.jaradempiereTrunk/JasperReportsTools/lib/jasperreports-5.1.0.jaradempiereTrunk/tools/lib/c3p0-0.9.1.2.jaradempiereTrunk/tools/lib/iText-2.1.7.jaradempiereTrunk/tools/lib/poi-3.9-20121203.jaradempiereTrunk/lib/postgresql.jaradempiereTrunk/tools/lib/commons-net-1.4.0.jaradempiereTrunk/tools/lib/commons-collections-3.1.jaradempiereTrunk/tools/lib/barbecue-1.5-beta1.jar13、这些是启动器的缺省文件,你需要指向你自己的ad380项目名称。14、开始测试啦。15、比较Ad380和myXyz的根目录下的build.xml(或其他build*.xml文件),修改并增加自定义类。(不懂细节,截图2张)16、如果你启动服务器,你就可以看到zk文件的变化。(重启才能看到更新)17、导出自定义jar文件。18、服务器启动时已经构建了自定义jar文件,本例中,这2个文件(customization.jar 、 zkcustomization.jar)已经添加到库目录中。19、直接安装(RUN_Setup)就可以看到变化了。
index.zul
布局文件:所有布局文件都在theme/zul目录下,所有java类都在/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui目录下。
index.zul: 主题定义: /org.adempiere.ui.zk/theme.zsjava定义:/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereWebUI.java
desktop.zul
布局定义:org.adempiere.ui.zk/theme/default/zul/desktop/java定义:org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/desktop/DefaultDesktop.java,关键代码如下:
Center windowArea = layout.getCenter();
windowContainer.createPart(windowArea);
homeTab = new Tabpanel();
windowContainer.addWindow(homeTab, Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Home")), false, null);
homeTab.getLinkedTab().setSclass("desktop-hometab");
((Tab)homeTab.getLinkedTab()).setDisableDraggDrop(true);
homeTab.setSclass("desktop-home-tabpanel");
BusyDialog busyDialog = new BusyDialog();
busyDialog.setShadow(false);
homeTab.appendChild(busyDialog);
ADTabpanel.java
ADTabpanel(一个adtab-content)主窗口区的tab面板,布局文件desktop.zul。java代码:/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java
FedexLabelWindow
这是一个自定义的打印快递标签的窗口例子。java代码:/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/PrintLabelApplet.java,关键代码如下:
public LabelAppletWindow(List<byte[]> list)
{
super();
Div div = new Div();
appendChild(div);
Applet applet = new Applet();
applet.setCode("PrintLabelApplet.class");
applet.setArchive("labelapplet.jar");
ZKUpdateUtil.setWidth(applet, "0");
ZKUpdateUtil.setHeight(applet, "0");
applet.setParam("size", list.size() + "");
for(int i = 0; i < list.size(); i++)
{
try
{
MArchive archive = new MArchive(Env.getCtx(), 0, null);
archive.setName("file_" + i);
archive.setBinaryData(list.get(i));
archive.saveEx();
applet.setParam("file_" + i, archive.getAD_Archive_ID() + "");
if (log.isLoggable(Level.INFO))
log.info("file_" + i + "=" + archive.getAD_Archive_ID());
} catch (Exception e) {
e.printStackTrace();
}
}
div.appendChild(applet);
ToolBarButton link = new ToolBarButton();
link.setLabel("Click here to close this popup after printing is completed.");
link.addEventListener(Events.ON_CLICK, this);
appendChild(link);
this.setBorder("normal");
}
UPSHtmlLabelWindow
这也是一个自定义的打印快递标签的窗口例子。java代码:/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/UPSHtmlLabelWindow.java