В интернет-магазине корзина находится на странице /cart_items.
Для изменения состава корзины предусмотрено три операции:
Все операции, меняющие состав корзины, осуществляются путем отправления POST запроса на URL /cart_items. Можно ограничиться обычными html формами, можно манипулировать корзиной при помощи ajax запросов, для этого надо использовать URL /cart_items.json. Содержание запросов не зависит от того, каким из двух способов вы работаете с корзиной.
Если вы используете html форму, то после выполнения операции покупатель будет перенаправляться на страницу корзины.
Параметры запроса:

Если вы используете ajax запрос, то вам вернут объект в JSON формате с атрибутами:
        
          /* Пример на jQuery */
$.post('/cart_items.json', {
    variant_id: 104490412,
    quantity: 1,
    comment: "test comment"
  })
  .done(function (cart) {
    console.log(cart);
  })
        
      
    Параметры запроса:
Если вы используете ajax запрос, то вам вернут объект в JSON формате с атрибутами:
        
          /* Пример на jQuery */
$.post('/cart_items.json', {
  variant_ids: {
    98156648: 1,
    98156640: 2
    }
  })
  .done(function (cart) {
    console.log(cart);
  })
        
      
    URL запроса: /cart_items/id
где id - идентификатор модификации
Параметры запроса:
Если вы используете ajax запрос, то вам вернут объект в JSON формате с атрибутами:
        
          /* Пример на jQuery */
$.post('/cart_items/98156178.json', {
    _method: "delete"
  })
  .done(function (cart) {
    console.log(cart);
  })
        
      
    Позволяет одновременно добавлять и удалять позиции, так же позволяет менять количество заказываемых товаров.
Параметры запроса:
Если в количестве указан 0, то модификация удаляется из корзины.
Если вы используете ajax запрос, то вам вернут объект в JSON формате с атрибутами:
        
          <form action="/cart_items" id="cartform" method="post">
  <input type="hidden" value="put" name="_method">
  <table>
  {% for item in cart.items %}
    <tr>
      <td><a href="{{ item.product.url }}">{{ item.title | escape }}</a></td>
      <td><input type="text" value="{{ item.quantity }}" name="cart[quantity][{{ item.id }}]"/><td>
      <td><input type="text" value="{{ item.comment }}" name="cart[order_line_comments][{{ item.id }}]"/><td>
   </tr>
  {% endfor %}
  </table>
</form>
        
      
    
        
          /* Пример на jQuery */
$.post('/cart_items.json', {
    _method: 'PUT',
    cart: {
      quantity: {
      109715042: 1
    }
  } 
})
.done(function (cart) {
  console.log(cart);
})
// или
$.post('/cart_items.json', $('#cartform').serialize())
  .done(function (cart) {
    console.log(cart);
  })
// Сериализованные данные _method=PUT&cart%5Bquantity%5D%5B104490412%5D=1
        
      
    /products_by_id/{id через запятую}.json
Позволяет получить данные о товарах по заданным ID. Можно использовать для вывода последних просмотренных товаров (предварительно записав их ID в cookie), можно - для вывода "отложенных" товаров и т.д.
        
          /* Пример на jQuery */
$.getJSON('/products_by_id/62898073,62898075.json')
  .done(function (product) {
    console.log(product);
  })
        
      
    {product.url}.json
Позволяет получить данные о товарe по заданному url.
        
          /* Пример на jQuery */
$.get('/product/test.json')
  .done(function (product) {
    console.log(product);
  })
        
      
    /collection/{пермалинк категории}.json
Позволяет динамически получить данные о товарах по заданным фильтрам, с постраничной навигацией.
Полезно если нужно получить данные о большом количестве товаров, если одновременная их загрузка делает страницу слишком "тяжелой". Например, для динамической подгрузки новых товаров при прокрутке страницы.
        
          /* Пример на jQuery */
$.post('/collection/all.json', {
    characteristics: [12911178, 12911180]
  })
  .done(function (products) {
    console.log(products);
  })
        
      
    /client_account/contacts.json
При получении GET-запроса выдает данные о зарегистрированном покупателе:
| id | идентификатор | |
| fields_values | доп. поля покупателя | |
| name | Имя | |
| surname | Фамилия | |
| middlename | Отчество | |
| email | контактный e-mail | |
| phone | телефон | |
| registered | зарегистрирован (всегда вернет истину, GET-запрос к этому json если покупатель не зарегистрирован вернет ошибку) | |
| subscribe | подписан/не подписан на новости | |
| created_at | когда зарегистрирован | |
| updated_at | когда последний раз изменен | |
| bonus_points | кол-во бонусных баллов (на тарифах от Бизнес) | |
| client_group_id | ID группы покупателя | |
| ip_addr | IP-адрес | |
| default_address | адрес доставки | |
| orders_count | кол-во оформленных заказов | 
        
          $.getJSON('/client_account/contacts.json', function(contacts) {
    console.log(contacts);
});
        
      
    /client_account/feedback.json
