Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

Модульное программирование на PHP или как написать маленький портал

Автор: Ray Adams

Я попытаюсь тут разъяснить то, как я подхожу к написанию сайтов, где могут применять подключаемые модули. Пример тому известный скрипт PHPNuke. Как бы не ругали его, подход, примененный в нем, к модульному программированию очень удобен. Но из-за корявости общего кода применять такой скрипт на серьезных сайтах, точнее скажем порталах, с большим количеством посетителей, не рекомендуется. Почему? Скрипт работает медленно, очень большая нагрузка на базу данных. Можно еще очень много чего описать, но это уже материал для другой статьи. Если кому интересно , то в интернете полно описаний этого движка. В PHPNuke я убедился сам. Мой основной проект NVIDIA BIOS Collection в начала базировался на PHPNuke, но постоянные проблемы с хостингом заставили меня начать разработку своей система портала с нуля. Из PHPNuke я взять только суть модулей, все остальное же делал сам. И так для начала. Прежде всего, надо продумать систему каталогов, что и где будет лежать. Вот примерный вариант.

  • /mods/ - каталог для хранения модулей
  • /img/ - картинки
  • /include/ - каталог вспомогательных файлов

Это что нам сейчас пока надо. Применять блоки и скины мы пока не будем. В моем портале также были другие каталоги

  • /blocks/ - Тоже своего рода модули, но не выводящие сами информацию, а возвращающие заполненную переменную.
  • /js/ - каталог для Java скриптов
  • /theme/ - каталог выбора тем или, грубо говоря, набор скинов для сайта.
  • /files/ - файлы для скачивания

ну и другие каталоги.

В корневом каталоге храниться всего один файл index.php и вся работа идет через него. Теперь надо решить как будет выглядеть сам сайт. Для нашего примера подойдет наипростейший вариант дизайна , верх сайта , низ сайта, а в середине наша информация из модулей. Для этого в каталоге include создадим два файла top.php и bottom.php, что соответственно будет верхней частью дизайна и нижней частью дизайна.

top.php

<?php
echo "<html>

<head>
<meta http-equiv='Content-Type' content='text/html;
 charset=windows-1251'>
<title>$PAGE_TITLE</title>
</head>

<body>

<table border='0' cellpadding='0' cellspacing='0'
 style='border-collapse: collapse' bordercolor='#111111' width='100%'
 id='AutoNumber1'>
<tr>
<td width='100%' colspan='2' bgcolor='#DDFFFF'>
<p align='center'>здесь выводится шапка</td>
</tr>
<tr>
<td width='17%' align='left' valign='top' bgcolor='#FFDFFF'>
<b>Меню сайта</b><p>
<b>- </b><a href='index.php?mod=mod1'>Модуль1</a>
<br>
- <a href='index.php?mod=mod2'>Модуль2</a></td>
<td width='83%' align='left' valign='top'>";
?>

Предвижу комментарии, где скажут, почему я не вывожу HTML код отдельно, а php отдельно. Я приучил себя к написанию 100% PHP кода, с одной стороны не очень и красиво может выглядеть, но мне так удобнее. Если кто-то хочет писать по-другому, то тут я не советчик. Заметьте переменную $PAGE_TITLE в top.php. В моей реализации вся информация о модулях храниться в базе данных, где помимо имени файла модуля храниться также и его название, которое потом и кладется в $PAGE_TITLE, для вывода его в головок браузера.

bottom.php

<php
echo "& lt;/td>
</tr>
<tr>
<td width='100%' align='left' valign='top' colspan='2'
 bgcolor='#DDFFFF'> </td>
</tr>
</table>

</body>

</html>";
?>

Также создадим файл конфигурации config.php и положим его в каталог include.

config.php

<?php
#Модуль по умолчанию
$sys_def_mod="mod1";

?>

Вот примерная схема работы index.php

<?php
include("inc/config.php");
if (!isset($mod) || ($mod=="") || (!file_exists ("mods/$mod.php"))) {
$mod=$sys_def_mod;
#Проверка на существование переменной $mod, и существования такого модуля
# если неверное условие то присваиваем ему значением модуля по умолчанию
}
$PAGE_TITLE="Модуль $mod";
include("inc/top.php");
include("inc/$mod.php");
include("inc/bottom.php");
?>

Теперь создадим два файла mod1.php и mod2.php и положим их в каталог mods.

