Along with the great content, that we providing to the audience of our web pages, there are particular occasions when we also need the people actually viewing the pages to take some kind of action like providing the way they see the topic, subscribe to a newsletter list, register or whatever. That's right! We are talking about some forms here – it is a great way for adding some interactivity to the page content often improving the user experience a lot.
With that, as we well know, the number of mobile devices used for accessing the Internet raises every year and at this point it is possible about half of the visits to a particular web page with an AMP Menu to be done via mobiles which means along with the great content our pages should also provide speed and stability when viewed from a device with relatively low resources, bandwidth limitations and so on. One of the approaches to achieve that (and it comes with some extras – like the pages implementing it are highly rated by Google) is using Accelerated Mobile Pages as mirrors to the regular ones we create. This way the users get access much faster even in cases of limited resources.
So we have forms we can create with HTML Form Builder on one side, and AMP – on the other, and over here we're going to take a glimpse on how the first get implemented in the second. It all pretty much narrows down to creating a regular form elements but following the strict AMP limitations and including the required custom AMP element handling them.
Now the amp-form is not an actual tag replacing some of the ones we are used to in regular HTML but rather a script component allowing the AMP pages to handle our forms as long these are consisting of the permitted by AMP components. In order to have the amp-form component working in our pages we first need to include it by placing an extra <script> tag in our page's header – like this:
<script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"></script>
If you omit that tag and do have a form on the other valid AMP page the validation will fail.
What you can and what can't have as form elements in a valid AMP page:
-  The form elements which are considered valid and therefore – allowed by AMP validation are <input type=submit>, <input type=text>, <label>, <textarea>, <option>,  <select>, <fieldset> along with the amp-selector element.
-  The forms in AMP should not have <input type=file>, <input type=password>, <input type=image> , <input type=button> and pretty much all the attributes regarding forms like formtarget, form, formmethod, formaction and so on.
These rules are rather even more strict than the regular AMP restrictions and probably will be reconsidered in the future so it might be a good idea checking the official page of AMP form restriction rules to see if any changes have been done in the process.
https://github.com/ampproject/amphtml/blob/master/validator/validator-main.protoascii
The forms working with amp-form should have either _top or _blank values of their target attribute – everything else is prohibited by the validation rules.
If your method is set to get you also would want to provide either an action or action-xhr attribute. If action is the one you would go for – do note the URL you are providing must also be https. If action-xhr is your choice (which is actually mandatory for method = "post") the form will be submitted with a XHR (or AJAX – pretty much the same thing) request and the current page will not get fully reloaded. No new page will be opened as well.
What can you do with your forms? – submit them – that's it. submit is the only action exposed by amp-form and it can be triggered by a few events – like changing the active form field or tapping on a particular link.
Once the amp form has been submitted you can send your visitors some feedback if the submission has been processed successfully or not by using the special marker attributes submit-error or submit-success. These should be assigned to the direct children of the form element and should contain an extended <template> should be included wrapping some data arranged as a valid JSON object.
After all this waterfall of technical details how nice it would be if there were some ready-made snippets for usage – isn't it? A good news - there is such thing available. So instead of creating your forms from the scratch, you could also consider taking some of the examples provided on the start page of the official AMP site which has quite a few form elements showcased along with the markup making them happen.
The amp-form  expansion admits the usage of forms to put input fields inside of an AMP  file.
The amp-form extension MUST be  activated  supposing that you're  employing <form>,  or else your  documentation  will definitely be  wrong!   Usage of input tags for  aims  apart from  sending their values (e.g. inputs  not actually  within a <form>) is  legitimate  with no loading amp-form  amplification.
<form method="post"
    action-xhr="https://example.com/subscribe"
    target="_top">
    <fieldset>
      <label>
        <span>Name:</span>
        <input type="text"
          name="name"
          required>
      </label>
      <br>
      <input type="submit"
        value="Subscribe">
    </fieldset>
    <div submit-success>
      <template type="amp-mustache">
        Subscription successful!
      </template>
    </div>
    <div submit-error>
      <template type="amp-mustache">
        Subscription failed!
      </template>
    </div>
  </form>target
