Browse Source

修复中文时无法识别参数的bug

master
richie 7 years ago
parent
commit
127dc34fef
  1. 16
      build.xml
  2. BIN
      install/fr-plugin-rh.iframe-6.3.zip
  3. 1
      lib/report/.gitignore
  4. BIN
      lib/servlet-api.jar
  5. 5
      plugin.xml
  6. 37
      src/com/fr/plugin/form/widget/core/RHIframeAttr.java
  7. 9
      src/com/fr/plugin/form/widget/core/RHIframeSource.java
  8. 50
      src/com/fr/plugin/form/widget/core/TemplateSource.java
  9. 38
      src/com/fr/plugin/form/widget/core/URLSource.java
  10. 41
      src/com/fr/plugin/form/widget/web/widget.rh.iframe.js

16
build.xml

@ -5,9 +5,9 @@
<property name="libs" value="${basedir}/lib"/>
<property name="publicLibs" value=""/>
<property name="reportLibs" value="${basedir}/lib/report"/>
<property name="destLoc" value="."/>
<property name="classes" value="classes"/>
<xmlproperty file="${basedir}/plugin.xml"/>
<property name="current-version" value="${plugin.version}"/>
@ -30,6 +30,9 @@
<fileset dir="${publicLibs}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${reportLibs}">
<include name="**/*.jar"/>
</fileset>
</path>
<patternset id="resources4Jar">
<exclude name="**/.settings/**"/>
@ -94,6 +97,7 @@
<delete dir="${classes}"/>
</target>
<target name="jar" depends="super_jar">
<antcall target="zip"/>
</target>
@ -107,12 +111,16 @@
<include name="${plugin-jar}"/>
<include name="plugin.xml"/>
</fileset>
<fileset dir="${libs}">
<include name="*.jar"/>
<include name="*.dll"/>
</fileset>
</copy>
<zip destfile="${basedir}/${plugin-folder}.zip" basedir=".">
<include name="${plugin-folder}/*.jar"/>
<include name="${plugin-folder}/*.dll"/>
<include name="${plugin-folder}/plugin.xml"/>
</zip>
<xmlproperty file="${basedir}/plugin.xml"/>
<move file="${plugin-folder}.zip" todir="${destLoc}/${plugin.name}"/>
<move file="${plugin-folder}.zip" todir="${destLoc}/install"/>
</target>
</project>
</project>

BIN
install/fr-plugin-rh.iframe-6.3.zip

Binary file not shown.

1
lib/report/.gitignore vendored

@ -0,0 +1 @@
*.jar

BIN
lib/servlet-api.jar

Binary file not shown.

5
plugin.xml

