我正在尝试使用一个普通的老式Content Block控件将Salesforce Web- to -lead表单插入到我们外部网站的内容块管理系统(如果有区别,我们使用Telerik SiteFinity )的页面中。不幸的是,当呈现页面时,SiteFinity会创建自己的标记来包装Salesforce生成的代码,从而创建一个嵌套表单。这显然行不通。
有没有人能想出解决这样的问题的办法?我看过其他嵌套表单解决方案,但没有看到这样的解决方案。其他的似乎都暗示着对代码的更多控制,这是我在SiteFinity中所没有的(我们的SF实例是在外部开发的,我们必须处理的就是内容管理方面的事情)。
我尝试过的一件事就是在Salesforce生成的代码前放置一组空的表单标签,这在某种程度上是可行的,但它的编码实践很糟糕。但是,该页面不使用返回的URL,而只是列出了已排队等待插入到SF组织中的Leads对象中的字段。
下面是我插入的Web-to-lead代码(加上不良做法的空表单):
<form></form>
<!-- ---------------------------------------------------------------------- -->
<!-- NOTE: Please add the following <META> element to your page <HEAD>. -->
<!-- If necessary, please modify the charset parameter to specify the -->
<!-- character set of your HTML page. -->
<!-- ---------------------------------------------------------------------- -->
<!-- <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"> -->
<!-- ---------------------------------------------------------------------- -->
<!-- NOTE: Please add the following <FORM> element to your page. -->
<!-- ---------------------------------------------------------------------- -->
<form id="sf_lead_entry" action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">
<input name="oid" type="hidden" value="<org id>" />
<input name="retURL" type="hidden" value="https://uat.collegeadvantage.com/529intheworkplace/thank-you" />
<!-- ---------------------------------------------------------------------- -->
<!-- NOTE: These fields are optional debugging elements. Please uncomment -->
<!-- these lines if you wish to test in debug mode. -->
<input name="debug" type="hidden" value="1" />
<input name="debugEmail" type="hidden" value="software@collegeadvantage.com" />
<!-- ---------------------------------------------------------------------- -->
<label for="first_name">First Name</label><input name="first_name" id="first_name" type="text" size="20" maxlength="40" /><br />
<label for="last_name">Last Name</label><input name="last_name" id="last_name" type="text" size="20" maxlength="80" /><br />
<label for="company">Company</label><input name="company" id="company" type="text" size="20" maxlength="40" /><br />
<label for="title">Title</label><input name="title" id="title" type="text" size="20" maxlength="40" /><br />
<label for="phone">Phone</label><input name="phone" id="phone" type="text" size="20" maxlength="40" /><br />
<label for="email">Email</label><input name="email" id="email" type="text" size="20" maxlength="80" /><br />
<label for="street">Street</label><textarea name="street"></textarea><br />
<label for="city">City</label><input name="city" id="city" type="text" size="20" maxlength="40" /><br />
<label for="state">State/Province</label><input name="state" id="state" type="text" size="20" maxlength="20" /><br />
<label for="zip">Zip</label><input name="zip" id="zip" type="text" size="20" maxlength="20" /><br />
Lead Channel:<textarea name="<custom control id>" id="<custom control id>" wrap="soft" type="text"></textarea><br />
<input name="submit" type="submit" value="Submit Query" />
</form>有没有人有办法解决这个问题?
谢谢,杰米
发布于 2017-04-28 13:07:13
因为Sitefinity是asp.net应用程序,所以它在所有页面上都有form标签。而且您不能嵌套form标记。
来自html5规范:https://www.w3.org/TR/html5/forms.html#the-form-element
4.10.3表单元素
内容模型:
流内容,但没有form元素的后代。
在您的情况下,有两种方法。
div代替form tag.This JS将在您单击提交按钮后创建隐藏表单。用数据属性替换div的示例:
<div data-sitefinity-form="" data-action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" data-method="POST"> </div>
JS:
(function() {
var pseudoForms = document.querySelectorAll('[data-sitefinity-form]');
for(j=0;j<pseudoForms.length;j++)
{
var container = pseudoForms[j];
if (container === null)
return;
var inputs = container.querySelectorAll("input, textarea, select");
var allInputs = document.forms["aspnetForm"].querySelectorAll('input, textarea', 'select');
for (var i = 0; i < allInputs.length; i++) {
allInputs[i].addEventListener("invalid", function(event) {
if (Array.indexOf(inputs, document.activeElement) >= 0 && Array.indexOf(inputs, event.target) < 0)
event.preventDefault();
}, true);
}
var submitClick = function (sender) {
var isValid = true;
if (isValid) {
function findAncestor (el) {
while ((el = el.parentElement) && !el.hasAttribute("data-sitefinity-form"));
return el;
}
var pForm = findAncestor(sender.target || sender.srcElement);
var form = document.createElement("form");
form.style.display = "none";
form.setAttribute("action", pForm.getAttribute("data-action"));
if (pForm.getAttribute("data-method"))
form.setAttribute("method", pForm.getAttribute("data-method"));
if (pForm.getAttribute("enctype"))
form.setAttribute("enctype", pForm.getAttribute("enctype"));
else
form.setAttribute("enctype", document.forms["aspnetForm"].getAttribute("enctype"));
form.setAttribute("encoding", document.forms["aspnetForm"].getAttribute("encoding"));
form.appendChild(pForm);
sender = sender.target || sender.srcElement;
if(sender)
{
var submitHiddenInput = document.createElement("input");
submitHiddenInput.setAttribute("type", "hidden");
submitHiddenInput.setAttribute("name", sender.name);
submitHiddenInput.setAttribute("value", sender.value || "Submit");
form.appendChild(submitHiddenInput);
}
document.body.appendChild(form);
form.submit();
return false;
}
};
var handleFormSubmitElements = function (elementName) {
var allSubmitElements = container.getElementsByTagName(elementName);
var elementCount = allSubmitElements.length;
while(elementCount) {
typeAttr = allSubmitElements[elementCount - 1].getAttribute("type");
if(typeAttr == "submit") {
var currentClick = allSubmitElements[elementCount - 1].onclick;
if (currentClick)
allSubmitElements[elementCount - 1].onclick = function () { if (currentClick()) return submitClick(); else return false; };
else
allSubmitElements[elementCount - 1].onclick = submitClick;
}
elementCount--;
}
};
handleFormSubmitElements("input");
handleFormSubmitElements("textarea");
handleFormSubmitElements("select");
handleFormSubmitElements("button");
}
})();https://stackoverflow.com/questions/43665881
复制相似问题