Перед созданием функционала продуктов и категорий давайте подумаем об информации, которая потребуется нашим клиентам и администраторам сайта. Нужно предоставить достаточную информацию о товаре, мы должны вывести имя товара, подробное описание товара, цену товара. Мы можем также выложить фотографию товара, а также дополнительные изображения. Возможно потребуется вес товара для расчета стоимости доставки. Количество товара на складе, чтобы не продать товар, которого у нас нет. Для администратора сайта нужен будет ID товара, а также человекочитаемый урл для поисковых систем.
В итоге у нас должны быть как минимум вот эти поля:
Данные |
Описание |
ID |
Номер товара для внутренней работы сайта |
Name |
Имя товара |
ЧПУ |
Нужен больше для поисковых систем |
Description |
Детальная информация о товаре |
SKU |
Артикул товара для пользователей сайта |
Price |
Цена товара |
Stock |
Количество товара на сайте |
Primary image |
Главное изображение |
Additional images |
Дополнительные изображения |
В последующих статьях мы расширим этот список, а пока нам достаточно и этого.
Категории товаров имеет свой список полей:
Данные |
Описание |
ID |
Номер категории для внутренней работы сайта |
Name |
Имя категории |
Description |
Описание категории |
ЧПУ |
Читаемый URL для поисковых систем |
Мы могли бы двигаться дальше и реализовывать структуру данных и функционал для отображения товаров и категорий с помощью нашего фреймворка, однако, если мы сделали бы это сейчас, то потеряли много возможной гибкости. Большинство контента отображает много общей информации. Если мы найдем эту общую информацию и создадим абстрактный тип контента, тогда наш фреймворк будет более гибким. Мы могли бы использовать различных функционал для этих типов материала без дублирования кода. Таким функционалом может стать:
- Версирование контента
- Разграничение прав доступа
- Комментарии контента, страниц, товаров
- Рейтинги страниц, товаров
Страницы
Страницы это будут обычные статические разделы нашего сайта: Контакты, информаци о доставке и оплате и т.д. Данные этих страниц представлены в следующей таблице:
Данные |
Описание |
Имя |
Имя страницы |
ЧПУ |
URL страницы |
ID |
Внутренний номер страницы |
Heading |
Содержимое тега h1 |
Title |
Содержимое тега <title> |
Content |
Содержимое страницы |
Keywords |
Содержимое мета-тега ключевых слов |
Description |
Содержимое мета-тега описания |
Content
Страницы - это основной тип содержимого, который мы будем расширять, когда нужно будет хранить больше полей. Страницы категорий это по сути такие же страницы, только нужно больше полей для связи с товарами.
Данные |
Описание |
ID |
Номер для внутренней работы |
Name |
Имя контента |
ЧПУ |
|
Content |
Содержимое страницы контента |
Type |
Тип контента (например page, product, category) |
Order |
Сортировка контента, например для пунктов в меню |
Parent |
Родитель контента, нужно для иерархии, например для подкатегорий или каталога страниц |
Meta keywords |
Ключевые слова |
Meta description |
Мета-описание |
Date created |
Дата создания |
Creator |
Автор контента |
Active |
Показывать контент посетителям или нет |
Secure |
Поле для разграничения прав, например на просмотр только зарегистрированным пользователям |
Ревизии
В друпале есть система ревизии, у нас будет тоже своя подобная система.
Данные |
Описание |
ID |
Внутренний номер контента |
Current revision |
Текущий номер ревизии |
Теперь когда мы распланировали наши типы материалов приступим к созданию нашей базы данных. Для каждого типа мы создадим отдельную таблицу. В результате у нас должны быть вот такие таблицы:
Таблица |
Описание |
Content |
Для хранения связей активных версий контента с информацией, которая не изменяется для различных версий, например автор контента. |
Versions |
Для хранения данных отдельной версии контента |
Content types |
Записываем типы материалов нашего фреймворка, соотносим контент к типу материала. |
Products |
Расширяем данные о продуктах |
Revision history |
Сохраняем историю наших ревизий |
Content
Весь контент на сайте у нас будет хранится в этой таблице. Если мы хотим раширить тип материала, то мы будем делать это в отдельной таблице. Например у нас будут продукты, они будут хранится в таблице Content, но при этом будут связаны с таблицей Products через ID.
Поле |
Тип |
Описание |
ID |
Integer (auto increment) |
Поле для связи с другими таблицами |
Current_revision |
Integer |
Поле для связи с таблицей версий |
Active |
Boolean |
Показывает опубликованный или нет контент |
Secure |
Boolean |
Доступен или нет контент только авторизированным пользователям |
Parent |
Integer |
Связь с родительским контентом |
Order |
Integer |
Поле для сортировки контента |
Author |
Integer |
ID пользователя, который создал контент |
Type |
Integer |
ID типа контента, для расширения данных контента |
Path |
Varchar |
Поле для хранения ЧПУ |
Теперь можно выполнить запросы к бд и создать таблицу Content:
CREATE TABLE `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`current_revision` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`secure` tinyint(1) NOT NULL,
`parent` int(11) NOT NULL,
`order` int(11) NOT NULL,
`author` int(11) NOT NULL,
`type` int(11) NOT NULL,
`path` char(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;