The value for the target  feature  should be  possibly _ blank  or alternatively _ top.
action (optional for GET, invalid for POST)
For GET submissions, at least one of action  or else action-xhr  need to be  presented.
This  feature is  requested for method=GET. The value must be an https  WEBSITE ADDRESS and must not be a link to a CDN (does NOT  connected to https://cdn.ampproject.org). For method=POST, the action  property is  out of action,  employ action-xhr  as a substitute.
action-xhr
This  property  is simply  involved for method=POST, and is optional for method=GET.  Assuming that  produced, the form will be  provided in an XHR fashion.
An XHR request ( often times termed as an AJAX request) is where the internet browser would certainly develop the inquiry without a full load of the webpage or else launching a new webpage. Internet browsers will provide the inquiry in the background applying Fetch API if obtainable and fallback to XMLHttpRequest API for old web browsers.
The value for action-xhr  can easily be the  identical  or else a  varying endpoint  compared to action and has the same  activity  needs that were  mentioned earlier.
other form attributes
All other form properties are not required.
custom-validation-reporting (optional)
AMP Form validation allows and  chooses a  custom-made  verification reporting  practice, valid values are one of: show-first-on-submit, show-all-on-submit  or else as-you-go.
Admitted:
- Other form-related  items,  incorporating: <textarea>, <select>, <option>, <fieldset>, <label>, <input type=text>, <input type=submit>,  etc.
- amp-selector
Certainly not Enabled:
- <input type=button>, <input type=file>, <input type=image> and <input type=password>
-  A lot of the form-related  characteristics  regarding inputs  featuring : form, formaction, formtarget, formmethod and others.
( Easing several of these standards might be re-thinked eventually).
amp-form  reveals  just one  action: submit. This  permits you to  launch the form  entry on a  certain action,  for instance,  utilizing a  url, or submitting a form  regarding input change.
Amp Form presents the following activities:
- submit: Emitted whenever the form is proposed and just before the submission is accomplished.
- submit-success: Produced whenever the form submission is really worked on and the reply is a success.
- submit-error: Produced whenever the form submission is done and the result is an error.
These particular events  can certainly be  employed  with the on  characteristic.  As an example, the following  pays attention to  either submit-success and submit-error and  demonstrates  various lightboxes depending on the  circumstance.
<form ... on="submit-success:success-lightbox;submit-error:error-lightbox" ...>
</form>AMP  displays change  activities  at inputs. This allows you to  employ the on  characteristic to  do an  act on any element  as soon as an input value  updates.
For an example, a  standard use case is actually to provide a form on input change (selecting a radio switch to reply to a poll,  selecting a language from a select input to translate a  web page,  and so on).
<form id="myform"
    method="post"
    action-xhr="https://example.com/myform"
    target="_blank">
    <fieldset>
      <label>
        <input name="answer1"
          value="Value 1"
          type="radio"
          on="change:myform.submit">Value 1
      </label>
      <label>
        <input name="answer1"
          value="Value 2"
          type="radio"
          on="change:myform.submit">Value 2
      </label>
    </fieldset>
  </form>amp-form  cause three events you can track  inside of your amp-analytics config: amp-form-submit, amp-form-submit-success, and amp-form-submit-error.
You can set up your analytics to provide these particular events functioning as in the example shown below.
<amp-analytics>
  <script type="application/json">
    
      "requests": 
        "event": "https://www.example.com/analytics/event?eid=$eventId",
        "searchEvent": "https://www.example.com/analytics/search?formId=$formId&query=$formFields[query]"
      ,
      "triggers": 
        "formSubmit": 
          "on": "amp-form-submit",
          "request": "searchEvent"
        ,
        "formSubmitSuccess": 
          "on": "amp-form-submit-success",
          "request": "event",
          "vars": 
            "eventId": "form-submit-success"
          
        ,
        "formSubmitError": 
          "on": "amp-form-submit-error",
          "request": "event",
          "vars": 
            "eventId": "form-submit-error"
          
        
      
    
  </script>
</amp-analytics>The amp-form-submit  activity fires  as soon as a form  inquiry  is simply initiated. The amp-form-submit  function generates a  package of variables that  correlate to the  unique form  and also the  sectors  located in the form. These variables can be used for analytics.
For an example, the following form contains one area:
<form action-xhr="/comment" method="POST" id="submit_form">
  <input type="text" name="comment" />
  <input type="submit" value="Comment" />
</form>In case the amp-form-submit event fires, it generates the following variables  consisting of the values that  were certainly specified in the form:
-  formId
-  formFields[comment]
amp-form  helps  founders to render the  feedbacks using Extended Templates.
Employing submit-success  and also submit-error  specific  signal attributes, publishers  can certainly  note  any kind of  straight child  component of form and include a <template></template> tag  in it to  deliver the  reply in it.
The  feedback is  assumed to  be actually a  credible JSON Object.  For instance,  in the case that the  founder's action-xhr endpoint returns the  presented responses:
Success Response Rendering
"name": "Jane Miller",
  "interests": ["name": "Basketball", "name": "Swimming", "name": "Reading"],
  "email": "email@example.com"Error Response
"name": "Jane Miller",
  "message": "The email (email@example.com) you used is already subscribed."Equally success and error  responds  ought to  feature a Content-Type: application/json header. submit-success  are going to render for all responses  which  possesses a status of 2XX,  all of the  various other  conditions  are going to  deliver submit-error.
Publishers can certainly deliver these in a template inside their forms functioning as considers.
<form ...>
  <fieldset>
    ...
  </fieldset>
  <div submit-success>
    <template type="amp-mustache">
      Success! Thanks name for subscribing! Please make sure to check your email email
      to confirm! After that we'll start sending you weekly articles on #interests<b>name</b> /interests.
    </template>
  </div>
  <div submit-error>
    <template type="amp-mustache">
      Oops! name, message.
    </template>
  </div>
</form>amp-form  equally allows  founders to  direct  clients to a new  web page with AMP image once a  submitting  takes place  with AMP-Redirect-To  action header.
Consider that you 'd  in addition have to  improve your Access-Control-Expose-Headers  action header to  involve AMP-Redirect-To to the  listing of  authorized headers.
The redirect web link must be complete HTTPS URL or else AMP are going to send an error and redirection won't occur.
Determined Problem: A result of an issue in Safari iOS redirecting to deep attached URLs ( Addresses that might really finish up opening an original app) might stop working the moment the AMP data is actually set. This is actually tracked within this issue.
AMP-Redirect-To: https://example.com/forms/thank-you
Access-Control-Expose-Headers: AMP-Redirect-To, Another-Header, And-Some-Moreamp-form provide polyfills for behaviors and functionality missing from some browsers or being implemented in the next version of CSS.
Browsers that  apply webkit-based  programs do  not actually  provide  null form submissions. These  include Safari on all  systems  plus all iOS  web browsers. amp-form polyfills  this specific behavior to  stop  any sort of  null  entries and  present validation message bubbles  concerning  null  elements.
Keep in mind: Notifications are in some cases restricted to a handful of words such as " demanded field", these kinds of notices are offered by the browser utilization. We'll be dealing with permitting publisher-provided custom made verification messages along with custom-made approval UIs ( in place of the built-in/polyfill 'd bubbles).
:user-invalid/:user-valid
Such quasi classes belong the CSS Selectors 4 spec and are actually presented to empower more desirable hooks for forming invalid/valid fields founded on a few standards.
Some of the  essential differences between : invalid and : user-invalid  is simply when they are  placeded on the  feature. : user-invalid is  employed  right after a  considerable  communication  coming from the  visitor with the field (e.g. user types in a field, or blur from the field).
amp-form  grants classes ( check out  listed below) to polyfill  these types of pseudo-classes. amp-form also  provides these to ancestors fieldset-s  plus form.
The amp-form extension allows you to  create your  unique  custom-made  affirmation UI  by employing the custom-validation-reporting  characteristic  together with one the following reporting  methods: show-first-on-submit, show-all-on-submit or as-you-go.
To point out custom verification on your form:
1. Set the custom-validation-reporting  feature  at your form to  1 of the validation  revealing strategies.
2. Supply your very own approval UI increased utilizing exclusive features. AMP will certainly discover the special properties and state them at the correct time depending upon the reporting strategy you defined.
Here is actually an example:
<form method="post"
    action-xhr="https://example.com/subscribe"
    custom-validation-reporting="show-all-on-submit"
    target="_blank">
    <fieldset>
      <label>
        <span>Name:</span>
        <input type="text"
          name="name"
          id="name5"
          required
          pattern="\w+\s\w+">
        <span visible-when-invalid="valueMissing"
          validation-for="name5"></span>
        <span visible-when-invalid="patternMismatch"
          validation-for="name5">
          Please enter your first and last name separated by a space (e.g. Jane Miller)
        </span>
      </label>
      <br>
      <label>
        <span>Email:</span>
        <input type="email"
          name="email"
          id="email5"
          required>
        <span visible-when-invalid="valueMissing"
          validation-for="email5"></span>
        <span visible-when-invalid="typeMismatch"
          validation-for="email5"></span>
      </label>
      <br>
      <input type="submit"
        value="Subscribe">
    </fieldset>
  </form>For  approval  text messages,  in case your element  features no text  web content  within, AMP  will certainly fill it out  together with the  internet browser's default  approval message.  Here in the example above, when the name5 input  is undoubtedly  clear and  verification  is simply  started ( such as,  client  aimed to  affirm the form) AMP  will certainly fill <span visible-when-invalid="valueMissing" validation-for="name5"></span> <span visible-when-invalid = "valueMissing" validation-for = "name5" > with the  web browser's  verification  notification and  demonstrate  this span to the  site visitor.
