DataLife Engine > PHP > Своя CMS на PHP. Часть 1
Своя CMS на PHP. Часть 113 ноября 2007. Разместил: podpole |
Итак, с чего начнем... естественно с проектирования. Что должна уметь/иметь не крутая, простенькая CMS? Этот вопрос достаточно сложный, т.к. любая CMS, даже самая простая, пишется под конкретные нужды: электронный магазин, программерский сайт, новостной сайт, галерея(хотя, в принципе, галерея- это не совсем CMS) и т.д.
Здравствуй мой юный кодер, сегодня МЫ с тобой начнем писать свою простенькую 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’; // Имя БД $mysql_tables[‘news’]=’news’; // Таблица новостей $mysql_tables[‘articles’]=’articles’; // Таблица статей $mysql_tables[‘art_categ’]=’art_categ’; // Таблица категорий статей $mysql_tables[‘downloads’]=’downloads’; // Таблица загрузок $mysql_tables[‘dwn_categ’]=’dwn_categ’; // Таблица категорий загрузок $mysql_tables[‘links’]=’links’; // таблица ссылок $mysql_tables[‘users’]=’users’; // Таблица пользователей ?> Код файла session.php: @session_start(); 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 такой скрипт: for(i=0;$i<$site_links[‘size’];$i++) { echo "{$site_links[$i]['name']}"; } ?> Вот собственно и все. Кстати, некоторые люди которые читают сейчас эту статью, наверное, возмутяться: “А почему в запросе не использовать конструкцию ORDER BY и не использовать связанные таблицы? Ведь это упростит задачу!”. Дело в том, что стиль написания моих скриптов заключается в том чтобы максимально увеличить их переносимость, т.е. я никогда не использую сложные запросы, связанные таблицы и т.д. Конечно, все это плохо сказывается на скорости работы скриптов и их сопровождении(слишком не понятный код), и если нужно добиться максимальной производительности в ущерб переносимости, то я использую все эти средства, но зато еще ни один мой скрипт при переезде не просто с одной версии MySQL на другую, а с одной платформы и/или типа веб серверов и серверов БД не выдал ни одной ошибки или предупреждения :) Каждый волен делать так как он хочет, ведь на то оно и программирование: возможных решений задачи, столько же сколько и людей пытающихся ее решить;) |