Разработка сайта “КЭМП”

Компания ЗАО «КЭМП» занимается продажей огнеупорных материалов высокого качества оптом и в розницу с прямыми поставками по России и со склада в Москве. Приоритетом компании является оперативное и качественное обслуживание, низкие цены и высококвалифицированная техническая поддержка. (новый сайт в процессе переноса, указан основной домен, тестовый домен - 4119981.ru)
Перейти на сайт
Кейс КЭМП

Предыстория

В работу поступил заказ от коммерческой организации. В заказе имелся готовый дизайн будущего сайта. Нужно было сделать новый интернет-магазин для компании взамен старому. Акцент ставился на возможности заказчику самостоятельно вносить правки на сайт, а также, чтобы сайт был интуитивно понятным и дружелюбным для посетителей.
Разработка сайта
Дополнительное программирование
Адаптивная верстка под мобильные устройства
Фиксированный сайдбар
Прокрутка меню к текущей категории товаров
Поиск товаров
Реализация печати карты через клик
Копирование контактов одним кликом
Возможность администратору сайта менять порядок блоков и постов без кода
Вывод информации о скачиваемом файле (формат, размер)
Адаптивные таблицы
Блог

Описание этапов работы

На стадии планирования было решено подключать плагин WooCommerce для каталога, так как на сайте будет находится большое количество категорий и подкатегорий, а также должен работать поиск по товарам. Для поиска товаров был выбран плагин FiboSearch – Ajax Search for WooCommerce.

Среди нестандартных задач необходимо было сделать фиксированный в левой части сайдбар с категориями товаров, которые при клике раскрывали бы свои подкатегории. Для этой задачи хорошо подошел плагин YITH WooCommerce Category Accordion.

Сайдбар должен был присутствовать на всех страницах сайта и быть расположен между шапкой и подвалом. Для этого понадобилось узнать высоту шапки и вычесть ее из высоты экрана – height: calc(100vh — 131px). Для самого сайдбара было прописано свойство – position: sticky.

В процессе работы над сайтом от заказчика поступило пожелание, чтобы при переходе в категорию товаров, которая находилась внизу списка, сайдбар автоматически прокручивался вверх. Для решения этой задачи я написал скрипт:

const leftMenuWrapper = document.querySelector('.sidebar-wrapper');
const leftMenuCurrentItem = document.querySelector('.sidebar .current-menu-item');

if (leftMenuCurrentItem) {
setTimeout( () => {
leftMenuWrapper.animate({
scrollTop: leftMenuCurrentItem.getBoundingClientRect().top — 139
});
}, 1000);
}

На странице с ГОСТами и ТУ был список, у которого заголовок состоял из двух частей. В левой части был номер ГОСТа, а в правой его название. По дизайну текст в левой части должен быть темного цвета, а в правой синим. Но название подтягивалось из самого поста, это осложняло задачу стилизации элемента. Поэтому было решено написать регулярное выражение, которое отделяет текст после цифр и оборачивает его в тег <span>. После чего элемент можно легко стилизовать.

const gostTitles = document.querySelectorAll('.gost-page__item-title');

gostTitles.forEach( (e) => {
let text = e.innerHTML;
text = text.replace(/(\d+-\d+ )(\W+)/, ‘$1 <span>$2</span>’);
e.innerHTML = text;
});

Одним из требований заказчика было возможность копирования контактной информации через клик. Для этого был написан очередной скрипт.

const copyAddresses = document.querySelectorAll('.copy-button');

copyAddresses.forEach( (e) => {
e.addEventListener(‘click’, function(event) {
handleCopyTextFromParagraph();

function handleCopyTextFromParagraph() {
const cb = navigator.clipboard;
const paragraph = e.previousElementSibling;
cb.writeText(paragraph.innerText);
}
});
});

Также заказчик хотел, чтобы схему проезда можно было распечатать через клик.

const printBtns = document.querySelectorAll('.mobile-location__button');

printBtns.forEach( (e) => {
e.addEventListener(‘click’, function() {
const iframe = document.createElement(‘iframe’);

// Make it hidden
iframe.style.height = 0;
iframe.style.visibility = ‘hidden’;
iframe.style.width = 0;

// Set the iframe’s source
iframe.setAttribute(‘srcdoc’, ‘<html><body></body></html>’);

document.body.appendChild(iframe);

iframe.addEventListener(‘load’, function () {
// Clone the image
const image = document.getElementById(‘mobile-location__img’).cloneNode();
image.style.maxWidth = ‘100%’;

// Append the image to the iframe’s body
const body = iframe.contentDocument.body;
body.style.textAlign = ‘center’;
body.appendChild(image);

image.addEventListener(‘load’, function() {
// Invoke the print when the image is ready
iframe.contentWindow.print();
});
});
});
});

Еще одним пожеланием заказчика было возможность менять местами блоки на главной странице и при необходимости отключать вывод блока. Например, секцию с преимуществами сейчас необходимо переместить сразу после первого экрана, а блок о компании мы хотим видеть ближе к подвалу сайта, при этом секция с распродажей сейчас не актуальна, поэтому ее отключаем.

Для этого я использовал возможности плагина Advanced Custom Fields. Каждая секция уже была добавлена в админке, поэтому оставалось ее только дополнить.

Кейс КЭМП

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

Если заказчик захочет убрать блок с сайта, то ему достаточно будет снять галку с чекбокса.

Осталось немного отредактировать код. Родительскому элементу блоков необходимо прописать стили display: flex и flex-direction: column. А каждой секции нужно задать следующие классы и стили:

<section class="<?php if ( get_field('display_block') == 'yes' ) { ?>d-flex flex-column<?php } else { ?>d-none<?php } ?>" style="order: <?php the_field('order'); ?>;">

После частичной загрузки товаров и тестировании работы сайта, заказчик принял проект.

Понравился проект?

Заполните бриф и узнайте стоимость разработки сайта.
Подробнее
Подписывайся, рассказываю много интересного
Пишу о разработке, маркетинге, бизнесе, переговорах с клиентами и организации работы
Telegram