Establish  1 of the following reporting  choices for the custom-validation-reporting attribute:
The show-first-on-submit reporting option mimics the  web browser's default behavior  once default validation  starts. It  demonstrates the  initial  verification  glitch it  discovers and stops there.
The show-all-on-submit reporting possibility demonstrates all approval errors upon all null inputs as soon as the form is forwarded. This is handy if you 'd like to reveal a summary of recognitions.
The as-you-go reporting opportunity helps your visitor to see approval notifications as they are actually interacting with the input. For some example,  supposing that the user writes an invalid mail address, the customer will see the error immediately.  The minute they fix the value, the error leaves.
This particular component is still experimental, and so you ought to permit the experiment to operate form confirmation.
HTML5  approval supplies feedback established purely on related information easily available on the web page, such as if a value matches a certain style. With amp-form  affirmation you have the ability to present the user response that HTML5  affirmation on its own can not really. For example, a form can certainly utilize affirmation to check out if an email address has definitely been registered.  One more use-case is determining that a city field and a zip code field match each other.
Here's an example:
<h4>Verification example</h4>
<form
  method="post"
  action-xhr="/form/verify-json/post"
  verify-xhr="/form/verify-json/post"
  target="_blank"
>
    <fieldset>
        <label>
            <span>Email</span>
            <input type="text" name="email" required>
        </label>
        <label>
            <span>Zip Code</span>
            <input type="tel" name="zip" required pattern="[0-9]5(-[0-9]4)?">
        </label>
        <label>
            <span>City</span>
            <input type="text" name="city" required>
        </label>
        <div class="spinner"></div>
        <input type="submit" value="Submit">
    </fieldset>
    <div submit-success>
        <template type="amp-mustache">
            <p>Congratulations! You are registered with email</p>
        </template>
    </div>
    <div submit-error>
        <template type="amp-mustache">
            #verifyErrors
                <p>message</p>
            /verifyErrors
            ^verifyErrors
                <p>Something went wrong. Try again later?</p>
            /verifyErrors
        </template>
    </div>