mod1.php

<?php
if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }
echo "Это модуль номер 1!<br>";
echo "А <a href='index.php?mod=mod2'>здесь</a> можно посмотреть на модуль номер 2";
?>
mod2.php
<?php
if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }
echo "Это модуль номер 2!<br>";
echo "А <a href='index.php?mod=mod1'>здесь</a> можно посмотреть на модуль номер 1";
?>

Поясню немного вот эту строку

if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }

В каждый модуль желательно включать такую проверку во избежании вызова файла модуля вне самого index.php. На примере моего портала до вызова модуля у меня идет подключение в базе данных, считывание некоторых глобальных переменных и без них, ни один модуль сам по себе работать не сможет. Так что лучше всего просто запретить вызов модуля напрямую. Вызов модулей в данном случае производится через строку в виде index.php?mod=имя модуля, но тут можно применить и систему ЧПУ. Тогда URL примет вид index.php/имя модуля/

Вот в принципе очень грубая схема реализации модулей. Можно добавить любой модуль, просто положив его в каталог mods/ и придерживаясь общей концепции работы, построить очень сложный сайт. В чем удобства работы? По сути вы отодвигаете от себя основную заботу по натягиванию кода на дизайн. Это делает один раз в index.php. Сам же модуль должен только работать и приносить пользу. Централизация сбора основной информации из базы или конфигурационного файла, глобальные переменные сайта, информация о пользователе и т.д. С другой стороны есть недостатки (хотя при определенном взгляде они не кажутся недостатками), скажем надо четко следить за тем какие имена переменных используются до модуля, чтобы не перезаписать, случайно, их внутри модуля. Один раз у меня такое случилось. После такого случая, я взял для себя за правило называть системные переменные в таком виде $sys_имя переменной. Другой очевидный недостаток это трудность реализации разных вариантов дизайна для разных модулей. Но! Тут есть выход тоже.

Если взять за правило, что каждый модуль обязан сам вывести шапку и низ сайта, то вам уже предоставляется свобода по выбору что и как выводить.

К примеру, наши простые модули можно модифицировать в таком варианте.

<?php
if (!eregi("index.php", $PHP_SELF)) { die ("Access denied"); }
$PAGE_TITLE="Это Я, модуль номер 1!!!";
include("inc/top.php");
echo "Это модуль номер 1!<br>";
echo "А <a href='index.php?mod=mod2'>здесь</a> можно
посмотреть на модуль номер 2";
include("inc/bottom.php");
?>

Как делать в данном и конкретном случае решать Вам. Я же просто попытался направить тех, кто начинает писать на php, а может и тех, кто уже пишет, на определенный вариант или стиль программирования.

  • http://www.x-bios.3dgames.ru/ - Сайт моего портала, но к сожалению он закрыт
  • http://fallenangels.combats.ru/ - Сайт игрового клана, также полностью построен на модульной системе.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
59K
04 мая 2010 года
Yura_n
2 / / 04.05.2010
+2 / -1
Мне нравитсяМне не нравится
9 сентября 2010, 12:40:29
Автору спасибо. Статья неплохая, только кажется много ошибок...
Я долго мучался пока довел ее до "своего" ума, в конце концов переделал index.php следующим образом:

<?php
include("include/config.php");

if (empty($_GET['mod']) or !file_exists("mods/".$_GET['mod'].".php")) {
$_GET['mod'] = $sys_def_mod;
}

$PAGE_TITLE="Модуль $mod";
include("include/top.php");
if (isset($_GET['mod']))
{
include("mods/" . $_GET['mod'] . ".php");
}
include("include/bottom.php");
?>
2.
59K
15 марта 2010 года
Mulciber
0 / / 15.03.2010
+0 / -1
Мне нравитсяМне не нравится
15 марта 2010, 17:32:20
Помогите!!!
Все сделал как написано.
Создал все нужные файлы, текст скопировал...
Все страница с первым модулем выводится, а вот ссылна на модуль 2 не как не реагирует, точнее она все нормально пишется в адресной строке, а страница не обновляется.
В чем может быть проблема, может где то что то должно быть включено или настроено. Использую Денвер-3.
3.
7.1K
21 марта 2004 года
DJK
1 / / 21.03.2004
Мне нравитсяМне не нравится
5 февраля 2010, 18:28:14
Я немного делаю не так как автор, но статья очень полезная.
И функция eregi удалена будет с новых версиях выше php 5.3, а пока Deprecated.

