Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Универсальный движек


Автор: Kallisto 20.4.2007, 16:47
В общем в разработках сайтов очень часто повторяются одни и теже функции: новости, опрос, юзеры, оплата и т.д..

Очень часто начинается разработка с одного и тоже, пишится нулевой движок, к нему проверки аунтентификации, проверка+подключение БД и прочее..
--
Стал вопрос о создании универсального движка с поддежкой шаблонов+модулей и блоков.
--
Оптимально создать универсальный, а далее через админ.интерфейс поставить модули и все.

Готовые решения просьба не предлагать..

С чего начать?
У меня мысли такие, что создавать подключение к бД через класс-mysql (оптимально вынести классы по работе с БД в другу папку, чтобы можно было нетолько мускул) далее проверять таблицу в БД на предмет модулей.. если в таблице есть модули, то начинать их прикручивать, но тут возникает вопрос как, и в какой последовательности, ведь иногда бывает так что модуль авторизации (по куки) должен идти до вывода буфера.. или там необходимо чтобы часть модуля была вверху страницы, а часть внизу (баннеры) вот тут и возникают косяки.

Оптимально через smarty, но косяки с авторизацией, оплатой всеравно остаются..

Отсюда возникает вопрос: реально ли вообще сделать универсальную систему?? Хотя бы для определеннной категории сайтов? Если да , то с радостью послушал бы советы..

С уважением.
Kallisto.

Автор: xolod 20.4.2007, 19:47
Универсальную схему сделать вполне возможно. Для затравки ознакомьтесь, например, с http://typo3.org/.

Автор: WolfON 23.4.2007, 18:29
Это называется - CMS

А методология разработки предполагающая повторное применение кода - ООП

Автор: Kallisto 25.4.2007, 02:40
CMS, серьезно?  smile ну ты даешь... незнали таких.


Еще раз говорю, что это понято что это КМС и все такое, речь идет о организации ее.. возник вопрос как правильно организовать, чтобы облегчить работу... пока идей нетю  smile 

Автор: mclight 25.4.2007, 07:56
а пока идей нету......пользуйтесь функциями

Автор: Gold Dragon 25.4.2007, 08:06
Цитата(Kallisto @  20.4.2007,  16:47 Найти цитируемый пост)
 но тут возникает вопрос как, и в какой последовательности, ведь иногда бывает так что модуль авторизации (по куки) должен идти до вывода буфера.. или там необходимо чтобы часть модуля была вверху страницы, а часть внизу (баннеры) вот тут и возникают косяки.

Я перепробывал кучу CMS в конечном итоге остановился на Joolma. Теперь по сути... там по моему это уже так и организовано, т.е. свободно можно определить и в какой части шаблона будет располагаться модуль и в какой последовательности. Если брать их подход, то чем не вариант решения..

Автор: CyClon 25.4.2007, 14:27
Ну, какие тут могут быть идеи, берем и пишем. Сначала классы всякие, например для работы с MySQL. Потом ядро, генерация всякая, подсчеты и т.д.

Потом модули, для начала традиционно модуль новостей.

Автор: DioNiR 25.4.2007, 15:27
Цитата
ведь иногда бывает так что модуль авторизации (по куки) должен идти до вывода буфера.


А зачем Модуль авторизации?
Если это у тебя изночально продумано что это будет в CMS то и делай как файл ядра.
И тогда Делай авторизации до вывода.

Автор: Kallisto 25.4.2007, 16:36
"Потом ядро, генерация всякая, подсчеты"
так вот в каком порядке? 
Сначала парсится шаблон, и в него уже модули или как?

я хочу сам понять, тогда я реализую оч. быстро..  Помощь зала? )

Добавлено через 8 минут и 37 секунд
"Если это у тебя изночально продумано что это будет в CMS то и делай как файл ядра."
ну а если просто новостной сайт, зачем там файл авторизации? вот и встал вопрос о создании такой системы

Автор: BuShaRt 25.4.2007, 16:54
smile Сказали же, Joomla тебе в помошь - открытый программный код, комментарии - сиди разбирай, как каструктар, а потом на премере свое собирай ;) 

