0

我在 Plone 的页面中创建了一个 HTML 表单,用于处理我在提交时获得的 Javascript 代码。Javascript 已放置在 plone_skins > custom 中。该代码用于检查调用页面的 URL 中的关键字,该关键字指示浏览器在通过第三方服务进行身份验证后需要重定向到的另一个页面的地址。代码如下所示:

function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length; i++) {
        var pair = vars[i].split("=");
        if(pair[0] == variable){return pair[1];}
    }
    return false;
}

function setLoginUrl(form) {
    var target = getQueryVariable("keyword");
    var loginUrl = "https://our.shibboleth.login.address.here";
    if(target != false) {
        loginUrl = loginUrl + "?keyword=" + keyword;
    }
    form.action = loginUrl;
    return true;
}

我已禁用带有随附表单和登录按钮的 Plone 页面的 TinyMCE,以便不会删除“onsubmit”。这是页面的代码:

<form name="processLogonForm" action ="" onsubmit="setLoginUrl(this);" method="post">
<input type=submit value="Instructors & Students"/>
</form>

我已经在 Plone 之外测试了 Javascript,它按预期重定向到正确的页面,并将关键字令牌中的信息也传递到下一页。但是,在 Plone 中,提交表单会导致重新加载相同的页面。积极的一面是,如果包含关键字令牌的 URL,它会传递到重新加载的页面,但我希望提交将用户带到授权页面。

我已经在 Plone 中注册了脚本,在页面中启用了脚本标签,并测试了其他 Javascript 代码,以确保我正确地将所有内容放入 Plone。关于我可能忽略此代码的任何建议?

更新:我已经接受了这里给出的建议来创建一个包含代码的自定义页面模板。我发现我忘记包含金属标签以使用此视图将脚本传递到页面。我可以在 Plone 生成页面的源代码中看到该脚本。但是,页面会继续自行重新加载。

4

2 回答 2

0

这更像是“如果您不需要这样做,请尝试其他事情”的答案。如果您需要做的只是运行一些 JS,您应该考虑创建一个自定义视图模板并将您需要的所有东西放在那里,而不是试图让它工作,尽管转换和 TinyMCE;任何东西都不会被变换所触及。如果(我认为这里就是这种情况)您实际上并不需要 Plone 的功能,这是一种绕过 Plone 的干净方法。

于 2015-06-18T18:20:18.087 回答
0

我猜你的 onsubmit 被覆盖并且永远不会运行。

不仅仅是 TinyMCE 使用 onsubmit。此外,无论如何您都不应该禁用tinymce。TinyMCE 应该只影响加载编辑器的页面。

夫妇的事情。首先,验证您的 JS 没有运行。使用调试器语句或在其中抛出 alert('hi') 语句。

接下来,由于可能还有其他事情正在使用提交事件,所以只需使用 jQuery 来完成您的工作,而不是 onsubmit 属性(无论如何,onsubmit 并不是执行 js 事件的好方法)。

您的 JavaScript 代码将是这样的

function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length; i++) {
        var pair = vars[i].split("=");
        if(pair[0] == variable){return pair[1];}
    }
    return false;
}

function getLoginUrl() {
    var target = getQueryVariable("keyword");
    var loginUrl = "https://our.shibboleth.login.address.here";
    if(target != false) {
        loginUrl = loginUrl + "?keyword=" + keyword;
    }
    return loginUrl;
}
$(document).ready(function(){
  $('[name="processLogonForm"]').submit(function(){
    var $el = $(this);
    $el.attr('action', getLoginUrl());
  });
})
于 2015-06-19T13:56:42.623 回答