Этот курс ( Практикум по разработке CMS ) создавался, когда у PHP была версия 5.3 или 5.4. Со временем какие-то функции PHP устаревают (mysql, each), какие-то начинают работать по-другому (empty). Пожалуйста, следите за изменениями в PHP по сайту php.net! |
Серверные технологии
Конфигурация. Версия 08
Все настройки хранятся у нас в файлах exe/config.php и exe/dns.php (mysql). Хранить настройки в отдельных файлах удобно: это повышает читаемость (да и прочность) кода. К тому же можно привести массив в config.php к однородному виду (сделать всё в два уровня), и тогда можно будет править параметры через http (то есть прямо на сайте). Практика, однако, показывает, что заказчики сайтов не пользуются такой возможностью – всегда обращаются к разработчику для изменения любых параметров конфигурации. Поэтому мы не будем усложнять нашу маленькую CMS в эту сторону – вся конфигурация будет правиться только в файле.
Почему параметр из предыдущей главы (о почтовых уведомлениях) нельзя хранить в файле config.php? Можно, но не совсем правильно. У нас прослеживается три типа параметров:
- для конкретного сайта,
- для всей CMS,
- для "хоста" – компьютера, на котором работает веб-сервер.
Например, Mysql – совершенно отдельная система, она не входит в CMS (и даже не входит в систему Apache – Php); поэтому мы выделили эти настройки в отдельный файл dns.php. То же и с доступом к командам ОС (convert, например) – мы должны записать в dns.php, есть ли у нашей CMS такая возможность, и разветвлять рабочий код соответственно.
Есть ли на нашем хостинге (сервере) возможность отправлять сообщения через sendmail, тоже не имеет прямого отношения к CMS, и этот параметр мы тоже поместим в dns.php.
***
Интересен вопрос о второй группе параметров – "для всей CMS". У нас почти все параметры именно такие. Более того, 95% всего рабочего кода у нас не относится к конкретному сайту (ведь именно к этому мы и стемились, начиная писать CMS). И пора переходить на следующую ступень – выделить код "ядра" в отдельную папку, стоящую выше конкретных сайтов (и сразу много сайтов смогут использовать общий код этого ядра). Ядро у нас получилось так себе – не ядро, а ядрышко, зёрнышко, всего 60 килобайт. Так и назовём его в соответствии с размером – не "kernel", а "Kern", Kern.sys (расширение – для надёжности, чтоб не путать эту папку с другими "просто папками").
В папку "бибилиотеки" Kern.sys поместим файлы Command.php, common.php, config.php, dns.php, functions.php, а на сайтах, в папках exe, останутся файлы Site.php, users.php, Abadon.php. Строго говоря, для "персональных" параметров сайта надо добавить ещё файл site_config.php, и перекрывать его параметрами значения из общего файла config.php. Но пока в этом нужды нет, а когда (и если) возникнет – сделаем.
Эти изменения требует переезда на следующую версию – 08 http://nichtig.ru/08/. Возникает сразу пара небольших проблем:
- у нас 10 М файлов на сайте и мы не хотим их размножать по всем версиям;
- вам надо будет как-то получать zip-архив "библиотеки", которая теперь находится не в папке сайта.
Первую проблему решаем, добавив в наш "контекстный коммандер" Abadon.php следующую функцию:
<?php class Ab { static function lfile () { $f = SITE . '/files'; if (!file_exists($f)) symlink(SITE . '/../07/files', $f); } //...
Функция вызывается так: http://nichtig.ru/08/addon.com?lfile (нужен авторизованный пользователь со статусом 2).
Вторую задачу решить сложнее из-за запутанной логики скачивания архивов. Там javascript отправляет на сервер запрос downzip.com с параметром type, который описан прямо в функции Command::downzip(). Мы добавили сейчас параметр "8", который потребует совершенно отдельной обработки – и в коде ниже придётся добавить самый "верхний" if: если параметр равен 8, пакуем рекурсивно папку Kern.sys (функцией work_zip):
<?php class Command { //... static function downzip () { //... if ($type == $rtypes['lib']) { work_zip($Zip, LIB, LIB); } //...
Ну, и последняя деталь. Вы видите в примере константу LIB, которой не было в предыдущей версии. Мы не хотим связывать себя конкретными обязательствами по месту расположения нашего Kern.sys, поэтому создаём (прямо в файле index.php) функцию lib_find, которая будет искать свою "библиотеку" начиная с папки самого сайта (да, можно помещать Kern.sys хоть внутри сайта):
<?php define('SITE', realpath(dirname(__FILE__))); //... define('LIB', lib_find(EXE, 'Kern.sys')); //... function lib_find($path, $lib_name) { $res = null; DIRECTORY_SEPARATOR == '/' || $path = str_replace('\\', '/', $path); $path_arr = explode('/', $path); while(array_pop($path_arr)) { $test = implode('/', $path_arr) . '/' . $lib_name; if (file_exists($test)) { $res = $test; break; } } return $res; }
Остаётся пока вопрос, как все эти пути будут работать под Windows. Протестируйте это, если у вас есть Windows. Если возникнут проблемы, пишите комментарии. Впрочем, и так известно, что возникнут. Поэтому заменим сразу строчку определения константы SITE:
<?php define('SITE', str_replace('\\', '/', realpath(dirname(__FILE__))));
Вот теперь проверяйте (это домашнее задание). Проверять надо так:
- скачайте себе на компьютер "ядро" Kern.sys http://nichtig.ru/08/downzip.com?type=8 ;
- скачайте файлы самого сайта http://nichtig.ru/08/downzip.com?type=1 ;
- распакуйте всё это в нужные папки вашего домашнего веб-сервера;
- скачайте sql http://nichtig.ru/08/dump.com и загрузите его в вашу базу данных.
Второе задание: создайте систему редактирования файла Kern.sys/config.php
Инструкции для пользователей
Написать код рабочей CMS и описать её работу – разные задачи. И вторая отнюдь не проще. Начнём с инструкции по установке.
Инструкция по установке CMS "Шутка" (назовём её так):
- Скачайте к себе на компьютер архив http://nichtig.ru/08/source/Unsinn_prog&lib.zip .
- Распакуйте архив в любую папку своего веб-сервера, доступную по http.
- [можно пропустить] Перенесите папку Kern.sys на один-два уровня выше (чтобы она была недоступна по http).
- Добавьте в файл exe/users.php пользователя со статусом "2". Это можно сделать, например, с помощью команды консоли в вашем каталоге exe: "./add_user.sh my-name my-password 2" (где вместо my-name и my-password вы должны написать своё имя и пароль). Или допишите элемент массива руками (вычислив md5 для пароля в другой программе).
- Отредактируйте файл Kern.sys/dns.php – впишите туда правильные имя пользователя, пароль и БД для подключения к Mysql.
- Откройте в браузере http-адрес, по которому находится ваш новый сайт. Нажмите Ctrl + Alt + e для перехода на страницу авторизации (или введите в адресную строку адрес edit.com и перейдите по нему). Авторизуйтесь с именем и паролем пользователя, которого вы создали (со статусом "2").
- Нажмите кнопку "Создать таблицы mysql" в списке красных ссылок справа, убедитесь по отчёту, что таблицы созданы.
- Наполняйте сайт содержимым: создавайте новые страницы и редактируйте. Добавляйте фото.
- Откройте файл exe/Site.php и начинайте создавать шаблоны (php, выводящий mysql-данные в окружении HTML-тэгов в нужных местах страницы) для нового сайта.
- Добавляйте в файл site.css правила для отображения HTML-элементов нового сайта.