мой подход к модулям в отличие от автора заключается следующем
1. в папке mods есть файл содержания:

<?php
$pages=array();
$pages["mod1"]="Первый модуль";
$pages["mod2"]="Второй модуль";
?>


в нем перечисляются все модули, этот файл как бы регистратор модулей

2. проверка на подключаемый модуль осуществляется

if (!isset($page) || ($page=="") || (!in_array($page, $pages)) ) {
$page="main";
}


3. проверка на возможность загрузки модуля делается так

<?php
$PHP_SELF=$_SERVER['PHP_SELF'];

if (!stripos($PHP_SELF,"index.php")) {
die ("Access denied");
}
...........
?>
4.
406
15 марта 2007 года
patison
323 / / 15.03.2007
+0 / -1
Мне нравитсяМне не нравится
15 января 2010, 02:24:27
Jackkum: а если у вас будет тысяча модулей, вы напишете тысячу раз case 'modeN' ???
5.
41K
31 июля 2008 года
Jackkum
1 / / 31.07.2008
Мне нравитсяМне не нравится
31 июля 2008, 09:23:50
А я использую такой способ:

-------------------------------
index.php

<?php
require_once("./admin/admin.php");
?>
--------------------------------
./admin/admin.php

<?php
if(isset($_GET['mode'])){
switch($_GET['mode']){
case 'mode1':{
mode1();
break;
}
case 'mode2':{
mode2();
break;
}
default:{
main();
}
}
}
else {
main();
}
?>
--------------------------------
./admin/.htaccess

<Files admin.php>
AuthName "Users zone"
AuthType Basic
AuthUserFile /pub/home/твой_логин/.htpasswd
</Files>
Options -Indexes
--------------------------------
6.
31K
17 июля 2007 года
MbIX_
0 / / 17.07.2007
+1 / -0
Мне нравитсяМне не нравится
17 июля 2007, 13:58:13
те имбицилы, которые тут писали что include("inc/$mod.php"); это офигенная дыра пусть перестанут читать нубские статьи по PHP-безопаности. Данная конструкция представляет опасность только если переменная $mod у нас может быть передана "вредным пользователем". В данном случае она имеет фиксированную величину и до инклюда определяется скриптом. Её значение задаётся в конфигурации, - опционально. Насколько я понимаю существует проверка на её валидность (тут статья очень "общая" и особо придираться я не стану), поэтому в целом всё достаточно неплохо написано. Новичкам самое то.

ЗЫ: в регистер глобалс тоже нет ничего плохого, если у писаря руки из того места растут. И это достаточно удобно.
7.
19K
29 июня 2006 года
Kiriller
1 / / 29.06.2006
Мне нравитсяМне не нравится
29 июня 2006, 00:12:59
Посмотрите на эту строчку, и запомните, что _ТАК_ делать не нужно.
include("inc/$mod.php");

Автору: прежде, чем писать порталы, изучите основы безопасности. Бывает полезным!
8.
Аноним
Мне нравитсяМне не нравится
2 июня 2006, 04:05:14
Чуваки, тут же дыра офигенная. (:
9.
Аноним
Мне нравитсяМне не нравится
8 апреля 2006, 22:41:55
Кто-то спрашивал про этот пример,вот ответ на вопрос:

code:--------------------------------------------------------------------------------
<?
echo "<table>
<form method='post' action='".$_SERVER['PHP_SELF']."' >
введите свое имя:</td><td> <input type='text' name='name'>
<input type='SUBMIT' >
</form>
?>
--------------------------------------------------------------------------------
10.
Аноним
Мне нравитсяМне не нравится
10 февраля 2006, 11:19:57
Вобщем я разобрался со всем теперь у меня возникла другая проблема!
REGISTER_GLOBALS=ON
я даже не мог себе представить что это дыра действительно размером с озеро байкал!
напишите хоть ктонибудь как эту проблему можно устранить в даном скрипте!
ЗЫ: зарание благадорю :)
11.
Аноним
Мне нравитсяМне не нравится
30 января 2006, 19:01:59
Круто! Дельная статейка! Для человека начинающего изучать ПХП - незаменимая вещь!!!

