Этот урок связан с проектом Строим свою CMS на PHP и MySQL

Строим свою CMS на PHP и MySQL. Часть 6

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

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

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

В новой демонстрации можно просмотреть, как функционируют категории. Каждый заголовок статьи сопровождается названием категории (он расположено ниже названия)  - Interviews, Reviews или News. Нажав на название категории можно открыть страницу архива, на которой перечислены все статьи категории и ее описание вверху.

demosourse

 

План действий

Возьмем за исходную точку нашу готовую CMS и будем модифицировать ее для добавления функционала категорий. Нужно сделать следующие шаги:

  1. Модифицировать базу данных
  2. Построить класс Category
  3. Модифицировать класс Article для управления категориями
  4. Модифицировать index.php для вывода категорий
  5. Модифицировать admin.php для перечисления, добавления, редактирования, удаления и назначения категорий
  6. Модифицировать шаблоны клиентской части и таблицы стилей для вывода категорий
  7. Модифицировать шаблоны серверной части управления перечислениями, добавлением, редактированием, удалением и назначением категорий.

 

Модифицируем базу данных

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

Открываем файл tables.sql оригинальной CMS и вносим изменения:

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)
);

Мы добавили новую таблицу 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 должен выглядеть так:

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;

 

Применяем изменения

Теперь нужно применить изменения к нашей базе MySQL.

Если у вас уже есть база данных cms, которая содержит статьи, то необходимо сделать резервную копию перед внесением изменений!

Если у вас нет базу данных cms, то нужно ее создать, как было описано в предыдущих уроках серии:

mysql -u username -p 
create database cms; 
exit

Теперь можно загрузить файл tables.sql в MySQL для внесения изменений в таблицу данных:

mysql -u username -p cms < tables.sql 

Вводим пароль, когда система его запросит и нажимаем Enter. MySQL читает файл tables.sql и выполняет команды из него, создавая и/или модифицируя таблицу в базе данных cms.

Для проверки результатов нужно войти в MySQL:

mysql -u username -p cms

Затем используем команды SHOW TABLES и EXPLAIN для проверки схем таблиц в MySQL:

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> 

Обратите внимание на новое поле categoryId в таблице articles и новую таблицу  categories.

Теперь база данных нашей CMS для работы с категориями.

В следующих уроках мы реализуем остальные пункты плана по модификации CMS.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.elated.com/articles/add-article-categories-to-your-cms/
Перевел: Сергей Фастунов
Урок создан: 10 Декабря 2012
Просмотров: 38261
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

^ Наверх ^