http://joomlaportal.ru/content/view/31/47/

Добавлено через 1 минуту и 53 секунды
Цитата(Kallisto @  25.4.2007,  16:36 Найти цитируемый пост)
"Если это у тебя изночально продумано что это будет в CMS то и делай как файл ядра."ну а если просто новостной сайт, зачем там файл авторизации? вот и встал вопрос о создании такой системы

Ну создай авторизацию отдельно от ядра... 

А вообще, новостной сайт без авторизации - это нечтно новенькое, новости без модерирования все подряд добавляют что ли?

Добавлено через 4 минуты и 17 секунд
Сори, за оффтопы....

Но имхо, даже для HomePage нужна авторизация хотя бы для гостевой книги...

Автор: Kallisto 25.4.2007, 18:05
Обычные новости без модерации... 
админ добавляет и все...

что тут сверхнового? 

спасибо за линк.. поковыряю. ;)

Автор: DioNiR 25.4.2007, 18:32
Зачем парсить шаблон в самом начале?

Он вообще должен парсится в самом конце. Когда у уже действия сделаны вот только тогда выводим.

Автор: Vaulter 25.4.2007, 20:15
в самом начале парсить например для вырезания блоков в зависимости от уровня тек. пользователя (как пример) или просто для определения блоков шаблона (для дальнейшего ПЕРЕопределения) 
авторизация:

в "ГЛАВНОМ" скрипте чтото типа:
Код

......
if(!defined('NOAUTH'))
{
require_once _PHPSDIR.'auth.php';
$GLOBALS['auth'] = new auth();
$GLOBALS['auth']->check();
}
......
 

Автор: Gold Dragon 26.4.2007, 07:48
ну так в самом конце и проверяй с самом шаблое типа такого

Код

<?php if (Modules( "AUTH" )) {
?>

<div>
<!-- бла-бла бла -->
      <?php mosLoadModules('AUTH'); ?>
<!-- бла-бла бла -->
</div>

<?php }else{
?>

<div>
<!-- бла-бла бла -->
      <?php mosLoadModules('NOAUTH'); ?>
<!-- бла-бла бла -->
</div>

<?php }
?>


или вообще есть в шаблоне типа {auth}, делай проверки какие тебе нужно, а в шаблон в конце вставляй результат.

Автор: CyClon 26.4.2007, 12:00
ИМХО авторизация должна быть в ядре, а не модулем.

Автор: GZep 26.4.2007, 12:17
Цитата(CyClon @  26.4.2007,  12:00 Найти цитируемый пост)
а не модулем. 

Это смотря что под "модулем" считать... Я, например, просто выношу эти строки кода в отдельный файл и подружаю его ядром...

Автор: BuShaRt 27.4.2007, 09:17
 smile Я когда то писал CMS по принципу, все должно быть редактируемо на ходу от тимплетов до модулей...  Давно было очень, но идея мне нравиться до сихпор, такая вот CMS для, которую можно собрать в любой момент совершенно в любой комбинации... 

Если интересно, скину таки наработки, ходя они далеки от совершенства, но суть ясна наверна smile)

Ядро достаточно просто устроенно на мой взгляд ;)

index.php
Код

<?php
include_once 'all_connect.php';

if (empty($page)){  
    $page='new';
}

if (empty ($_POST['indexform'])) {
    GoIndex ($page);    
}
    
$filter_obj->field_validator('Логин', $_POST['login'], 'alphanumeric', 4, 15);     
$filter_obj->field_validator('Пароль', $_POST['password'], 'string', 4, 15);
    
if (!($row = $mysql_obj->CheckPass ($_POST['login'], $_POST['password']))) {
    $filter_obj->messages[] = 'Логин - пароль не совпадают.';    
}     

if ($filter_obj->messages) {    
    GoIndex ($page);         
}

GreatMemberSession($row['login'], $row['password'], $row['lvl']);    
header('Location: index.php?'.session_name().'='.session_id().'&page=rule');     
    
