AMP表单提交使用POST方法

7
我有一个网站已经运行多年,其中包含一些登录表格等。最近我将其全部转为了Google AMP格式,但这些表格无法正常工作。我已经搜索了几天,但仍找不到正确的答案。
首先,我按照此页面上所示,引入了所有必要的脚本和代码。然后,第一个错误出现了:"Form submission failed:: Response must contain the AMP-Access-Control-Allow-Source-Origin header​​​"。
接下来,我在页面中添加了头部信息。此时,第一个错误消失了,但是出现了第二个错误:"Form submission failed:: Unexpected token < in JSON at position 0"。我在这里看到了相关内容,但并没有真正解决我的问题。
当前我已经陷入困境,对于如此简单的表格而言,我觉得自己走错了方向。我只是想简单地输出输入的内容... 您能帮帮我吗?
敬礼,
Patrick
    <?php 
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: *.ampproject.org");
header("AMP-Access-Control-Allow-Source-Origin: https://www.domain.com");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");
?>
<!doctype html>
<html amp>
<head>
<meta charset="utf-8">
<script async src="https://cdn.ampproject.org/v0.js"></script>
<script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"></script>
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="canonical" href="https://www.domain.com/test.php"/>
<title>AMP form</title>
</head>
<body>
<?php
if(isset($_POST['submitlogin']))
{
$name = $_POST['name'];
echo $name;
} ?>
<form method="post" action-xhr="#" target="_top">
Name:<input type="text" name="name" />
<input type="submit" name="submitlogin" value="Submit" />
</form>
</body>
</html>
2个回答

7
简单来说:你不能只是输出输入内容。
从文档中可以看到:

使用action-xhr属性通过XMLHttpRequest(XHR)提交表单。您可以使用amp-mustache模板显示自定义的成功或错误消息,使用作为JSON发送的服务器端点的数据。例如,如果服务器发送{"foo":"bar"},则可以在模板中使用{{foo}}渲染bar。

因此,由于您正在使用action-xhr,应返回JSON,并相应地更新表单模板。
请查看此链接:https://ampbyexample.com/components/amp-form/
以下是您代码中的示例:
<?php
if(isset($_POST['submitlogin']))
{
    $name = isset($_POST['name']) ? $_POST['name'] : '' ;
    $output = [
            'name' => $name
    ];
header("Content-type: application/json");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: *.ampproject.org");
header("AMP-Access-Control-Allow-Source-Origin: https://www.domain.com");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");

echo json_encode($output);
die();

}
?>
<!doctype html>
<html amp>
<head>
    <meta charset="utf-8">
    <script async src="https://cdn.ampproject.org/v0.js"></script>
    <script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"></script>
    <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
    <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="canonical" href="https://www.domain.com/test.php"/>
    <title>AMP form</title>
</head>
<body>

<form method="post" action-xhr="#" target="_top">
    Name:<input type="text" name="name" />
    <input type="submit" name="submitlogin" value="Submit" />
</form>
<div submit-success>
    <template type="amp-mustache">
        Success! Thanks for trying the
        <code>amp-form</code> demo! The name submited was {{name}}
    </template>
</div>
</body>
</html>

1
示例就在这里,它说:>> 例如,如果服务器发送 {"foo": "bar"},您可以在模板中使用 {{foo}} 来呈现 bar。 - yivi
然后我必须自己学习一些关于JSON的知识并更改所有的表单... 感谢您的帮助! - Patrick de Graaf
当我复制你给我的整个示例时,它只返回“null”,甚至没有显示表单。也许这是因为头部的原因? - Patrick de Graaf
现在我在amp-mustache中收到{{name}},我该如何将其作为php值获取?因为我想将它存储在SQL数据库中。 - Patrick de Graaf
我不太明白,我觉得你也没有完全理解发生了什么。在第一个“if”语句里面,你可以访问已发送的数据,在那里处理它,并返回一个JSON(包含原始数据或任何其他内容),然后在发送页面的一个模板中使用它。 - yivi
显示剩余6条评论

-1

若要快速解决此问题,请删除amp-form脚本。表单将正常工作,唯一的缺陷是页面不会通过amp验证,但这并不是什么大问题。您仍然可以享受速度提升。唯一的缺点是表单页面不会添加到Google CDN以在其内容网络中分发,这实际上只影响移动用户。然后,如果您真的想要,可以学习本页面介绍的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接