@ -2,12 +2,15 @@
<id>com.fr.solution.plugin.form.widget.rh.iframe</id>
<name><![CDATA[网页框控件]]></name>
<active>yes</active>
<version>6.0</version>
<version>6.3</version>
<env-version>8.0</env-version>
<jartime>2016-06-30</jartime>
<vendor email="solution@finereport.com">solution</vendor>
<description><![CDATA[网页框控件,仅支持在表单中使用]]></description>
<change-notes><![CDATA[
[2017-06-20]修复模板类型的网页框参数为中文时候的问题。<br/>
[2017-06-14]模板类型的网页框链接支持数组参数。<br/>
[2017-06-13]修复模板名字不能为中文的问题。<br/>
[2017-03-17]修复公式无法正确解析的问题。<br/>
[2016-07-29]网页地址不加http的时候自动加上。<br/>
[2016-07-29]修复不设置网页框地址时会导致整个表单无法展示的BUG。<br/>

37
src/com/fr/plugin/form/widget/core/RHIframeAttr.java

@ -1,18 +1,22 @@
package com.fr.plugin.form.widget.core;
import com.fr.base.Formula;
import com.fr.base.ParameterMapNameSpace;
import com.fr.general.FArray;
import com.fr.general.xml.GeneralXMLTools;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.*;
import com.fr.stable.js.WidgetName;
import com.fr.stable.ArrayUtils;
import com.fr.stable.DependenceProvider;
import com.fr.stable.ParameterProvider;
import com.fr.stable.UtilEvalError;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.script.NameSpace;
import com.fr.stable.xml.*;
import com.fr.stable.xml.StableXMLUtils;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLReadable;
import com.fr.stable.xml.XMLable;
import com.fr.stable.xml.XMLableReader;
import com.fr.web.core.SessionIDInfor;
import javax.servlet.http.HttpServletRequest;
@ -69,33 +73,16 @@ public class RHIframeAttr implements XMLable, DependenceProvider {
jo.put("dependence", dependence);
jo.put("valueDependence", dependence);
}
jo.put("sourceType", source.getSourceType());
}
}
public void mixJSONData(JSONArray ja, SessionIDInfor sessionIDInfor, Calculator c) throws JSONException, UtilEvalError {
NameSpace ns = ParameterMapNameSpace.create(sessionIDInfor.getParameterMap4Execute());
c.pushNameSpace(ns);
for (int i = 0; i < (parameters == null ? 0 : parameters.length); i++) {
Object obj = parameters[i].getValue();
if (obj instanceof Formula) {
String content = ((Formula) obj).getContent();
obj = c.evalValue(content);
}
JSONObject jo = new JSONObject();
if (obj instanceof String) {
obj = CodeUtils.cjkEncode((String) obj);
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof FArray) {
obj = ((FArray) obj).cjkEncode();
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof WidgetName) {
jo.put("widgetName", ((WidgetName) obj).getName());
} else {
// 还可以是数字啊什么的
jo.put(parameters[i].getName(), obj);
}
ja.put(jo);
if (source != null) {
source.mixCalculatedParameters(c, ja, parameters);
}
}

9
src/com/fr/plugin/form/widget/core/RHIframeSource.java

@ -1,7 +1,12 @@
package com.fr.plugin.form.widget.core;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.DependenceProvider;
import com.fr.stable.ParameterProvider;
import com.fr.stable.UtilEvalError;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLable;
import com.fr.stable.xml.XMLableReader;
@ -30,10 +35,14 @@ public abstract class RHIframeSource implements XMLable, DependenceProvider {
}
public abstract String getSourceType();
public String getCalculatedUrl(Calculator calculator, HttpServletRequest req) {
return null;
}
public abstract void mixCalculatedParameters(Calculator c, JSONArray ja, ParameterProvider[] parameters) throws JSONException, UtilEvalError;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();

50
src/com/fr/plugin/form/widget/core/TemplateSource.java

@ -1,12 +1,22 @@
package com.fr.plugin.form.widget.core;
import com.fr.base.Formula;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fr.base.TemplateUtils;
import com.fr.data.NetworkHelper;
import com.fr.general.FArray;
import com.fr.general.GeneralUtils;
import com.fr.general.Inter;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.json.JSONUtils;
import com.fr.script.Calculator;
import com.fr.stable.ArrayUtils;
import com.fr.stable.CodeUtils;
import com.fr.stable.ParameterProvider;
import com.fr.stable.UtilEvalError;
import com.fr.stable.js.WidgetName;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
@ -14,7 +24,6 @@ import com.fr.stable.xml.XMLableReader;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
@ -46,9 +55,9 @@ public class TemplateSource extends RHIframeSource {
try {
String realPath = TemplateUtils.render(path, calculator);
if (realPath.contains(".cpt")) {
return NetworkHelper.createServletURL(req) + "?reportlet=" + realPath;
return NetworkHelper.createServletURL(req) + "?reportlet=" + CodeUtils.cjkEncode(realPath);
} else if (realPath.contains(".frm")) {
return NetworkHelper.createServletURL(req) + "?formlet=" + realPath;
return NetworkHelper.createServletURL(req) + "?formlet=" + CodeUtils.cjkEncode(realPath);
}
} catch (Exception e) {
return null;
@ -66,6 +75,39 @@ public class TemplateSource extends RHIframeSource {
return collections.toArray(new String[collections.size()]);
}
@Override
public void mixCalculatedParameters(Calculator c, JSONArray ja, ParameterProvider[] parameters) throws JSONException, UtilEvalError {
if (parameters == null) {
return;
}
// richie:这里的key/value不需要做CJKEncode,在前端会处理的
for (ParameterProvider parameter : parameters) {
JSONObject jo = JSONObject.create();
String key = parameter.getName();
Object obj = parameter.getValue();
if (obj instanceof Formula) {
String content = ((Formula) obj).getContent();
obj = c.evalValue(content);
}
if (obj instanceof String) {
jo.put(parameter.getName(), obj);
} else if (obj instanceof FArray) {
jo.put(key, obj);
} else if (obj instanceof WidgetName) {
jo.put("widgetName", ((WidgetName) obj).getName());
} else {
// 还可以是数字啊什么的
jo.put(key, obj);
}
ja.put(jo);
}
}
@Override
public String getSourceType() {
return "tpl";
}
@Override
public String toString() {
return Inter.getLocText("Plugin_RH_Iframe_Template_Path");

38
src/com/fr/plugin/form/widget/core/URLSource.java

@ -4,12 +4,19 @@ import com.fr.base.Formula;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fr.base.TemplateUtils;
import com.fr.general.FArray;
import com.fr.general.FRLogger;
import com.fr.general.GeneralUtils;
import com.fr.general.Inter;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.script.Calculator;
import com.fr.stable.CodeUtils;
import com.fr.stable.ParameterProvider;
import com.fr.stable.StableUtils;
import com.fr.stable.UtilEvalError;
import com.fr.stable.js.WidgetName;
import com.fr.stable.script.CalculatorProvider;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader;
@ -74,6 +81,37 @@ public class URLSource extends RHIframeSource {
return collections.toArray(new String[collections.size()]);
}
@Override
public void mixCalculatedParameters(Calculator c, JSONArray ja, ParameterProvider[] parameters) throws JSONException, UtilEvalError {
for (int i = 0; i < (parameters == null ? 0 : parameters.length); i++) {
Object obj = parameters[i].getValue();
if (obj instanceof Formula) {
String content = ((Formula) obj).getContent();
obj = c.evalValue(content);
}
JSONObject jo = JSONObject.create();
if (obj instanceof String) {
obj = CodeUtils.cjkEncode((String) obj);
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof FArray) {
obj = ((FArray) obj).cjkEncode();
jo.put(parameters[i].getName(), obj);
} else if (obj instanceof WidgetName) {
jo.put("widgetName", ((WidgetName) obj).getName());
} else {
// 还可以是数字啊什么的
jo.put(parameters[i].getName(), obj);
}
ja.put(jo);
}
}
@Override
public String getSourceType() {
return "url";
}
@Override
public String toString() {
return Inter.getLocText("Plugin_RH_Iframe_Url");

41
src/com/fr/plugin/form/widget/web/widget.rh.iframe.js

@ -122,7 +122,7 @@
waitForInitComplete.push(params.widgetName);
}
} else {
src = src.appendQuery(params);
src = self._appendQuery(src, params);
}
}
@ -142,6 +142,45 @@
}
this._changeIframe(src);
},
/**
* 给url加上给定的参数
* @param {String} src 原地址
* @param {Object} paras 参数对象是一个键值对对象
* @return {String} 添加了给定参数的url
*/
_appendQuery: function (src, paras) {
if (!paras) {
return src;
}
// 没有问号说明还没有参数
if (src.indexOf("?") === -1) {
src += "?";
}
// 如果以问号结尾,说明没有其他参数
if (src.endWith("?") !== false) {
} else {
src += "&";
}
debugger;
// 模板
if (this.options.sourceType == 'tpl') {
$.each(paras, function (pName, pValue) {
if (FR.isArray(pValue)) {
paras[pName] = pValue;
} else {
paras[pName] = encodeURIComponent(pValue);
}
});
src += "__parameters__=" + FR.cjkEncode(FR.jsonEncode(paras));
} else {
$.each(paras, function (name, value) {
if (typeof(name) === 'string') {
src += name + "=" + value + "&";
}
});
}
return encodeURI(src);
},
/**
* 添加一层遮罩层用于屏蔽iframe内容的可用性

Loading…
Cancel
Save