Итак, на прошлой неделе я опубликовал Эта проблема по поводу дублирования заголовков. Я исправил эту проблему, я верю, но теперь она возвращает новую ошибку, которую я не могу решить. Я исправил свою последнюю проблему, удалив заголовки, добавляемые во второй раз внутри PHP функции отправки формы, и позволив им существовать только в htaccess.
Единственный заголовок, который существует в форме submit PHP, — это установка Content-Type
на application/json
.
Когда я отправляю форму, появляется сообщение об отправке. Затем, когда форма отправляется/отказывается, она не возвращает сообщение, содержащееся в тегах шаблона amp-mustache.
<div submitting>
<template type = "amp-mustache">
Form submitting... Thank you for waiting.
</template>
</div>
<div submit-success>
<template type = "amp-mustache">
Thanks, your message has been sent successfully.
</template>
</div>
<div submit-error>
<template type = "amp-mustache">
Unfortunately your message could not be sent. Please try again later.
</template>
</div>
После небольшого осмотра кажется, что мой Content-Type
не установлен на application/json
на моем PHP, который отправляет форму, но когда я проверяю вкладку «Сеть» в Chrome, все отображается хорошо, что касается заголовков.
Заголовки ответа для PHP (xhr-contact-test.php), который отправляет форму:
access-control-allow-credentials: true
access-control-allow-headers: Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token
access-control-allow-methods: POST, GET, OPTIONS
access-control-allow-source-origin: https://www.craigattachments.com
access-control-expose-headers: AMP-Access-Control-Allow-Source-Origin
amp-access-control-allow-source-origin: https://www.craigattachments.com
cache-control: max-age=604800
cf-railgun: 4d68972973 0.01 0.656948 0030 cc99
cf-ray: 4de04cf54e22ccfe-EWR
content-encoding: br
content-security-policy: default-src * data: blob:; img-src * 'self' data: https: https://static.craigmanufacturing.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/ https://cdn.ampproject.org/v/ https://cdn.ampproject.org/rtv/ https://static.craigmanufacturing.com *.google.com https://maps.googleapis.com/maps/api/js/ https://maps.googleapis.com/maps/api/place/js/ https://cdn.polyfill.io https://cdnjs.cloudflare.com/ajax/; object-src 'self' https://www.craigattachments.com/pdf/; media-src 'self' https://www.craigattachments.com/pdf/; plugin-types application/pdf; style-src 'self' 'unsafe-inline' https://static.craigmanufacturing.com https://cdn.ampproject.org/rtv/ https://fonts.googleapis.com/; base-uri 'self';
content-type: application/json
date: Tue, 28 May 2019 12:41:04 GMT
expect-ct: max-age=604800, report-uri = "https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
expires: Tue, 04 Jun 2019 12:41:03 GMT
feature-policy: microphone 'none'; payment 'none'; geolocation *; sync-xhr 'self' https://www.craigattachments.com
referrer-policy: same-origin
server: cloudflare
status: 200
strict-transport-security: max-age=31536000
vary: User-Agent
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
Ошибка, которую он возвращает, приведена ниже и указывает на строку 1073 в amp-form.js, которая является функцией, которая устанавливает атрибут i-amphtml-rendered
в соответствующем теге шаблона amp-mustache. Изучение этого привело меня к мысли, что тип контента был причиной проблемы, но теперь он, кажется, установлен правильно, и ошибка сохраняется.
Uncaught (in promise) TypeError: b.setAttribute is not a function
Я открыл контактную форму тестирования по этой ссылке: https://www.craigattachments.com/contact-us-test/.
Есть мысли, куда мне идти дальше? Я пробовал несколько вещей, таких как проверка существования определенных заголовков, установка Content-Type
внутри моего htaccess и установка моих заголовков только в PHP.
Решение для всех, кто застрял на этом... Если вы отобразите свою электронную почту в виде массива, такого как echo json_encode(array($email));
, возникнет эта ошибка. В любом случае удаление массива из уравнения, кажется, исправило это для меня - echo json_encode($email);
Обновление 2019/06/12: Огромное спасибо Аарону. Для этой проблемы были добавлены некоторые лучшие параметры обработки ошибок, если кто-то столкнется с этим в будущем: https://github.com/ampproject/amphtml/pull/22576
Я быстро взглянул, и похоже, что возвращаемый объект из метода renderTemplate представляет собой массив, а не элемент.
https://github.com/ampproject/amphtml/blob/master/extensions/amp-form/0.1/amp-form.js#L1121
Возможно в коде ошибка. Осматривая div, похоже, что все они также являются одним и тем же сообщением об успехе. Возможно ли воспроизвести это гораздо более простую демо-версию, с минимальными затратами для воспроизведения. например просто форма Спасибо
спасибо, Крейг, я могу воспроизвести ваш набор данных публикации JSON, и это похоже на ошибку, я зарегистрирую проблему и постараюсь ее исправить. Сегодня мы обновим более подробную информацию. Спасибо
Зарегистрирован вопрос github.com/ampproject/amphtml/issues/22570. Похоже, вы непреднамеренно наткнулись на путь кода, который никогда не должен работать с amp-form. Есть ли причина, по которой вы возвращаете массив JSON с конечной точкой публикации? craigattachments.com/xhr-contact-test.php Изменение этого решит проблему... хотя, очевидно, мы исправим ее с нашей стороны. Спасибо за демонстрацию.
Честно говоря, не совсем понимаю, почему мы возвращаем его через массив JSON. Я не участвовал в базовой настройке формы, просто помог отправить ее, и сейчас я работаю над проверкой веб-сайта, чтобы исправить некоторые вещи. На этой неделе я играю около 3 дополнительных ролей на работе, но на следующей неделе я покопаюсь и посмотрю, смогу ли я найти лучший ответ. Спасибо за регистрацию проблемы, я подписался на нее, чтобы быть в курсе ее хода.
Итак, я совершенно не понимаю, почему он передавался обратно как массив JSON. Я удалил массив, и теперь все хорошо. echo json_encode(array($email_subject, $email_address, $html_email, $email_name))
стал echo json_encode($html_email)
, и мои сообщения об ошибках работают нормально.
Звучит неплохо. Да, я не уверен, где мы стоим, должны ли мы разрешать это, но я собираюсь пойти дальше и внести изменения в код, чтобы утверждать, что шаблон submit-[state] является фактическим элементом, который может быть отображен так, чтобы, по крайней мере, есть сообщение об ошибке, которое полезно, если это не так. Спасибо, Крейг.
Да, полезное сообщение об ошибке было бы здорово. Я оставлю тестовую форму до тех пор, пока не увижу, что опубликованная вами проблема закрыта. Спасибо за помощь, Аарон!
Вот урезанная версия: craigattachments.com/test-form.php. Извините, что так долго, отсутствовал на обеде.