diff --git a/build.xml b/build.xml index 7d1d9e4..1ce7230 100644 --- a/build.xml +++ b/build.xml @@ -5,9 +5,9 @@ + - @@ -30,6 +30,9 @@ + + + @@ -94,6 +97,7 @@ + @@ -107,12 +111,16 @@ + + + + + - - + - + \ No newline at end of file diff --git a/install/fr-plugin-rh.iframe-6.3.zip b/install/fr-plugin-rh.iframe-6.3.zip new file mode 100644 index 0000000..dd8cfc0 Binary files /dev/null and b/install/fr-plugin-rh.iframe-6.3.zip differ diff --git a/lib/report/.gitignore b/lib/report/.gitignore new file mode 100644 index 0000000..f23b948 --- /dev/null +++ b/lib/report/.gitignore @@ -0,0 +1 @@ +*.jar \ No newline at end of file diff --git a/lib/servlet-api.jar b/lib/servlet-api.jar deleted file mode 100644 index 369143a..0000000 Binary files a/lib/servlet-api.jar and /dev/null differ diff --git a/plugin.xml b/plugin.xml index 72acc1e..3fae992 100644 --- a/plugin.xml +++ b/plugin.xml @@ -2,12 +2,15 @@ com.fr.solution.plugin.form.widget.rh.iframe yes - 6.0 + 6.3 8.0 2016-06-30 solution + [2017-06-14]模板类型的网页框链接支持数组参数。
+ [2017-06-13]修复模板名字不能为中文的问题。
[2017-03-17]修复公式无法正确解析的问题。
[2016-07-29]网页地址不加http的时候自动加上。
[2016-07-29]修复不设置网页框地址时会导致整个表单无法展示的BUG。
diff --git a/src/com/fr/plugin/form/widget/core/RHIframeAttr.java b/src/com/fr/plugin/form/widget/core/RHIframeAttr.java index f331f5d..7edf689 100644 --- a/src/com/fr/plugin/form/widget/core/RHIframeAttr.java +++ b/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); } } diff --git a/src/com/fr/plugin/form/widget/core/RHIframeSource.java b/src/com/fr/plugin/form/widget/core/RHIframeSource.java index aec6d43..4fb4097 100644 --- a/src/com/fr/plugin/form/widget/core/RHIframeSource.java +++ b/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(); diff --git a/src/com/fr/plugin/form/widget/core/TemplateSource.java b/src/com/fr/plugin/form/widget/core/TemplateSource.java index af9a444..7f5bd18 100644 --- a/src/com/fr/plugin/form/widget/core/TemplateSource.java +++ b/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"); diff --git a/src/com/fr/plugin/form/widget/core/URLSource.java b/src/com/fr/plugin/form/widget/core/URLSource.java index e073b29..6a26465 100644 --- a/src/com/fr/plugin/form/widget/core/URLSource.java +++ b/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"); diff --git a/src/com/fr/plugin/form/widget/web/widget.rh.iframe.js b/src/com/fr/plugin/form/widget/web/widget.rh.iframe.js index c532c92..5497fb3 100644 --- a/src/com/fr/plugin/form/widget/web/widget.rh.iframe.js +++ b/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内容的可用性