Разбор · Сайт кондитерской · Самара

«ТОРТ по любви»

Сайт свадебных тортов на заказ для кондитерской из Самары. Человек смотрит работы, начинки и цены и оставляет заявку на торт или дегустацию — заявка сохраняется на хостинге и приходит в Telegram.

Клиент
Кондитерская «ТОРТ по любви», Самара
Сроки
22 августа — 16 сентября 2026,
37 коммитов
Стек
HTML, CSS, JS без сборщика · PHP · Telegram Bot API · GitHub Actions
Ссылки
asiyatort.ru ↗
код на GitHub ↗

Первый экран, ширина 1440px.

Телефон, 393px.

Заявка на телефоне.

01

Для кого и зачем

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

В сентябре появилось ещё одно требование: персональные данные клиентов должны храниться в России. Поэтому сайт переехал с GitHub Pages на домен asiyatort.ru и российский хостинг, а заявки стал принимать собственный обработчик на PHP.

02

Что сделано

  1. Первый экран«Торт, который стоит увидеть прежде, чем съесть», кнопки «Заказать торт» и «Записаться на дегустацию»
  2. Знакомство с кондитеромистория мастера её словами и портрет
  3. Кредокороткое обещание про свадебный торт как финал торжества
  4. Наши работынастоящие торты вместо шаблонных карточек
  5. Как проходит заказчетыре шага от первого сообщения до торта на площадке, эскиз входит в стоимость
  6. Начинкисемь вкусов
  7. Ценыторты по весу с учётом декора, дегустация и доставка, кнопки «В корзину»
  8. Торты на годовщинуотдельное предложение не только к свадьбе
  9. Заявкавкладки «Заказать торт», «Дегустация» и «Доставка»
  10. Отзывы и галереякадры со свадеб и отзывы в одной кладке
  • ВёрсткаHTML, CSS и JS без сборщика. Цвета и шрифты — в одном файле токенов (tokens.css): Cormorant Garamond, Jost и рукописный Marck Script для «по любви».
  • ЗаявкиДве формы — на торт и на дегустацию — с фото-референсами и скрытым полем-ловушкой от спама. Обработчик на хостинге пересылает их в Telegram.
  • Отдельные страницыОформление заказа из корзины, публичная оферта и политика обработки персональных данных.
  • ПоискЦены в статичном HTML, разметка schema.org (Bakery, OfferCatalog, WebSite), robots.txt, sitemap.xml, canonical и og-теги; сайт подтверждён в Яндекс Вебмастере.

03

Решения, на которые стоит посмотреть

  • Заявка не теряется, даже если Telegram не ответил

    Заявка сначала записывается и только потом отправляется в Telegram. Если отправка сорвалась, имя и телефон клиента уже сохранены, а следующая заявка заодно пробует дослать недоставленные. Ответ сайта различает три исхода: доставлено; не доставлено, но сохранено; не сохранено — и только в последнем случае человеку предлагается запасной путь через сообщество ВКонтакте.

    Сначала это делал воркер Cloudflare. После переезда на российский хостинг ту же схему повторяет обработчик на PHP: запись на диск, потом Telegram, потом досылка.

  • От онлайн-оплаты отказались в пользу заявки

    Сначала на сайте были корзина и оплата по схеме ЮKassa в демо-режиме. Сумму считал сервер по своему каталогу, а браузер передавал только товары и количество — подменить цену в запросе было нельзя.

    Потом от оплаты на сайте отказались: расчёт идёт переводом на карту или наличными. Кнопка «Оплатить» и клиентский код платежа убраны, корзина теперь отправляет обычную заявку тем же путём, что и формы на главной, а e-mail перестал быть обязательным — он был нужен только для чека.

  • Мобильная вёрстка: поломки, которых не видно на компьютере

    Блоки вылезали за правый край на 32px на всех ширинах: при выносе токенов в отдельный файл пропал общий сброс box-sizing, а overflow-x: clip прятал вылет так, что проверка «есть ли горизонтальная прокрутка» молчала. Нашлось по скриншоту — переключатель форм был обрезан справа.

    Там же: текст в полях ввода поднят с 15,5 до 16px, потому что на меньшем размере iOS Safari увеличивает страницу при фокусе. У кнопок, вкладок и ссылок в подвале появилась минимальная зона нажатия 44px.

  • Галочка согласия не ставилась на ширине 393px

    Форма молча не отправлялась: галочка согласия не вставала. Причина — прошлая правка зон нажатия. Ссылка на политику стояла внутри подписи, её зона была раздута до 30px при высоте строки 17px и наезжала на соседние строки — Chromium притягивал касание к ссылке. На 360 и 375px всё работало, это зависело от переноса строк.

    Ссылку вынесли из предложения на отдельную строку со своей зоной 44px, подпись целиком принадлежит галочке. Проверено касаниями в шесть точек подписи на каждой ширине.

  • Редактор сайта — в том же Telegram-боте

    Бот, который приносит заявки, умеет менять содержимое сайта через меню на кнопках: 40 текстовых полей, 6 ссылок и 14 мест под фото — контакты, названия и цены, отзывы, подписи разделов. Доступ только у владельца.

    Исходные тексты остаются в HTML, бот хранит только правки поверх них, и страница подставляет их при загрузке. Поэтому недоступный сервер не оставляет пустых мест, а поисковики видят настоящий текст. После переезда правки по-прежнему хранятся на прежнем сервере, но данные из форм туда больше не уходят.

  • Фотографии со свадеб: из 19,1 МБ в 2,4 МБ

    Четырнадцать исходных снимков весили 19,1 МБ, один PNG — 5,8 МБ. Скрипт на PowerShell готовит из каждого две копии: 800px для плиток и 1600px для просмотра во весь экран, разворачивает кадры по EXIF и записывает размеры в манифест. В сетку браузер по srcset берёт только лёгкие копии, а width и height заранее резервируют место — плитки не прыгают при загрузке.

  • Переезд на свой домен и выкладка без ручной загрузки

    Сайт переехал на asiyatort.ru и хостинг REG.RU. После пуша в main GitHub Actions выкладывает файлы по FTPS — пароль не идёт открытым текстом, доступы лежат в секретах репозитория, а сама выкладка включается переменной DEPLOY_ENABLED. Исходники прежнего сервера, служебные скрипты и демо-оплата на хостинг не попадают.

    После переезда нашлась ещё одна деталь: PHP видит несколько файлов только под именем refs[], а форма отправляла refs, и фото-референсы не доходили. Теперь обработчик понимает оба варианта и отмечает в заявке фото, которые не загрузились.

04

Как проверить

Связь со мной

Есть задача?
Пиши.