Сохраняйте данные формы после ошибок в базовой контактной форме Shopify

Я добавил базовую контактную форму, как описано в документации Shopify.

Мой код:

{% form 'contact' %}

{% if form.posted_successfully? %}
<div class="successForm feedback">
  <p>Thanks for contacting us. We'll get back to you as soon as possible.</p>
</div>
{% endif %}

{% if form.errors %}
<div class="errorForm feedback">
  <p>Sorry, we were unable to submit your inquiry because it contained {{ form.errors | size | pluralize: 'an error', 'a few errors' }}.<br/>Please correct the following and submit again:</p>
  {% for field in form.errors %}
  <p><strong>The {{ field | capitalize | replace: 'Body', 'Comments / questions' }} field {{ form.errors.messages[field] }}.</strong></p>
  {% endfor %}
</div>
{% endif %}

<div id="contactFormWrapper">
  <h3>Personal details</h3>
  <ul>
    <li>
      <label>First name:</label>
      <input type="text" id="contactFormFirstName" name="contact[first-name]" placeholder="" />
    </li>
    <li>
      <label>Last name:</label>
      <input type="text" id="contactFormLastName" name="contact[last-name]" placeholder="" />
    </li>          
    <li>
      <label>Email address:</label>
      <input type="email" id="contactFormEmail" name="contact[email]" placeholder="" />
    </li>
    <li>
      <label>Telephone number:</label>
      <input type="telephone" id="contactFormTelephone" name="contact[phone]" placeholder="" />
    </li>
    <li>
      <label>City:</label>
      <input type="text" id="contactFormCity" name="contact[city]" placeholder="" />
    </li>
    <li>
      <label>Country:</label>
      <input type="text" id="contactFormCountry" name="contact[country]" placeholder="" />
    </li>
  </ul>
  <h3>Items</h3>
  <ul>
    <li>
      <label>Items:</label>
      <input type="text" id="contactFormItems" name="contact[items]" placeholder="" />

    </li>
    <li>
      <label>Questions:</label>
      <textarea rows="10" id="contactFormComments" name="contact[body]" placeholder=""></textarea>
    </li>
  </ul>
  <div class="clearfix"></div>
  <div class="main-button-container">
    <input type="submit" id="contactFormSubmit" value="Submit Enquiry" class="btn button-style" />
  </div>
</div>

{% endform %}

Однако, если пользователь пытается отправить форму, но заполняет ее неправильно, страница обновляется с сообщением об ошибке и очищает все данные. Это не идеально с точки зрения взаимодействия с пользователем, так как пользователю приходится вводить все заново.

Как я могу сохранить все предыдущие данные заполненными после ошибки формы? Пожалуйста помоги.


person user1794295    schedule 14.05.2013    source источник


Ответы (2)


Вы можете отобразить отправленные данные, используя атрибут value. Например:

<input type="text" id="contactFormEmail" name="contact[email]" value="{{form.email}}" />

Или для textarea:

<textarea id="contactFormComments" name="contact[body]">{{form.body}}</textarea>
person hjblok    schedule 15.05.2013
comment
Как насчет выбора параметров? - person Robaggs; 25.05.2016

Я знаю, что это старое сообщение, но я хотел оставить его здесь на случай, если оно кому-то (например, мне) понадобится в будущем. {{ form.email }} и {{ form.body }} — единственные теги, которые будут работать таким образом — для полей электронной почты и тела сообщения. Если вам нужно получить данные для других настраиваемых полей, вам нужно использовать небольшой хак.

Когда форма возвращается с ошибкой, данные из отправленных полей доступны в строке запроса страницы. Существует отличная статья от FreakDesign, который показывает, как использовать это в своих шаблонах.

Тем не менее, мне пришлось немного настроить его для использования с контактной формой Shopify. Вот что сработало для меня:

{% comment %}
    IF THE FORM THROWS ERRORS, POPULATE THE FORM FIELDS WITH DATA FROM THE QUERY STRING
    NOTE: To use the `{% if form.errors %}` statement below, you must place this code within the `{% form 'contact' %}` tag.
{% endcomment %}
{% if form.errors %}

    {%- comment -%}

        Liquid by Jason @ freakdesign.
        Questions? Ping me on twitter: @freakdesign

        Relates to blog post:
        http://freakdesign.com.au/blogs/news/get-the-url-querystring-values-with-liquid-in-shopify

        Example:
        https://jasons-experiments.myshopify.com/collections/all/products/3-4-sleeve-kimono-dress-coral-1?ref=freakdesign&cache=false

    {%- endcomment -%}

    {%- comment -%} Capture the content for header containing the tracking data {%- endcomment -%}
    {%- capture contentForQuerystring -%}{{ content_for_header }}{%- endcapture -%}

    {% comment %} Use string splitting to pull the value from content_for_header and apply some string clean up {% endcomment %}
    {%- assign pageUrl = contentForQuerystring | split:'"pageurl":"' | last | split:'"' | first | split:'.myshopify.com' | last |
        replace:'\/','/' |
        replace:'%20',' ' |
        replace:'\u0026','&' |
        replace:'%5B','[' |
        replace:'%5D',']' |
        replace:'+',' '
    -%}
    {% assign debug = false %}
    {%- for i in (1..1) -%}
        {%- comment -%} If the string doesn't contain a ? then we have no querystring. Go no further {%- endcomment -%}
        {%- unless pageUrl contains "?" -%}{% break %}{%- endunless -%}

        {%- comment -%} Split the url at the ? to get all values after it {%- endcomment -%}
        {%- assign pageQuerystring = pageUrl | split:'?' | last -%}

        {%- comment -%} Split the remaining string at & to get the list of keys and values (if any) {%- endcomment -%}
        {%- assign parts = pageQuerystring | split:'&' -%}

        {% assign formFirstName = '' %}
        {% assign formLastName = '' %}
        {% assign formPhone = '' %}
        {% assign formMethod = '' %}
        {% assign formReason = '' %}

        {%- comment -%} Loop over them... {%- endcomment -%}
        {%- for part in parts -%}

            {%- comment -%} Split the part at the =. Not all querystrings will be in pairs so we need to account for that {%- endcomment -%}
            {%- assign keyAndValue = part | split:'=' -%}

            {%- if keyAndValue.size > 1 -%}
                {%- if debug -%}
                    <!--
                    key: {{ keyAndValue[0] }}<br>
                    value: {{ keyAndValue[1] }}
                    -->
                {% endif %}

                {% case keyAndValue[0] %}

                    {% when 'contact[First Name]' %}
                    {% assign formFirstName = keyAndValue[1] %}

                    {% when 'contact[Last Name]' %}
                    {% assign formLastName = keyAndValue[1] %}

                    {% when 'contact[Phone Number]' %}
                    {% assign formPhone = keyAndValue[1] %}

                    {% when 'contact[Preferred Method Of Communication]' %}
                    {% assign formMethod = keyAndValue[1] %}

                    {% when 'contact[Reason For Inquiry]' %}
                    {% assign formReason = keyAndValue[1] %}

                {% endcase %}

            {%- else -%}
                {%- if debug -%}
                    <!--
                    value: {{ keyAndValue }}
                    -->
                {%- endif -%}
            {%- endif -%}

        {%- endfor -%}
    {%- endfor -%}

{% endif %}

Работает как шарм. Надеюсь, это поможет!

person Boots    schedule 23.06.2017