Здравствуй мой юный кодер, сегодня МЫ с тобой начнем писать свою простенькую
CMS.
Итак, с чего начнем…естественно с проектирования. Что должна уметь/иметь не
крутая, простенькая CMS? Этот вопрос достаточно сложный, т.к. любая CMS, даже
самая простая, пишется под конкретные нужды: электронный магазин, программерский
сайт, новостной сайт, галерея(хотя, в принципе, галерея- это не совсем CMS) и
т.д. В этой статье мы рассмотрим второй вариант. Что же должна уметь такая CMS?
Думаю все со мной согласятся, что:
1) Админку :)
2) Возможность управления новостями, статьями, загрузками, ссылками
3) Функцию регистрации пользователей
Это тот минимум с которым должна уметь оперировать наша CMS. К дополнительным
фичам я отнесу:
1) Динамически создаваемые страницы, т.е. в админке можно запросто ввести
содержимое новой страницы. Например: сделать магазин uin’ов на сайте или
страницу повествующую о истории вашего проекта и т.п.
2) Комментарии к новостям. Это отдельный пункт, т.к. это довольно таки опасная
вещь из-за того, что нужно применять специальные фильтры и спам- детекторы,
иначе если вас кто-то очень сильно не любит и у него есть мозг/деньги(или что
хуже всего, когда у него есть и то и другое :)) то он, в лучшем случае, может
просто забить вашу БД мусором, в худшем он получит полный контроль над сайтом…Мы
еще вернемся к этому вопросу ;)
3) Возможность создания динамически создаваемых менюшек, их перестановка в
различные области сайта.
4) Форма обратной связи с админами(Опасность та же, что и для пункта №2).
Ну вот и все, что я планирую(пока что) тебе объяснить.
Сначала организуем структуру директорий будущего сайта:
/DocumentRoot
/AdminPanel # Корневая директория админки
/Sources # Скрипты админки
/HTML # Собственно сам хтмл админских страниц управления
/Sources # Скрипты CMS
/HTML # Хтмл
/Images # Картинки
/Downloads # Директория хранящая в себе файлы доступные для скачивания
/Config # Файлы конфигурации CMS, например содержащие логин и пароль доступа к
MySQL
Теперь что касается навигации по сайту. Навигация будет производится с помощью
ссылок(ога, самому смешно :)) типа you_site.com/index.php?act=art&mod=idx.
Параметр art характеризует какой раздел сайта мы хотим просмотреть, а параметр
mod отвечает за подраздел который мы хотим просмотреть. Вот таблица соответсвия
этих параметров:
act=art&mod=idx # Просмотр категорий статей
art=art&mod=cat # Просмотр конкретной категории. Как CMS будет узнавать какую
категорию мы хотим просмотреть я объясню чуть позже :)
art=art&mod=art # Просмотр конкретной статьи
act=dwn&mod=idx # Просмотр категорий статей
art=dwn&mod=cat # Просмотр конкретной категории. Как CMS будет узнавать какую
категорию мы хотим просмотреть я объясню чуть позже :)
art=dwn&mod=dwn # Просмотр конкретной статьи
act=users # Просмотр зарегистрировавшихся пользователей
act=users&mod=profile # Просмотр профайла юзера
art=art&mod=reg # Регистрация юзера
Это пока далеко не все варианты, в дальнейшем мы научим “понимать” CMS и другие
параметры. Ну а теперь перейдем непосредственно к программированию. Создадим в
корневой папке файл index.php именно через этот скрипт пользователь будет
путешествовать по сайту, все остальное кроме картинок должно быть запрещено для
просмотра(и не только скрипты но и файлы конфигурации, ХТМЛ)
Код файла index.php:
require_once(‘config/database.php’); // Загружаем скрипт соединяющийся с БД
require_once(‘sources/session.php’); // Скрипт управления сеансами пользователей
require_once(‘config/config.php’); // Файл конфигурации
require_once(‘sources/check.php’); // Проверяет получаемые из URL’a параметры
require_once(‘sources/links’); // Отвечает за ссылки для навигации по сайту
$act=check_act(&$debug); // Функция проверки переменной $act, находится в файле
check.php
$mod=@$_GET[‘mod’]; // Получаем переменную $mod
$site_links=get_links($mysql_tables); // Получаем массив ссылок
switch ($act)
{
case ‘idx’: //если посетитель просматривает главную страницу сайта
require_once(‘sources/news.php’); // Загружаем скрипт новостей
$site_news=get_news($mysql_tables); // Получаем массив новостей
require_once(‘HTML/index.htm’);// Загружаем ХТМЛ страницы
break;
}
?>
Код файла database.php:
$mysql_login=’root’; //Логин для доступа к серверу БД
$mysql_pass=’’; // Пароль
$mysql_host=’localhost’; // Хост на котором висит MySQL
$mysql_database=’MyCMS’; // Имя БД
if(!@$_SESSION['group_id'])//Если пользователь только что зашел
{
$_SESSION['user']='Гость';
$_SESSION['id']=0;
$_SESSION['group_id']=-1;
$_SESSION['last_click']=$time;
}
if(@$_SESSION['group_id']<>'')//если посетитель не гость
{
$_SESSION['last_click']=$time;//в дальнейшем нам это понадобиться для учета
онлайн- пользователей на сайте
}
?>
Код файла check.php:
function check_act(&$debug)//Функция проверки переменной act
{
$act=@$_GET['act'];
if($act<>'idx')
{
$act=$debug['indx_act'];//Задаем дефолтное значение
}
return $act;
}
?>
Код файла config.php:
//Установки управления исправлением ошибок:
$debug['indx_act']='idx';// Если главный скрипт получит не правильное значение
переменнной act то он задаст ей это значение
?>
Код файла links.php:
function get_links(&$table)
{
$query="SELECT position FROM $table";
$result=mysql_query($query);
$rows=mysql_num_rows($result);
for ($i=0; $i<$rows; $i++)
{
$sort_array[$i]=mysql_result($result, $i);
}
sort($sort_array);
for ($j=0; $j<$rows; $j++)
{
$pos=$sort_array[$j];
$query="SELECT * FROM $table WHERE position='$pos'";
$result=mysql_query($query);
$tmp_arr=mysql_fetch_array($result);
$links[$j]['name']=$tmp_arr['name'];
$links[$j]['link']=$tmp_arr['link'];
}
$links['rows']=$rows-1;
return $links;
}
?>
Вот в принципе уже и мини двиган получился :) Теперь давайте разберем код
некоторых файлов, чтобы я вам пояснил механизм работы. Итак для чего я проверяю
переменную $act спросите вы? А представьте себе что кто-то захочет в url’e ее
поменять? После этого скрипт может работать не стабильно и вполне реальна порча
данных и т.п. Конечно в данном примере это играет, мягко говоря, второстепенную
роль, но запомните, что нужно проверять абсолютно все что может изменить
пользователь(лучше даже проверять то что он в принципе и не может изменять).
Если же у переменной какое-то левое значение то мы ей присваиваем дефолтное
значение и тем самым обламываем вредных киддисов :)
Теперь разберем самый сложный из этих простых скриптиков- links.php. Я думаю,
что читатель этой статьи уже сталкивался с управлением каким- либо движком сайта
и наверняка догадался почему этот скрипт настолько сложен(для начинающих
конечно). Управление ссылками на навигационной панели сайта заключается не
только в том, чтобы их добавлять и удалять, а еще, как минимум, в том чтобы
изменять их позицию, т.е. вы сначала добавили ссылки на раздел статей, а потом
вспомнили, что забыли добавить раздел “Главная”- ссылку на главную страницу, но
ведь эта ссылка должна по традиции идти первой…вот тут- то и пригодится
управление позициями. Вы просто добавляете ссылку на главную страницу, а потом
нажимаете на что-то похожее на “Вверх” или “Поднять” и т.п. Но мы пока не будем
в этой части касаться админки, а пока рассмотрим скрипт- клиент. Сначала мы
просто выбираем все записи из таблицы и заносим значения поля ‘position’ каждой
записи в массив. Затем мы сортируем их по возрастающей, то есть : 0, 1, 2 и т.д.
Это позволяет нам потом выполнять в цикле SQL запросы типа: $query="SELECT *
FROM $table WHERE position='$pos'"; Таким образом мы выбираем из таблицы записи
у которых поле ’position’ равно значению переменной $pos, что и дает нам
возможность управления позициями ссылок. Здесь мы в цикле, начиная с ключа со
значением 0 присваивать имя ссылки и, собственно, саму ссылку. Все что нам потом
понадобится чтобы вывести ссылки на свет юзеровский- это написать в хтмл файле
index.htm такой скрипт:
Вот собственно и все. Кстати, некоторые люди которые читают сейчас эту статью,
наверное, возмутяться: “А почему в запросе не использовать конструкцию ORDER BY
и не использовать связанные таблицы? Ведь это упростит задачу!”. Дело в том, что
стиль написания моих скриптов заключается в том чтобы максимально увеличить их
переносимость, т.е. я никогда не использую сложные запросы, связанные таблицы и
т.д. Конечно, все это плохо сказывается на скорости работы скриптов и их
сопровождении(слишком не понятный код), и если нужно добиться максимальной
производительности в ущерб переносимости, то я использую все эти средства, но
зато еще ни один мой скрипт при переезде не просто с одной версии MySQL на
другую, а с одной платформы и/или типа веб серверов и серверов БД не выдал ни
одной ошибки или предупреждения :) Каждый волен делать так как он хочет, ведь на
то оно и программирование: возможных решений задачи, столько же сколько и людей
пытающихся ее решить ;)
P.S. Если что-то не понятно или ты нашел(а) неточности/ошибки в статье- меня
всегда можно найти на нашем
форуме. Жду
комментариев :)
При разработке CMS S.Builder наша команда
активно использовала AJAX. Теперь вот решили поделиться накопленным
опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные
фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в
S.Builder написана библиотека
sbAJAX. Можете качать и пользоваться :). В этом файле есть функция
sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке
на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет
или полезут баги. Эта функция как раз решает поставленную задачу.
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной
версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и
гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и
имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией
Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые
другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все
внимание на флагманский продукт —
Dojo
1.2.
Если вы профессиональный веб-разработчик и постоянно имеете дело с
разработкой и отладкой сложных AJAX приложений, то наверняка знаете и
используете Firebug — плагин для браузера
Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его
версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем,
которые могут возникнуть при разработке. Но и этот инструмент не лишён если не
недостатков, то некоторых фич, которые могли бы облегчить работу. И даже
идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.