Найти в Дзене
Logonok

Поиск всему голова

Оглавление

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

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

Фильтры должны соответствовать товарам в категории. То есть каждая категория должна иметь список классов товаров, по которым будут создаваться фильтры.

В обычных случаях объекты всегда зависят от описывающих их метаданных. В данном же случае именно объекты - категории, будут определять метаданные - классы товаров, по которым будут создаваться фильтры.

Приступаем к делу

Устанавливаем и запускаем веб-приложение «Книжный магазин», построенное на декларативном фреймворке Evado с открытым исходным кодом, который обеспечивает легковесность и производительность конечного результата.

Веб-приложение можно запустить как из Docker (в этом случае вся необходимая инфраструктура установится автоматически), так и в окружении Node.js и базы данных MongoDB.

Переходим в модуль «Студия» по адресу http://localhost:3000/studio для редактирования метаданных приложения. Добавляем в класс «Категория» атрибут «Классы для фильтра». Указываем тип JSON, потому что в нем будет храниться массив кодовых имен классов. Указываем тип представления атрибута - «Классы метаданных». Это представление обеспечивает ввод данных через список классов, а не кодовыми именами.

Экспортируем метаданные в папку metadata/app, и они автоматически будут подхвачены приложением.

Переходим в модуль «Офис» и добавляем в категории те классы товаров, по которым будут строиться фильтры.

Для категории задается список классов товаров, по которым строится фильтр
Для категории задается список классов товаров, по которым строится фильтр

Пользовательский интерфейс

Пользовательские интерфейсы могут быть реализованы под каждое приложение. Данные извлекаются с помощью AJAX запросов к API фреймворка.

В данном случае интерфейс сделан как отдельный модуль. На клиентской стороне используется Vue.js. Интерфейс доступен по адресу http://localhost:3000/front.

Клиентская часть приложения реализована на Vue.js
Клиентская часть приложения реализована на Vue.js

В интерфейсе уже присутствует строка поиска, через которую ищутся подходящие варианты по наименованиям товаров.

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

Заключение

Готовое веб-приложение магазина доступно в открытом хранилище исходного кода .