Строим свою CMS на PHP и MySQL. Часть 6
В предыдущих уроках серии мы построили простую CMS, которая имеет клиентскую и серверную части и позволяет осуществлять примитивное управление содержанием сайта без редактирования кода. Теперь расширим функционал нашего проекта. Добавим использование категорий.
Категории добавляют гибкости сайту - кроме перечисления всех статей в списке можно создавать отдельные страницы для категории, на которых будут выводиться только статьи, объединенные по какому-либо признаку.
Например, наша CMS выводит все типы статей вместе на главной и в архиве. Создав различные категории для новостей, обзоров и интервью можно будет использовать разные страницы для соответствующих разделов на нашем сайте, что существенно улучшит уровень удобства пользования ресурсом.
В новой демонстрации можно просмотреть, как функционируют категории. Каждый заголовок статьи сопровождается названием категории (он расположено ниже названия) - Interviews, Reviews или News. Нажав на название категории можно открыть страницу архива, на которой перечислены все статьи категории и ее описание вверху.
План действий
Возьмем за исходную точку нашу готовую CMS и будем модифицировать ее для добавления функционала категорий. Нужно сделать следующие шаги:
1. Модифицировать базу данных
2. Построить класс Category
3. Модифицировать класс Article для управления категориями
4. Модифицировать index.php для вывода категорий
5. Модифицировать admin.php для перечисления, добавления, редактирования, удаления и назначения категорий
6. Модифицировать шаблоны клиентской части и таблицы стилей для вывода категорий
7. Модифицировать шаблоны серверной части управления перечислениями, добавлением, редактированием, удалением и назначением категорий.
Модифицируем базу данных
Сначала нужно расширить возможности базы данных MySQL для поддержки категорий. Нужно создать новую таблицу categories и модифицировать таблицу articles для включения ID категории, которая связана с каждой статьей.
Открываем файл tables.sql оригинальной CMS и вносим изменения:
Модифицируем базу данных
Сначала нужно расширить возможности базы данных MySQL для поддержки категорий. Нужно создать новую таблицу categories и модифицировать таблицу articles для включения ID категории, которая связана с каждой статьей.
Открываем файл tables.sql оригинальной CMS и вносим изменения:
Code
DROP TABLE IF EXISTS categories;
CREATE TABLE categories
(
id smallint unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL, # Название категории
description text NOT NULL, # Короткое описание категории
PRIMARY KEY (id)
);
DROP TABLE IF EXISTS articles;
CREATE TABLE articles
(
id smallint unsigned NOT NULL auto_increment,
publicationDate date NOT NULL, # Дата публикации категории
categoryId smallint unsigned NOT NULL, # Идентификатор категории статьи
title varchar(255) NOT NULL, # Полное название статьи
summary text NOT NULL, # Короткое резюме
content mediumtext NOT NULL, # Содержание HTML статьи
PRIMARY KEY (id)
);
CREATE TABLE categories
(
id smallint unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL, # Название категории
description text NOT NULL, # Короткое описание категории
PRIMARY KEY (id)
);
DROP TABLE IF EXISTS articles;
CREATE TABLE articles
(
id smallint unsigned NOT NULL auto_increment,
publicationDate date NOT NULL, # Дата публикации категории
categoryId smallint unsigned NOT NULL, # Идентификатор категории статьи
title varchar(255) NOT NULL, # Полное название статьи
summary text NOT NULL, # Короткое резюме
content mediumtext NOT NULL, # Содержание HTML статьи
PRIMARY KEY (id)
);
Мы добавили новую таблицу categories для хранения категорий. Каждая категория имеет уникальное поле для идентификации (id), название категории (name) и краткое описание для вывода на архивной странице (description).
Также мы изменяем таблицу articles для добавления поля categoryId, которое используется для связывания каждой статьи с соответствующей категорией.
Поле, которое связывает одну таблицу с другой называется как внешний ключ (foreign key).
А что делать, если у вас уже есть статьи в базе данных?
Если использовать запрос из файла tables.sql в MySQL, то он удалит существующую таблицу articles в вашей базе cms и построит ее с нуля. То есть все статьи, которые уже есть в CMS удалятся.
В подобной ситуации нужно модифицировать таблицу articles с сохранением всех данных. MySQL позволяет выполнять такие задачи легко, благодаря выражению ALTER TABLE. Упрощенно синтаксис ALTER TABLE выглядит так:
ALTER TABLE имя_таблицы ADD имя_нового_поля определение_нового_поля AFTER существующее_поле
Если у вас есть статьи в CMS, то нужно создать новую таблицу categories и модифицировать имеющуюся таблицу articles. Чтобы выполнить задачу, запрос в файле tables.sql должен выглядеть так:
Code
DROP TABLE IF EXISTS categories;
CREATE TABLE categories
(
id smallint unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL, # Name of the category
description text NOT NULL, # A short description of the category
PRIMARY KEY (id)
);
ALTER TABLE articles ADD categoryId smallint unsigned NOT NULL AFTER publicationDate;
CREATE TABLE categories
(
id smallint unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL, # Name of the category
description text NOT NULL, # A short description of the category
PRIMARY KEY (id)
);
ALTER TABLE articles ADD categoryId smallint unsigned NOT NULL AFTER publicationDate;
Применяем изменения
Теперь нужно применить изменения к нашей базе MySQL.
Если у вас уже есть база данных cms, которая содержит статьи, то необходимо сделать резервную копию перед внесением изменений!
Если у вас нет базу данных cms, то нужно ее создать, как было описано в предыдущих уроках серии:
Code
mysql -u username -p
create database cms;
exit
create database cms;
exit
Теперь можно загрузить файл tables.sql в MySQL для внесения изменений в таблицу данных:
Code
mysql -u username -p cms < tables.sql
Вводим пароль, когда система его запросит и нажимаем Enter. MySQL читает файл tables.sql и выполняет команды из него, создавая и/или модифицируя таблицу в базе данных cms.
Для проверки результатов нужно войти в MySQL:
Code
mysql -u username -p cms
Затем используем команды SHOW TABLES и EXPLAIN для проверки схем таблиц в MySQL:
Code
mysql> show tables;
+---------------+
| Tables_in_cms |
+---------------+
| articles |
| categories |
+---------------+
2 rows in set (0.00 sec)
mysql> explain articles;
+-----------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| publicationDate | date | NO | | NULL | |
| categoryId | smallint(5) unsigned | NO | | NULL | |
| title | varchar(255) | NO | | NULL | |
| summary | text | NO | | NULL | |
| content | mediumtext | NO | | NULL | |
+-----------------+----------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> explain categories;
+-------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| description | text | NO | | NULL | |
+-------------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql>
+---------------+
| Tables_in_cms |
+---------------+
| articles |
| categories |
+---------------+
2 rows in set (0.00 sec)
mysql> explain articles;
+-----------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| publicationDate | date | NO | | NULL | |
| categoryId | smallint(5) unsigned | NO | | NULL | |
| title | varchar(255) | NO | | NULL | |
| summary | text | NO | | NULL | |
| content | mediumtext | NO | | NULL | |
+-----------------+----------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> explain categories;
+-------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| description | text | NO | | NULL | |
+-------------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql>
Обратите внимание на новое поле categoryId в таблице articles и новую таблицу categories.
Теперь база данных нашей CMS для работы с категориями.
В следующих уроках мы реализуем остальные пункты плана по модификации CMS.
-
FalleN -
4261 -
1 -
275
Но только нужно ставить наверное на те модули которые обновляться должны не раньше через пару тройку минут
С Уважением, Андрей...