?>


all_connect.php
Код

<?php
include_once ("class/filter/filter.php")      ; $filter_obj = new filter ();
include_once ("class/WorkMySQL/WorkMySQL.php"); $mysql_obj = new WorkMySQL (); 

define('IP'  , $REMOTE_ADDR);
define('URL' , '<a href=index.php?page=id>name</a><br>');

include_once 'functions.php';
include_once 'workhtml.php';

session_register('login');
session_register('password');
session_register('loggedIn');
session_register('lvl'); 
?>


workhtml.php
Код

<?php
function print_HTML ($avt,$pagename) {

//Const and var:
$sh_menu     = file('html/menu.html');
$sh_index    = file('html/face.html');
$sh_login    = file('html/login.html');
$sh_pushform = file('html/pushform.html');
$files       = file('page/pages.txt');
$menu        = file('menu/menu.txt');
$filename=array(); $menutitle=array(); $MenuHTML=array();    
//---

//Great LoginBlock
$login = '';
if (!$avt) { $sh_login = $sh_pushform; }
foreach ( $sh_login as $val) {$login .= $val; }
//---

//Read page:
foreach ($files as $val) {
    $pagetext = '';
    $val = split ('@',$val);
    $val[1] = trim ($val[1]);
    $PageTitle = $val[2];
    if ($val[0]==$pagename) {
        if ($val[1]=='txt' or $val[1]=='html') {
            $file = file ('page/'.$pagename.'.'.$val[1]);
            foreach ($file as $val) {$pagetext .= $val;}
        } 
        if ($val[1]=='php') {
            include 'page/'.$pagename.'.'.$val[1];
        } 

    break;
    } else { $pagetext = 'Такой страници не существует'; $PageTitle = 'Ошибка'; }
}
//---
                                                
//Great MenuBlock
foreach ($menu as $val) {
    $val = split ('@',$val);
    $filename[] = $val[0];
    $$val[0] = file('menu/'.$val[0].'.txt');
    $menutitle[] = $val[1]; 
}                            
for($i=0; $i<count($filename); $i++) {
    $MenuTxt = '';
    $MenuHTML["$i"] = '';
    foreach ($$filename[$i] as $val) {
        $val = split ('@',$val);
        $url = str_replace ('id'  ,$val[1],URL);
        $url = str_replace ('name',$val[0],$url);
        $MenuTxt .= $url;
    }
    foreach ($sh_menu as $val) {
        $val = str_replace ('<MenuName>',$menutitle[$i],$val);
        $val = str_replace ('<MenuTxt>' ,$MenuTxt      ,$val);
        $MenuHTML["$i"] .= $val;
    }
}
//--- 

//Paste all block's menu in page
foreach ($sh_index as $val) {
    for($i=0; $i<count($filename); $i++) {
        $val = str_replace ('<'.$filename[$i].'>',$MenuHTML["$i"],$val);
    }
    $val = str_replace ('<pushform>',$login,$val);    
    $val = str_replace ('<printtitle>',$PageTitle,$val);
    $val = str_replace ('<login>',$_SESSION['login'],$val);
    $val = str_replace ('<PrintPage>',$pagetext,$val);
    print $val;
}
//---

}
?>


functions.php
Код

<?php
//****************************************
//заполнение сессии данными
//****************************************
function GreatMemberSession($login, $password, $lvl) {
    $_SESSION['login'] = $login;
    $_SESSION['password'] = $password;
    $_SESSION['loggedIn'] = true;
    $_SESSION['lvl'] = $lvl;
}

//****************************************
//Генерация странички    
//****************************************    
function GoIndex ($pages){
    
    //if Exit:
    if ($pages=='exit'){
        session_destroy();
        header("Location: index.php");
    }
    //---
    
    //if Error:
    if (isset ($filter_obj->messages)) {
        $filter_obj->ErrorLog ();
    }  
    //---
    
    //Print HTML and exit
    print_HTML($_SESSION['loggedIn'],$pages);
    exit;
    //---
}         
    
//****************************************
//**************************************** 

?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)