Практика разработки CMS
Сегодня для рождения сайта и жизни его в сети создана уютная обстановка. Множество CMS позволяет наполнить сайт необходимым функционалом и удобно управлять его содержимым. Даже бесплатные решения позволяют новичкам без проблем наполнять свой сайт информацией, не обладая при этом особыми знаниями (хотя это не всегда хорошо). Но в любом деле есть исключения, которые требуют особого подхода. Именно об особых случаях в веб-разработке я и хочу вам рассказать.
Порой сайт должен обладать особым функционалом, или соответствовать определенным требованиям, которые ставит перед разработчиком (студией) заказчик. В таком случае приходиться разрабатывать дополнительные модули, и не всегда это удобно, а порой и не возможно сделать со «стандартной» CMS. В подобных случаях для сайта разрабатывается уникальный «движок», хотя это случается крайне редко. В большинстве случаев разработчики (студии) создают фирменные CMS по другим причинам, предлагая пользователю дополнительные удобства, функционал или (и) безопасность. О том, почему и зачем я пошел этим путем, и что из этого получилось речь пойдет дальше.
Предисловие
Сразу хочу сказать, что я отношусь к тем людям, которые жить не могут без переделывания, создания или усовершенствования (утилизации) разного рода устройств. Порой это качество заставляет «изобретать велосипеды» или делать что-то по-своему. Желание разобраться в том, как функционирует девайс, программа или даже вселенная, порой сводит на нет простое и спокойное пользование ими. Надеюсь на Хабре достаточно жителей, которые поймут о чем я, и им будет интересна история применения этого качества в веб-разработке.
Я обожаю, когда мои мысли и идеи воплощаются в электронном виде и доступны людям по всему миру. Эту возможность Интернет дал каждому пользователю, и это прекрасно. Интернет состоит из наших мыслей идей и желаний, и каждый из нас может сделать его лучше. По крайней мере, я стремлюсь к этому и хочу помогать пользоваться его возможностями другим. И вот наступило время подумать о будущем моих проектов и сайтов, которые я бережно верстал для других. Пора было решить вопрос функционала, масштабируемости и управления контентом. И это не должно было стать проблемой, но не для меня. Я устанавливал различные CMS, но вместо удовлетворения во мне усиливались сомнения, а вместе с ними пришло вдохновение…
Мне хотелось управлять не только контентом и модулями сайта, но и самой системой, — ее интерфейсом и функциями. Я стоял перед выбором: потратить n часов для освоения работы и структуры открытой CMS, или выделить (n x 10) часов для разработки своего «движка», который будет «подвластен» только мне. Первый вариант существенно экономил время и обладал некоторыми преимуществами, а вот реализация второго варианта требовала уйму времени и имела много недостатков. Но вышеуказанные качества и высокий уровень вдохновения не оставили мне выбора и я приступил к разработке.
Теория
Модульность, расширяемость и простота в управлении, — вот основные требования к проекту. Сама CMS должна обеспечивать лишь базовый функционал (управление страницами, структурой сайта и редактирование информации на нем) который по возможности расширялся бы. Основное требование это гибкая конфигурация сайта с помощью функциональных модулей. Они должны расширять функционал сайта в любых пределах, — от сайта-визитки, до интернет магазина. Очень важно было сделать администрирование сайта максимально простым и понятным. Я хотел, чтобы клиент уже через полчаса самостоятельно мог добавлять страницы, редактировать информацию, управлять разделами и меню на сайте. Поэтому надо было максимально упростить процесс администрирования, оставив лишь необходимые функции которые бы понадобились неискушенному владельцу сайта.
Вот список базовых функций (операций) админ-панели CMS:
- общие настройки сайта
- создание страниц (WYSIWYG редактор)
- управление страницами (редактирование свойств и содержания, удаление)
- управление разделами (добавление, редактирование свойств)
- управления меню (добавление, редактирование ссылок)
- редактор дизайна (визуальный редактор для шаблонов HTML)
- работа с модулями (управление настройками модулей)
Этот функционал должен удовлетворить большинство пользователей (администраторов), тем более как показывает практика, заказчик зачастую ленится заниматься даже этой элементарной работой. Поэтому я решил сфокусироваться на удобном интерфейсе и эргономике, не нагружая ее лишними элементами.
Разработка
Все началось с файла index.php, потом появлялись необходимые каталоги, которые постепенно наполнялись скриптами. Менялась их структура, — код перекочевывал из файла в файл и попутно оптимизировался. Функции объединялись в классы а в базе данных появлялись новые таблицы и колонки. Проверка, отладка и доработка, — бессонные ночи, и усталые глаза. Впрочем, это знакомо каждому разработчику.
Пожалуй, пора перейти от лирики до знакомства со структурой движка сайта и логикой его работы. Не буду утомлять вас ненужными деталями, и постараюсь сделать лаконичное и понятное описание.
Структура
На рисунке изображена упрощенная схема структуры сайта работающего на CMS. Очень коротко можно описать суть механизма вывода элементов веб-страниц буквально двумя предложениями.
При GET запросе (1), производится проверка его (URI) на отсутствие мусора, после чего извлекается идентификатор (3) страницы и раздела. После выдачи данных о разделе идет обработка и вставка шаблонов и модулей а так-же информации (текст и контент) из полей таблицы соответствующим запрашиваемой страницы. В противном случае — если страница или раздел не найдены, то осуществляется рэдирект на соответствующую страницу ошибки.
Источник
Строим свою CMS на PHP и MySQL. Часть 1
Задача построения системы управления содержанием (CMS) может привести в замешательство новичка разработчика PHP. Но не так страшен черт, как его малюют! В данной серии уроков мы построим простую, но полностью работоспособную систему с нуля.
В ходе процесса вы научитесь создавать базы и таблицы MySQL, работать с объектами, константами, включениями, сессиями и прочими инструментами PHP. Кроме того мы покажем, как отделять логику приложения от презентации и сделать код PHP более безопасным. А также вам откроется многое другое, полезное в деле создания собственной системы мечты.
Вы можете посмотреть работу готового приложения на странице демонстрации (с целью безопасности включен режим «только чтение», так что добавлять, изменять и удалять статьи не получится). Также можно скачать полный код PHP нашей меленькой CMS с переведенными комментариями.
Примечание: для изучения материалов уроков потребуется веб сервер Apache с установленным модулем PHP и сервер MySQL. Для работы на локальном компьютере можно воспользоваться одним из инструментов веб разработчика: XAMPP (на английском языке), Denwer, Open server или другим.
Функционал нашей CMS
Первым делом надо точно определиться, что будет делать наша CMS. Итак, вот список функций:
- Главная страница, на которой выводиться список последних 5 статей
- Страница со списком всех статей
- Страница просмотра отдельной статьи
- Вход/выход для администратора
- Список всех статей
- Добавление новой статьи
- Редактирование существующей статьи
- Удаление существующей статьи
Каждая статья имеет собственный заголовок, резюме и дату публикации.
Планирование работ
Для создания нашей CMS нужно сделать следующие шаги
- Создать базу данных
- Создать таблицу articles
- Сделать файл конфигурации
- Построить класс Article
- Написать скрипт клиентской части index.php
- Написать скрипт серверной части admin.php
- Создать шаблон клиентской части
- Создать шаблон серверной части
- Создать таблицу стилей и логотип системы
Примечание: на страницах уроков приводится код для нашей CMS готовый к копированию в ваши текстовые файлы. Если у вас нет желания создавать файлы самостоятельно, то можно скачать архив с исходниками, в котором содержатся все нужные папки и файлы.
Шаг 1. Создаем базу данных
На первом шаге нужно создать базу данных MySQL для хранения содержания. Можно сделать так:
Запускаем программу клиент mysql Открываем окно терминала и набираем команду
mysql -u username -p
После запроса введите пароль для доступа к MySQL.
username — имя пользователя, который имеет полномочия для создания баз данных. В случае работы на локальном компьютере можно использовать root , хотя для безопасности всегда следует создавать пользователя с другим именем для решения задач администрирования.
Создаем базу данных После метки mysql> вводим:
create database cms;
И нажимаем Enter.
Выходим из программы клиента mysql После метки mysql> вводим:
И нажимаем Enter.
Теперь у нас есть пустая база данных, в которой можно размещать таблицы и содержание.
Для решения такой задачи также можно воспользоваться инструментами для администрирования баз данных, таким как phpMyAdmin, cPanel или Plesk (если они установлены на вашем сервере). В некоторых случаях использование подобных инструментов является единственным доступным для пользователя инструментом для работы с базами данных (ситуация зависит от правил, установленных на вашем хостинге).
Шаг 2. Создаем таблицу articles
Наша простая CMS имеет единственную таблицу в базе данных: articles . В ней содержатся все статьи в нашей системе.
Создадим схему таблицы. Схема таблицы описывает типы данных, которые могут содержаться в таблице и информацию о ней.
Создаем текстовой файл tables.sql на жестком диске и добавляем в него следующий код:
Выше приведенный код определяет схему таблицы articles . Он написан на SQL, языке для создания и манипулирования базами данных в MySQL (и во многих других системах).
Разберем выше приведенный код
- Создаем таблицу articles Выражение DROP TABLE IF EXISTS articles удаляет любую существующую таблицу articles (вместе с данным — осторожно!). Мы выполняем данную операцию чтобы в базе не было двух таблиц с одинаковыми именами. Выражение CREATE TABLE articles ( ) создает новую таблицу articles . Код, размещенный в скобках, определяет структуру данных в таблице.
- Определяем для каждой статьи уникальный ID Теперь можно определять структуру таблицы. Таблица состоит из набора полей (также их называют столбцами). Каждое поле содержит опредленный тип информации о статье. Сначала мы создаем поле id . Оно имеет тип smallint unsigned (без знаковое маленькое целое), то есть число от 0 до 65,535. Таким образом, наша CMS может содержать до 65,535 статей. Также для него определяется атрибут NOT NULL , который означает, что поле не может быть пустым (null). Данное свойство существенно облегчает труд разработчика. Добавляем атрибут auto_increment , который указывает MySQL назначать новое, уникальное значение для поля id при создании записи. Итак, первая статья будет иметь id 1, вторая — id 2, и так далее. Мы будем использовать уникальные значения как указатели на статью при выводе и редактировании в CMS.
- Добавляем поле publicationDate Следующая строка создает поле publicationDate , которое хранит дату публикации каждой статьи. Данное поле имеет тип date , соответствующий значениям дат.
- Добавляем поле title Теперь создаем поле title , в котором размещается заголовок. Оно имеет тип varchar(255) , то есть может хранить строку длиной до 255 символов.
- Добавляем поля summary и content Последние два поля 2, summary и content , содержат резюме статьи (краткое описание материала) и HTML содержание соответственно. Резюме имеет тип text (то есть, может состоять из 65,535). А поле content имеет тип mediumtext (то есть может содержать до 16,777,215).
- Добавляем основной ключ Последняя строка в выражении CREATE TABLE определяет ключ для таблицы. Ключ также называют индексом, и он служит для быстрого поиска данных в таблице за счет некоторого увеличения требующегося пространства для хранения. Мы определяем поле id как PRIMARY KEY . Каждая таблица может содержать единственный PRIMARY KEY , так как данный ключ уникально определяет каждую запись в таблице. Кроме того, с помощью данного ключа MySQL очень быстро находит нужную запись.
Теперь у нас есть схема таблицы и ее нужно загрузить в MySQL для создания структуры. Самый простой способ — открыть окно терминала, перейти к папке с файлом tables.sql и запустить следующую команду:
mysql -u username -p cms
. где username — имя пользователя MySQL, а cms — имя базы данных, которую мы создали на шаге 1.
Вводите пароль пользователя после запроса, и MySQL загрузит и выполнит код из файла tables.sql , создав таблицу articles в базе данных cms .
Также можно воспользоваться инструментами для администрирования баз данных, таким как phpMyAdmin, cPanel или Plesk (если они установлены на вашем сервере).
Шаг 3. Создаем файл конфигурации
Теперь у нас есть база данных и мы готовы разрабатывать код PHP. Начнем с создания файла конфигурации для хранения различных установок для нашей CMS. Данный файл будет использоваться остальными скриптами нашей системы.
Первым делом создаем папку cms в папке веб сервера. Она будет содержать все файлы нашей CMS.
В папке cms создаем файл config.php и копируем в него следующий код:
Разберем код подробно:
- Выводим ошибки в браузере Строка ini_set() устанавливает режим вывода сообщений об ошибках в браузере. Отличная опция для отладки кода, но на готовом проекте данную опцию надо отключить ( установить значение false ) для безопасности ресурса.
- Устанавливаем временную зону Так как наша CMS будет использовать функцию PHP date() , нужно указать временную зону сервера для PHP (иначе PHP будет генерировать предупреждение). В примере установлена зона «Australia/Sydney» — поменяйте на свою.
- Устанавливаем детали доступа к базе данных Затем определяем константу DB_DSN , которая указывает PHP, где искать базу данных MySQL. Параметр dbname должен соответствовать имени базы данных нашей CMS ( cms ). Также мы будем хранить имя пользователя MySQL и пароль, которые используются для доступа к базе данных CMS в константах DB_USERNAME и DB_PASSWORD . Установите правильные значения в данных константах, которые соответствуют вашим настройкам.
- Устанавливаем пути Мы устанавливаем 2 пути в нашем файле конфигураций: CLASS_PATH , который указывает на место хранения файлов классов, и TEMPLATE_PATH , который указывает на место хранения шаблонов HTML. Оба пути указываются относительно верхнего каталога cms .
- Устанавливаем количество статей, выводимых на главной странице HOMEPAGE_NUM_ARTICLES управляет максимальным количеством заголовков статей, которые выводятся на главной странице. Мы установили 5, но можно легко увеличить или уменьшить значение.
- Устанавливаем имя и пароль администратора Константы ADMIN_USERNAME и ADMIN_PASSWORD содержат данные регистрации для администратора нашей CMS.
- Включаем класс Article Так как файл класса Article (мы его создадим позже) требуется во всех скриптах нашего приложения, добавим его здесь.
- Создаем обработчик исключительных ситуаций В завершение определяем handleException() — простую функцию для обработки исключений PHP, которые могут генерироваться при выполнении кода. Данная функция выводит общее сообщение об ошибке и записывает данные об ошибке в журнал веб сервера. Такая функция способствует улучшению безопасности системы за счет обработки исключений PDO, которые могут выводить имя пользователя и пароль на странице. После определения функции handleException() , мы устанавливаем ее как обработчик исключений PHP, вызывая функцию set_exception_handler() .
Такой обработчик исключений сделан для упрощения материалов урока. «Правильный» способ для обработки исключений для перехвата всех вызовов PDO в Article.php заключается в использовании блоков try . catch .
Замечание о безопасности
В реальных проектах лучше помещать config.php где-нибудь за пределами корневого каталога веб сайта, так как в файле содержатся имена и пароли. Обычно код PHP невозможно просмотреть в браузере, но иногда из-за неправильной конфигурации веб сервера код становится доступным. Вы можете использовать функцию hash() для хэширования паролей и хранить в config.php хэши, вместо текстовых паролей. Затем при регистрации пользователя можно опять воспользоваться функцией hash() для кодирования введенного пароля и сравнения результата с сохраненным в config.php хэшем.
В следующем уроке мы построим основной класс нашего приложения — Article.
Источник