Сайт и интернет-магазин «Альфа Мотор Групп»

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

Фреймворк Yii идеально вписался в подобные требования. С одной стороны, он позволял создать максимально удобные как для пользователя, так и для контент-редактора интерфейсы. С другой стороны — позволял снизить стоимость владения и повысить гибкость обслуживания за счет широкой известности в среде разработчиков.

В реализованном сайте отсутствует «админка» в классическом понимании этого слова. Пользователи с правами контент-редактора могут менять тексты прямо на сайте — режим редактирования включается двойным кликом по нужному блоку. Новые страницы создаются по принципу wiki — вызовом нужного URL и редактирования пустой страницы.

Альфа Мотор Групп

Огромные и крайне важные элементы — каталог запчастей и процедура получения и обработки заказов. В связи с тем, что на момент старта проекта товарная номенклатура на стороне заказчика уже была реализована на «1С», было решено ее не дублировать и использовать имеющуюся.

Полные дампы каталога выгружаются с серверов заказчика в XML, а на стороне сайта загружаются парсером во временную таблицу. После чего, с помощью хранимых процедур БД (написанных на PL/pgSQL), корректируются основные данные. Применение хранимых процедур обеспечило приемлемую скорость этой операции.

Корректировка базы, а также передача информации о заказах и процессе их выполнения происходит в реальном времени — при помощи SOAP. Откровенно говоря, нам пришлось потратить достаточно сил и времени, чтобы найти общий язык с «1С». А с учетом сложной распределенной ИТ-инфраструктуры заказчика, пришлось также предусмотреть возможность обмена информации посредством XML-файлов, выкладываемых на FTP.

Традиционно все артикулы запчастей для автомобилей «Тойота» и «Лексус» состоят из двух частей, разделенных дефисом. После того, как магазин был уже открыт, оказалось, что менеджеры привыкли искать запчасти без дефиса. Тут нас весьма выручил PostgreSQL — индекс по выражению позволил исключить дефис из поиска без создания дополнительных колонок, обвешанных триггерами.

Но, конечно, львиная доля работы пришлась на фронт-енд. Банальные, на первый взгляд, действия, вроде «добавить товар в корзину», были полностью переосмыслены — ведь нужно было сделать так, чтобы работа с магазином доставляла удовольствие как розничным покупателям, так и оптовикам.

Перенос товаров в корзину реализован без разделителей — то есть, если пользователь вводит в столбик «количество» цифру «5», товар сразу попадает в корзину, а итоговая сумма заказа корректируется с учетом изменений. Чтобы не дергать сервер на каждое такое действие, изменение корзины записывается в куках, и для зарегистрированных пользователей синхронизируется с сервером при переходе на любую другую страницу.

Довольно много пришлось потрудиться над мелочами, о которых обычно никто и не думает. К примеру, валидацией на JavaScript при вводе данных уже никого не удивишь. Однако, как правило, такие проверки ставят либо на нажатие клавиши, либо на изменение поля ввода. Первый вариант плох тем, что сообщение об ошибке выдается еще до того, как пользователь заполнил поле (что может его смутить и сбить с процедуры ввода). Второй вариант хорош всем, кроме того, что заставляет пользователя вновь и вновь возвращаться к полям, которые он уже заполнил. Иными словами, заполнив поле, пользователь переводит взгляд на кнопку «Готово», берет мышку и нажимает на эту кнопку. В этот момент фокус внимания уже уходит с заполнявшегося поля, а сообщение об ошибке заставляет его возвращаться обратно. Мелочь, но раздражает. Особенные неудобства это доставляет, если хочется сделать кнопку в конце формы неактивной до тех пор, пока пользователь не заполнит все поля.

Думаем, экспериментируем и находим решение, близкое к идеальному (увы, пока еще не на 100%). Оставляем проверку на изменение (если пользователь пользуется клавиатурой) и устанавливаем проверку поля на движение мышки. Стоит пользователю прекратить ввод и взяться за мышку — подсказка об ошибке уже появляется.