</form>
The form sends a `__amp_form_verify` field as part of the form data to let the server know the request is a verify request and not a formal submit.Here is actually just how an error feedback should seek confirmation:
"verifyErrors": [
    "name": "email", "message": "That email is already taken.",
    "name": "zip", "message": "The city and zip do not match."
  ]amp-form  empowers  system  adaptable  alternatives for inputs that are  concealed and  which have the data-amp-replace  feature. On  every form submission , amp-form  identifies all input [type= hidden] [data-amp-replace]  within the form and  utilizes variable  replacements to its value  feature and  switches it with the result of the  replacement.
You  ought to  deliver the variables you are using for each  replacement on  each and every input  through  defining a space-separated string of the variables used in data-amp-replace ( observe example  listed here). AMP will not  change variables  which are not  clearly  determined.
Here's an illustration of precisely how inputs are just before and after substitutions (note that you must employ system syntax of variable changes and not analytics ones):
<!-- Initial Load -->
<form ...>
  <input name="canonicalUrl" type="hidden"
        value="The canonical URL is: CANONICAL_URL - RANDOM - CANONICAL_HOSTNAME"
        data-amp-replace="CANONICAL_URL RANDOM">
  <input name="clientId" type="hidden"
        value="CLIENT_ID(myid)"
        data-amp-replace="CLIENT_ID">
  ...