JSON, принимающий POST для отправки сообщения через форму обратной связи. Принимает поля:
        
          $.post('/client_account/feedback.json', {
  feedback: {
    from: 'from@mail.ru',
    name: 'Антон',
    phone: '+7 (111) 111 11 11',
    subject: 'Обратная связь',
    content: 'Хочу заказать у вас индивидуальный дизайн сайта!'
  }
}).done(function (done) {
  console.log(done);
});
        
      
    /compares.json
В ответ приходит массив товаров добавленых в сравнение. 
Если товаров в сравнении нет, массив будет пуст.
        
          $.getJSON('/compares.json')
    .done(function (compares) {
      console.log(compares.products);
    })
    .fail(function (response) {
      console.log('Что то пошло не так!');
    });
        
      
    /compares.json
Параметры:
        
          $.post('/compares.json', {
    'product[id]': 63356901
  })
  .done(function () {
    console.log('Добавлено в сравнение');
  })
  .fail(function (response) {
    console.log('Что то пошло не так!');
  });
        
      
    /compares/{product.id}.json
Параметры:
        
          $.post('/compares/63356901.json', {
    _method: 'delete'
  })
  .done(function () {
    console.log('Удалено из сравнения');
  })
  .fail(function (response) {
    console.log('Что то пошло не так!');
  });
        
      
    Создание заказа в данном случае можно осуществить, отправив POST-запрос с определенными полями на /fast_checkout.json.
В ответ этот JSON выдает номер заказа, ключ, id и другие данные, которые могут быть нужны для отправки в партнерские сети и другие внешние системы.
Принимает все те же поля, что и оформление заказа, т.е.:
| client[email] | e-mail покупателя | 
| client[name] | имя покупателя | 
| client[phone] | телефон (если в настройках поля включена проверка формата, то она будет действовать и при оформлении заказа через fast_checkout.json), обязательное поле | 
| order[delivery_variant_id] | id способа доставки (можно взять шаблонизатором через массив account.delivery_variants), обязательное поле | 
| order[payment_gateway_id] | id способа оплаты (можно взять шаблонизатором через массив account.payment_gateways), обязательное поле | 
Все собственные поля, созданные в разделе Настройки - Оформление заказа также можно отправить. Но их нельзя взять шаблонизатором, это значит что прописывать их в форме для fast_checkout нужно жестко с использованием их идентификаторов. Привязка способов оплаты к способам доставки также учитывается, т.е. если отправить в форме способ оплаты, который не привязан к отправленному вместе с ним способу оплаты, то заказ создан не будет.
Привязка способов доставки к регионам так же действует при таком оформлении заказа.
Все поля, отмеченные в разделе Настройки - Оформление заказа как обязательные, являются обязательными и в случае оформления заказа через fast_checkout.
Помимо описанных полей на оформление заказа также будет отправлена вся покупательская корзина. Поэтому если она пуста, то следует отправить в нее товар до отправки формы быстрого заказа.
Для создания заказа требуется хотя бы один товар, способ доставки, способ оплаты и заполнение всех полей, указанных как обязательные (по умолчанию это имя покупателя и телефон).
        
          $.post('/fast_checkout.json', {
    client: {
      email: 'client@mail.ru',
      name: 'Антон',
      phone: '+7 (111) 111 11 11'
    },
    order: {
      delivery_variant_id: 123456,
      payment_gateway_id: 123456
    }
  })
  .done(function (response) {
    if (response.status == 'ok') {
      console.log(response);
    } else {
      console.log(response);
    }
  })
  .fail(function (fail) {
    console.log(fail);
  })
        
      
    Пример для ознакомления.
Для автокомплита результатов используется плагин: jquery.autocomplete.js.
CSS прописывается по вкусу.
/search_suggestions.jsonПараметры:
        
          <form action="/search" method="get" class="search-form">
  <input name="q" type="text" placeholder="поиск" class="search-input js-search-input">
  <div class="autocomplete-suggestions"></div>
</form>
<script type="text/javascript">
jQuery(document).ready(function($) {
  //Поиск
  $('.js-search-input').autocomplete({
    serviceUrl: '/search_suggestions',
    onSelect: function (suggestion) {
      window.location.href = '/product_by_id/' + suggestion.data;
    },
    params: {
      account_id: {{ account.id }},
      locale:'{{ language.locale }}',
      hide_items_out_of_stock: true
    },
  });
});
</script>
        
      
    /search и /search.json для ajax запросов
Для поиска нужно передать гет параметр q, значением которого будет искомая фраза
например /search?q=товар
        
          <form action="/search" method="get">
  <input type="hidden" name="lang" value="{{ language.locale }}">
  <input type="text" name="q" value="" placeholder="Поиск"/>
  <button type="submit">Поиск</button>
</form>
        
      
    
        
          $.get('/search.json', {q: 'товар'}, function(products) {
  console.log(products);
});