мне пригодилась...
12.
Аноним
+0 / -1
Мне нравитсяМне не нравится
19 января 2006, 23:09:21
Эй блин автор ты вот говоришь 100% ПХП код, а как же делать например в таком случае:
Код:
<?

 echo "<table>

<form method='post' action='<?=$_SERVER["PHP_SELF"]?>' >

    введите свое имя:</td><td> <input type='text' name='name'>

<input type='SUBMIT' >

</form>

?>

Я про ковычки говорю как поставить или какие поставить немогу сообразить!
13.
Аноним
Мне нравитсяМне не нравится
5 января 2006, 16:58:26
Скажу только, что проблему с запретом на доступ к некоторым файлам можно решить через .htaccess, причем программа(PHP) может их использовать.
14.
Аноним
Мне нравитсяМне не нравится
14 ноября 2005, 14:32:23
статья вообще то супер для начинающих вроде меня и локального сайтика, у меня так и сделан на модулях
15.
Аноним
Мне нравитсяМне не нравится
14 октября 2005, 11:10:54
Вместо того чтобы написать свою версию изложенного с коментариями все только и делают что критикуют написанное, возьмите и напишите исправленные свои варианты с комментариями. Полезнее будет.
16.
Аноним
Мне нравитсяМне не нравится
29 сентября 2005, 17:43:02
To Ray Adams:
есть такая вещь, называется портлеты. на j2ee. php - это простенький тул, который для построения порталов... не подходит. хотя, согласен, есть примеры, однако каждый раз у меня возникает мысль, что разработчик подобного просто кроме php ничего не знал.

MasterSID:
Объясните, как это использование echo может затормозить процесс рендера страницы?

17.
Аноним
Мне нравитсяМне не нравится
16 сентября 2005, 11:30:14
В принципе достаточно прозрачно написано, хотя конечно register_globals...
но ведь элементарно можно использовать extract
или суперглобальные массивы - и в самом начале кода до использования любых переменных обозначить их явно присваивая из массива скаже $_GET['variablename'] где ... 'variablename' - взятое в апострофы имя передаваемой через get переменной - только делать это переприсваивание придется в любом модуле... а подробнее можно посмотреть здесь http://ru2.php.net/variables.predefined

PS Я тоже начинающий :)... а в обще и целом статья мне понравилась... только версия PHP, для которой приведены образцы кода, по моему гдето в районе 3
18.
Аноним
Мне нравитсяМне не нравится
4 августа 2005, 01:02:45
я много чего перечитал и пересмотрел но ничего более понятного не нашел! так как быть новечкам вроде меня! MasterSID дай нормальный линк где это попонятней и получше написано на твой взгляд!
19.
Аноним
Мне нравитсяМне не нравится
3 августа 2005, 06:56:55
Вывод основного html через echo крайне неграмотный подход, поскольку он снижает производитеьность скрипта!!! Весь голый HTML должен находиться вне <?php ?>? т.к. в этом случае она не обрабатывается, а так echo тратит системное время на обработку своего содержимого. Так что если уже говорить об оптимизации кода, то этот подход в корне неправильный.

А как быть с директивой include, которая ссылается на неописанную в статье папку inc? :)
20.
Аноним
Мне нравитсяМне не нравится
14 июля 2005, 12:33:03
Так ты разобрался где что ?
21.
Аноним
Мне нравитсяМне не нравится
6 июля 2005, 16:26:09
Well я тоже начинающий но мне даже это итересно хотя не понимаю!
22.
Аноним
Мне нравитсяМне не нравится
6 июня 2005, 12:07:33
register_globals это отстой
23.
Аноним
+0 / -1
Мне нравитсяМне не нравится
12 мая 2005, 00:15:52
я не против статья просто супер!!!! я только начинающий!!!!
Но пока я понял что как я тут столько ошибок понаходил!!!! может это мне так только кажеьтся особенно заморочка с путями а так вроде все просто супер!!!!!
24.
Аноним
+3 / -0
Мне нравитсяМне не нравится
5 февраля 2005, 20:43:20
<blockquote><small>Цитата:<hr size=1>
if (!isset($mod) || ($mod=="") || (!file_exists ("mods/$mod.php"))) {
$mod=$sys_def_mod;
}
include("inc/$mod.php");
[/quote]
ой молодец-то какой =)
а проверять внешние переменные тебя в детском садике не учили?? банальный basename($mod) хотя бы сделал

зы: про register_globals уж молчу ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог