Ошибка: Failed to parse the Currency Converter XML document.
$1 871.24


Ошибка: Failed to parse the Currency Converter XML document.
$10 509.66


Ошибка: Failed to parse the Currency Converter XML document.
$1 973.31


Своя CMS на PHP. Часть 1

Итак, с чего начнем... естественно с проектирования. Что должна уметь/иметь не крутая, простенькая 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 на другую, а с одной платформы и/или типа веб серверов и серверов БД не выдал ни одной ошибки или предупреждения :) Каждый волен делать так как он хочет, ведь на то оно и программирование: возможных решений задачи, столько же сколько и людей пытающихся ее решить;)

 

Интересное

Перевод программ под Windows
Для перевода программ под windows используются редакторы ресурсов, которых развелось достаточно много. Самые лучшие, на мой взгляд, resurs hacker и restorator. У каждой из них есть свои плюсы и...
Подробнее...
Тюнинг Windows Server 2003
Как Вы знаете, многие серверные ОС предназначены большей частью для работы сервером, не имея возможностей использования как «домашней» ОС. В этой статье речь пойдет о настройке Windows Server 2003...
Подробнее...
10 способов...
Некоторые люди утверждают, что хорошо работают в высоко-стрессовом окружении. Я не один из них. Когда я расслаблен, моя производительность наиболее высока. Если передо мной стоят задачи, которые...
Подробнее...
Flash-технология. Недостатки
Прежде, чем применять Flash на сайте, нужно семь раз отмерить. Оказывается, не все знают, что это такое. Одни применяют Flash от необходимости, другие — от незнания.Дело в том, что Flash — это не...
Подробнее...
Какая программа для...
Среди систем автоматизированного проектирования большой популярностью пользуется система AutoCAD. Однако иногда пользователь обдумывает вопрос о ее замене на альтернативные программные продукты....
Подробнее...
Забавное программирование...
Забавное программирование в DelphiПриведённый здесь материал можно озаглавить не иначе как «Чем заняться программисту, если нечего делать». На самом деле, Delphi настолько интересная среда,...
Подробнее...
FreeBSD под эмулятором Bochs
В этой статье описывается мой опыт по сборке урезанного варианта FreeBSD «с нуля» и запуска ее под эмулятором Bochs. Основываясь на статье Йенса Швайкхардта (Jens Schweikhardt) «FreeBSD From...
Подробнее...
Сквозная навигация
Сквозная навигация — это система связей (гиперссылок), облегчающих движение пользователя по сайту. Речь идёт о максимально возможном переплетении данных. Кроме того, наличие такой связи...
Подробнее...
Развертывание пакета...
Вопрос. Действительно ли пакет обновления 1 для Exchange Server 2007 выпущен только в 64-разрядной версии? А если 32-разрядная версия есть, поддерживается ли она для рабочей среды?Ответ. Тут...
Подробнее...
Основные конструкции языка...
В этой статье я расскажу о языковых конструкциях языка веб программирования php.Изучив их, Вы уже сможете писать простенькие программы.Особенностью конструкций этого языка является простота. if-...
Подробнее...