</form>When the user considers to submit the form, AMP  will definitely aim to deal with the variables and improve the fields' value  characteristic of all fields with the relevant alternatives.  Regarding XHR  submittings,  all of the variables are likely to become replaced and settled .  Yet, in non-XHR GET submissions, values that necessitates async-resolution might not be accessible because of having not been resolved before. CLIENT_ID,  for example, would certainly not resolve,  supposing that it wasn't  worked out and cached earlier.
<!-- User submits the form, variables values are resolved into fields' value -->
<form ...>
  <input name="canonicalUrl" type="hidden"
        value="The canonical URL is: https://example.com/hello - 0.242513759125 - CANONICAL_HOSTNAME"
        data-amp-replace="CANONICAL_URL RANDOM">
  <input name="clientId" type="hidden"
        value="amp:asqar893yfaiufhbas9g879ab9cha0cja0sga87scgas9ocnas0ch"
        data-amp-replace="CLIENT_ID">
    ...
</form>Note  precisely how CANONICAL_HOSTNAME  mentioned above did not get  switched out because it was  not really in the whitelist through data-amp-replace  feature on the  primary field.
Apart from keeping the information within the AMP CORS specification, please provide extra care to the area on "Verifying state changing requests" to preserve against XSRF attacks precisely where an attacker are able to implement unauthorized commands using the recent user session free from the user expertise.
Generally, take note the following aspects when approving input from the visitor:
- Only apply POST for state altering asks.
- Utilize non-XHR GET for navigating objectives only, e.g. Search.
* non-XHR GET demands are not planning to gain precise origin/headers and backends won't have the capacity to guard against XSRF along with the aforementioned feature.
* Generally work with XHR/non-XHR GET asks for navigational or else information retrieval only.
- non-XHR POST  inquiries are not actually allowed in AMP  files. This is due to inconsistencies of determining Origin header on these inquiries across browsers. And the issues  assisting it would certainly present in protecting from XSRF. This might possibly be rethinked and presented after.
So that's generally the way the form elements come to take place in the AMP pages we are about to create. It's not the simplest process out there but still, it is a way combining the so needed interactive functionality with what Google claims to be the next speed up standard in the world of web. Luckily there are some ready-made snippets and templates out there which could eventually make the process easier.