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


Автор: Alexey007 2.5.2007, 14:48
Решил написать новый движок, буду очень признателен за советы и полезные линки, по ходу дела smile .. CMS, вроде так теперь называется smile 
Это может выглядеть как и урок для начинающих програмистов smile 
1. Пути к папкам и их значения:
site/                               Главная директория сайта, собственно
site/configuration.php   Файл главных настроек сайта
site/install                      Файлы инсталяции движка
site/administrator          Админ-центр
site/includes                  Различные модификации(сначала будет только новости)
site/class                       Различные классы
site/logs                        Файлы, в которых будут сохранены ошибки различных кодовsmile
site/pages                     Файлы текстов
site/templates               Файлы шаблонов
site/templates/images   Картинкиsmile
P.S. Скажу сразу, делаю постепенно.. install и administrator буду делать в конце

2. Настройки: site/configuration.php:
Код

//База данных
$Config_host = 'localhost';
$Config_database = 'site';
$Config_user = 'root';
$Config_password = '';
//Путь к главной директории
$Config_absolute_path = '/home/localhost/WWW/site';

P.S. Данный файл будет в создаваться автоматически в инсталяции.

3. Первый класс, подключение к БД: site/class/mysql.php:
Код

class mysql
{
     var $Row;                                   // Current row number
     var $Link_ID    = 0;                     // Result of mysql_connect()
     var $Query_ID   = 0;                  // Result of most recent mysql_query()
     var $Record     = array();            // Current mysql_fetch_array()-result
     var $error_file = 'logs/log.txt';    //Save logs error to...
     var $Errno      = 0;                      // Error state of query
     var $Error      = "";

     //Сохранение ошибок
     function add_error_log ($msg){
        $file = fopen($this->error_file, "a");
        fwrite($file,
"[".date('D M j G:i:s Y')."] [DATABASE ERROR] $msg
                                  [ERRNO] $this->Errno
                                  [ERROR] $this->Error
");
          fclose($file);
     }

     //соединение с БД
     function connect($Config_host, $Config_user, $Config_password, $Config_database) {
          if($this->Link_ID == 0) {
               $this->Link_ID = mysql_pconnect($Config_host, $Config_user, $Config_password);
               if (!$this->Link_ID) {
                    $this->add_error_log("Link_ID == false, connect failed");
                    header();
               }
               $SelectResult = mysql_select_db($Config_database, $this->Link_ID);
               if(!$SelectResult) {
                    $this->Errno = mysql_errno($this->Link_ID);
                    $this->Error = mysql_error($this->Link_ID);
                    $this->add_error_log("База данных ".$Config_database." не существует");
                    exit;
               }
          }
     }

     //отправка запроса
     function query($Query_String) {
          $this->connect();
          $this->Query_ID = mysql_query($Query_String,$this->Link_ID);
          $this->Row = 0;
          $this->Errno = mysql_errno();
          $this->Error = mysql_error();
          if (!$this->Query_ID){
                 $this->add_error_log("Invalid SQL: ".$Query_String);
          }
          return $this->Query_ID;
     }

     //Отключение от БД 
     function close(){
          if($this->Link_ID != 0) mysql_close($this->Link_ID);
     }
}

P.S. Сразу вопрос к знатокам: Как брать значение пути к ЛОГ файлам брать из файла настроек?

4. Файл site/index.php:
Код

  define( '_VALID_MOS', 1 );

  // Если файл configuration.php не создан, нужно для инсталяции
  if (!file_exists( 'configuration.php' )) {
    //Заносим в переменную $self путь к каталогу в котором размещен скрипт, относительно localhost
     $self = rtrim( dirname( $_SERVER['PHP_SELF'] ), '/\\' ) . '/';
     //Перенаправляем пользователя в модуль инсталяции CMS.
     header("Location: http://" . $_SERVER['HTTP_HOST'] . $self . "install/index.php" );
     exit();
  }

  // Загрузка конфигурации сайта
   include_once( 'configuration.php' );

  // Загрузка классов сайта
   include_once( 'class/mysql.php' );

  // Подключение класса MYSQL и подключение к базе
  $mysql = new mysql($Config_host, $Config_user, $Config_password, $Config_database);
  $mysql->connect($Config_host, $Config_user, $Config_password, $Config_database);

  //Вставка страниц
  if(isset($_GET[ 'page' ])){
    // Открываем файл
    $fd = @fopen("pages/".$_GET[ 'page' ].".html", "r");
    // если файл не может быть открыт, сообщаем
    // об этом предупреждением в окне браузера
    if(!$fd) exit ( '404. Данной страницы не существует.
                     <br>
                     Проверьте правильность введенного URL.
                     <br>
                     <a href="/">На главную страницу сайта</a></center>' );
    // Помещаем содердимое файла в переменную $file
    $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
    // Закрываем файл
    fclose($fd);
    //вставляем содержимое файла
    echo $file;
  }

  $mysql->close();

P.S. Вопрос к знатокам:
а)Как сделать, чтобы можно было вставлять не только файлы с разрешение .html, но и с другими?
б)Если ничего не передается(в поле $_GET), то подгружать index.html
в)Новости будут не в этой папке, как сделать критерий на новости?
г)Как разбить файл на 2 вывода, т.е. содержимое файла:
Код

Товары Товары Товары Товары Товары
##############
Цены Цены Цены Цены Цены Цены 
##############
Кол-во Кол-во Кол-во Кол-во Кол-во

Требуется примерно такое вывод:
Код

Наши товары:
Товары Товары Товары Товары Товары
Наши цены:
Цены Цены Цены Цены Цены Цены 
Кол-во всего:
Кол-во Кол-во Кол-во Кол-во Кол-во

Много уважаемые начинающие програмисты, спрашивайте, не стесняйтесьsmile Топик для всех smile 

Автор: WolfON 2.5.2007, 15:42
2. лучше хранить настройки хотя-бы в ассоциативном массиве, хотя о вкусах не спорят
3. 
Код

require_once('site/configuration.php');

...
function ..(..) {
  global $Config_host;
  echo $Config_host;
}

4. а) в чем проблема? )
б) 
Код

if (empty($_GET)) {
//грузим индекс.хтмл
}

в) в смысле критерий? добавь еще одну строчку в бд или сформируй запрос для поиска
г) 
Код

$b = explode('##############', file_get_contents('test.txt'));
print "Наши товары:\n$b[0]\nНаши цены:\n$b[1]\nКол-во всего:\n$b[2]";

Автор: Alexey007 2.5.2007, 16:02
Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
2. лучше хранить настройки хотя-бы в ассоциативном массиве, хотя о вкусах не спорят

Можно поподробнее?

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
4. а) в чем проблема? )

тут надо регулярки использовать?

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
в) в смысле критерий? добавь еще одну строчку в бд или сформируй запрос для поиска

Критерий - не нужно грузить страницу news, т.к. она существует в папке site/includes

Цитата(WolfON @  2.5.2007,  15:42 Найти цитируемый пост)
г)
Код

$b = explode('##############', file_get_contents('test.txt'));
print "Наши товары:\n$b[0]\nНаши цены:\n$b[1]\nКол-во всего:\n$b[2]";

наверное  я не так сформулировал задачуsmile
текст, который находится между #######, должен вставляться в шаблон оформления(в таблицу например для начала)

P.S. Прошу посмотреть с точки зрения безопасности smile 
а global ничего не портит в безопасности?

Автор: Alexey007 2.5.2007, 19:38
Как можно целые функции запихнуть под определенной переменной, т.е. есть шаблон:
Код

    <head>
            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
     <meta http-equiv="Content-Language" content="ru">
     <title>{TITLE}</title>
    </head>
    <body text="{BODY_TEXT}" bgcolor="(BG_COLOR)" link="{LINK}" vlink="{VLINK}" alink="{ALINK}">
 {PAGE}
    </body>
    </html>

нужно:
Заметь {****} на определенные значения...
Как заменить {PAGE}?
В него должна включаться функция
Код

 if(isset($_GET[ 'page' ])){
    // Открываем файл
    $fd = @fopen("pages/".$_GET[ 'page' ].".html", "r");
    // если файл не может быть открыт, сообщаем
    // об этом предупреждением в окне браузера
    if(!$fd) exit ( '404. Данной страницы не существует.
                     <br>
                     Проверьте правильность введенного URL.
                     <br>
                     <a href="/">На главную страницу сайта</a></center>' );
    // Помещаем содердимое файла в переменную $file
    $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
    // Закрываем файл
    fclose($fd);
    //вставляем содержимое файла
    echo $file;
  }

Тексты наверно примерно так, а всю страницу пихать в переменную $text.:
Код

$text = str_replace('{****}', 'Сама переменная', $text);

Но все это очень громозко, можно как-нибудь облегчить код?

Задача: Совместить структуру и шаблон воедино, но чтобы не потерялась читабельность и быстрота выполнения скриптов.

Автор: Alexey007 2.5.2007, 20:08
Тут назрела идея, записать эту функцию в файл, а потом просто его записывать в переменную и приставлять туда, куда нужно smile 

P.S. Неужели никто не может помочь smile , вроде тема нужная..

Автор: Glip 2.5.2007, 20:18
до fopen() можно проверить is_readable() и "глотать" ошибки @ не есть гуд.

Автор: Alexey007 2.5.2007, 20:34
Glip, что тогда посоветуешь?

Автор: Glip 2.5.2007, 20:43
лично мне очень нравится
Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new BaseException($string, $code);
    }
    
    error_reporting(E_ALL | E_STRICT);
    set_error_handler('error2Exception', E_ALL | E_STRICT);

Автор: Alexey007 2.5.2007, 20:46
Обновил, по советам Glip:
Код

  //Проверяем строку ввода на наличие страниц
    if(isset($_GET['page'])){
        //Проверка на отрытие файла
        if (!is_readable("pages/".$_GET['page'].".html")) exit ( $Config_error_404 );
        $fd = fopen("pages/".$_GET['page'].".html", "r");
        // если файл не может быть открыт, сообщаем
        // об этом предупреждением в окне браузера
        if(!$fd) exit ( $Config_error_404 );
        // Помещаем содердимое файла в переменную $file
        $file = fread($fd, filesize("pages/".$_GET[ 'page' ].".html"));
        // Закрываем файл
        fclose($fd);
        //вставляем содержимое файла
        echo $file;
    }


P.S. Сообщение об ошибке внес в файл конфигурации, чтобы код самого скрипта был чище, и не было посторонних текстов:
Код

  $Config_error_404 = '<center><font size="3" color="#D87F00"><b>404. Данной страницы не существует.</b></font>
                       <br>
                       Проверьте правильность введенного URL.
                       <br>
                       <a href="/">На главную страницу сайта</a></center>';


Добавлено через 4 минуты и 55 секунд
Glip, запостил сообщение, не увидев твое сообщениеsmile
можешь чуть-чуть объяснить что это за функция?
А потом как её вставлять?

Автор: Glip 2.5.2007, 20:51
Код

"pages/".$_GET['page'].".html"

можно вынести в отдельную переменную. оно в 3-х местах уже одно и то же.

Добавлено @ 21:01
код взят из http://onphp.org/index.ru.html
там же можно найти и пример использования
Код

    try {
........
some code
    } catch (Exception $e) {
        
        $uri = $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
        
        $msg =
            'class: '.get_class($e)."\n"
            .'code: '.$e->getCode()."\n"
            .'message: '.$e->getMessage()."\n\n"
            .$e->getTraceAsString()."\n"
            ."\n_POST=".var_export($_POST, true)
            ."\n_GET=".var_export($_GET, true)
            .(
                isset($_SERVER['HTTP_REFERER'])
                    ? "\nREFERER=".var_export($_SERVER['HTTP_REFERER'], true)
                    : null
            )
            .(
                isset($_SESSION) ? 
                    "\n_SESSION=".var_export($_SESSION, true)
                    : null
            );

        if (defined('__LOCAL_DEBUG__'))
            echo '<pre>'.$msg.'</pre>';
        else {
            mail(BUGLOVERS, $uri, $msg);
            sleep(10);
            
            if (!HeaderUtils::redirectBack())
                HeaderUtils::redirectRaw('/');
        }

отчет об ошибке в отладочной версии получаем на экран.
в рабочей - перенаправляем пользователя на главную страницу, а отчет об ошибке себе в почту.

Автор: Alexey007 2.5.2007, 21:09
Glip, это вообще для чего? я не вижу связи!

Автор: Glip 2.5.2007, 21:12
Цитата(Alexey007 @  2.5.2007,  20:46 Найти цитируемый пост)
можешь чуть-чуть объяснить что это за функция?А потом как её вставлять?

про какую функцию вопрос?

Автор: Alexey007 2.5.2007, 21:20
Glip, 
Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new BaseException($string, $code);
    }

поточнее надо, что за что отвечает(переменные)
Если менять нужно много значений, как быть?
И вопрос про замену {PAGE} на целую функцию остается нерешенным.

Автор: Glip 2.5.2007, 21:39
Цитата(Alexey007 @  2.5.2007,  21:20 Найти цитируемый пост)
поточнее надо, что за что отвечает(переменные)

Цитата(Glip @  2.5.2007,  20:51 Найти цитируемый пост)
код взят из этого проектатам же можно найти и пример использования

если в двух словах, то:
ошибку (error) которую обрабатывать сложно, преобразуем в исключение (exception) для обработки которого есть конструкция try catch.
это один из варинтов.
при этом не прячем их совсем как @fopen и не показываем клиенту как fopen, а "ловим" и решаем что с ними дальше делать а в итоге фиксим со временем.

можно поискать еще что-нибудь на пердмет использования set_error_handler(). просто данным вариантом я пользуюсь и пока доволен.

Автор: Alexey007 2.5.2007, 21:50
Вообщем вот что откапал:
http://php.ru/forum/viewtopic.php?t=1372&postdays=0&postorder=asc&start=0

По этому есть сразу вопрос, там написано, что так не безопасно. вопрос, как обезопасить себя?smile
Код

     function Parse() {
         # внимание! использование такого подхода НЕ безопасно
         # модифицируйте сами этот метод, для работы с массивами.
         reset($GLOBALS);
  
         while(list($name,$val) = each($GLOBALS)) {
  
             # выбираем только строки и числа
             if(is_string($val) OR is_int($val)) {
                 $this->buffer = str_replace('{'.$name.'}',$val,$this->buffer);
             }
         }
     }

Есть ли какие-нибудь ещё недочеты в данном классе (см. выше)
Glip, спасибо за подсказку функции http://ru2.php.net/manual/ru/function.set-error-handler.php, изучаю...

Простите за такую настойчивость, но как быть, если мне {PAGE} надо заменить фнукцией?? smile 
 smile 

Автор: Всемогущий 3.5.2007, 06:08
Цитата(Alexey007 @  2.5.2007,  23:50 Найти цитируемый пост)
мне {PAGE} надо заменить фнукцией?? 

Код

<?php
function alert(){return '!!!!!!!!!!!!!!!!!!!!';}
function big(){return 'привет';}


$phrase  = "{|tegone|}здесь может быть любойтекст {|tegtwo|}";
$healthy = array('{|tegone|}','{|tegtwo|}', "и так далее");
$yummy   = array(big(), alert(), "ice cream");

echo $newphrase = str_replace($healthy, $yummy, $phrase);

?>


так?

Автор: Alexey007 3.5.2007, 14:00
Всемогущий, уже ближе к истине, но мнемного не то...
Представь, если у меня не один десяток тегов {}, то если я добавлю ещё какой-нибудь, то мне придется прописывать его в array и на то что заменять тоже...
Есть мысль, только как её осуществить?
Дело в следующем. Такой метод будет заменять сами функции(их скорее всего слишком много не будет), а класс будет саменять только переменные.
Опосаюсь за безопасность функции Parse, т.к. там идут глобальные переменные. Прошу помочь разобратьсяsmile
Код

  class template {

    var $template;

    # очистка буфера
    function Clear() {
     $this->template = "";
    }

    # Чтение буфера
    function Read() {
     $tmp = $this->template;
     $this->Clear();
     return $tmp;
    }

    //Вывод шаблона
    function Show() {
     print($this->Read());
    }

    // Подключение текстового файла
    function SendFile($filename) {
        if(file_exists($filename)) {
            $this->template .= join('',file($filename));
        }
    }

    //Замена...
    function Parse() {
        reset($GLOBALS);
        while(list($name,$val) = each($GLOBALS)) {
            # выбираем только строки и числа
            if(is_string($val) OR is_int($val)) {
                $this->template = str_replace('{'.$name.'}',$val,$this->template);
             }
         }
    }

  }

P.S. о вариант хороший, мне понравилсяsmile

Автор: Всемогущий 3.5.2007, 16:49
Цитата(Alexey007 @  3.5.2007,  16:00 Найти цитируемый пост)
Представь, если у меня не один десяток тегов {}, то если я добавлю ещё какой-нибудь, то мне придется прописывать его в array и на то что заменять тоже...

прописывать всё равно придёться.

пусть замен будут сотни...

Код

<?php
function alert(){return '!!!!!!!!!!!!!!!!!!!!';}
function big(){return 'привет';}
function big1(){return 'привет';}
function big11(){return 'привет';}
function big111(){return 'привет';}
function big1111(){return 'привет';}
function big11111(){return 'привет';}
function big111111(){return 'привет';}

$zamena['{|tegone|}']=alert();
$zamena['{|tegtwo|}']= big();
$zamena['{|teg100|}']= big1();
$zamena['{|teg110|}']= big11();
$zamena['{|teg111|}']= big111();
$zamena['{|teg101|}']= big1111();
$zamena['{|teg000|}']= big11111();
$zamena['{|teg001|}']= big111111();




$phrase  = "{|tegtwo|} здесь может быть любойтекст {|tegone|}";



echo $newphrase = str_replace(array_keys($zamena),array_values($zamena), $phrase);

?>



Автор: Alexey007 3.5.2007, 17:45
Всемогущий, спасибо,  с этим понятно.
Вот ещё штука: как разбить файл не по строчкам, а по какому-нибудь критерию?
Т.е. вот код:
Код

$file_open = fopen($file_path, "r");

fuction block{
//Тут функция(может массив?), которая разбивает переменную $file_open
//на несколько переменых, каждая из которых содержит текст, заключенный
//между тегами [BLOCK] и [/BLOCK], а затем эти переменные вставляются в шаблон (описано выше)
}


Примерное содержание файла:
Код

[BLOCK]
{text}
[/BLOCK]
[BLOCK]
{text}
[/BLOCK]


А код шаблона примерно такой:
Код

<table valign="top" border="0" width="100%" cellspacing="0" cellpadding="0">
  <tr>
    <td width="6" background="images/texttab_bg_l.gif"></td>
    <td valign="top" bgcolor="#F3F7FC">{TEXT}</td>
    <td width="6" background="images/texttab_bg_r.gif"></td>
  </tr>
</table>


+ Ко всему нужно делать проверку:
Если в файле нет таких тегов, то направлять в СОВЕРШЕННО другой шаблон

Автор: Vaulter 3.5.2007, 21:43
[code=php]
<?php
/*
Vaulter 25/12/06 07:33:08 Volgograd
vaulter@nm.ru
$FreeBSD$
*/
/**page class file
 * very impotant thing
 * load template
 * process it among other filters
 * filters:
 * @access public
 * @author Vaulter 25/12/06 08:20:48
*/
//define('_HTMLVARSTART','<var>');//'{{';
//define('_HTMLVAREND','</var>');//'}}';
/* can we use #:
for example
a href='^someobject.somemethod[someparam,someparam]'
<title> 
in blocks i can use shortholders
<b><var>name</var></b><i><var>descr</var></i>
*/
ob_start();//will catch all out of ____ and print it AFTER 
define('_RESSLASH','/');//we will write as form/perms @see function valid()
 /**logic is not MVC and much more flexible for programmer :)
 * each @filter@ class just parse itown blocks in full text (agc by reference)
 *        
 */

/** class of page! 
*
*fucking abstract thing. what it shall do    but short API must remain:
*        $page->reports['name'] = 
*        via some universalis and
*        iBl();//can we realize it?
*        build('form') - for absolete build_forms()
*        build('form','someid')
*       

Автор: Alexey007 3.5.2007, 21:52
Vaulter, прости конешно, но при чем тут коды, которые ты написал? авторизация какая-то...

Автор: Vaulter 3.5.2007, 22:08
в кратце все просто
лежит 
html/default.html
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title><block id='title' /></title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    <meta name="description" content="{{%meta.description%}}" />
    <meta name="keywords" content="{{%meta.keywords%}} />
    <meta name="author" content="Vaulter" />
    <link rel="stylesheet" type="text/css" href="css/gazeta.hm.css" />
</head>
<body>
    <div id='wrapper'>
        <div id='header' >
            header
        </div>
    
        <div id='innerwrapper'>
            <div id='left'>
                <h4>Главное меню</h4>
                <fieldset id='firsttab'><legend>Авторизация</legend>
                    <block id='mainmenu' src='mainmenu'/>
                </fieldset>
                <fieldset id='secondtab'><legend>Модули</legend>
                <block id='modulesmenu' ibl='module.menu'>
                    <a href='{{%url%}}'>{{%alias%}}</a><br />
                </block>
                </fieldset>
            </div>
            <div id='content'>    
                <block id='content' />
            </div>

        </div>
    </div>
        <div id='footer' title='здесь просто список сообщений системы, также можно сделать скажем, плавно открывающийся снизу страницы слой, в котором будут эти сообщения
        пока для простоты селект:'>
            <select style='width:100%' >
            <block id='sessmess' ibl='session.messages'>
                <option>{{%message%}}</option>
            </block>
            </select>
        </div>
</body>


ну и все это соответственно по
запросу index.html шевелится и живет smile

 smile 

Автор: Alexey007 3.5.2007, 22:13
Vaulter,  а создать свою ветку форума можешь, вроде не новичок на форуме смотрю?

Тут идет создание движка сайта.. Пытаюсь его сделать Я! ну помогают мне конешноsmile
Так вот, обсуждается этот движок, а не какие иначе.

Модератор, удалите пожалуйста последние сообщения, корорые идут не по теме.
Дата 3.5.2007, 21:43
Дата 3.5.2007, 21:52
Дата 3.5.2007, 22:08
И это подредактируйте тоже, пожалуйста



Добавлено @ 22:19
Всемогущий, скажи пожалуйста, а если создать "шаблон" средствами замены str_replace, т.е. вручную записать все замены {****}, от этого производительность не изменится?

Или можно как-то по-другому сделать?
Или помоги пожалуйста решить вопрос о безопасности(я там в коде показал где-именно + описал в чем проблема)

Автор: Всемогущий 4.5.2007, 08:44
Цитата(Alexey007 @  3.5.2007,  19:45 Найти цитируемый пост)
Вот ещё штука: как разбить файл не по строчкам, а по какому-нибудь критерию?

зачем?

Автор: Alexey007 4.5.2007, 11:00
Всемогущий, Потому что вот так надо! каждый текст нужно вставить в отдельную таблицу... По дизайну...

Автор: Всемогущий 4.5.2007, 11:17
Alexey007, 
Неужеле вы собираетесь хранить всю информацию в одно месте(одном файле)?

расскажите где оправдана такая схема?

Код

<?php

$string='[BLOCK]
{text}
[/BLOCK]
[BLOCK]
{text}
[/BLOCK]';
 preg_match_all("/(?<=\[BLOCK\]).+(?=\[\/BLOCK\])/sU", $string, $matches);
              print_r($matches);

?>


Добавлено через 1 минуту и 24 секунды
Цитата(Alexey007 @  4.5.2007,  13:00 Найти цитируемый пост)
Потому что вот так надо! 
 smile 

Автор: Alexey007 4.5.2007, 11:25
Всемогущий, вот ответ:
http://aragoniafx.com/new/

Как видно, здесь на глабной странице есть 3 блока...
Но тут каждый текст хранится в отдельном файле.. а если редактору понадобиться создать ещё блок? он будет в тупике

Информацию ДАННОЙ страницы буду хранить в одном файле.
т.е. страница index.php, будет соответствовать index.txt, а не index1.txt; index2.txt; .....

А по поводу чтения файла, как наиболее безопасно?

Автор: Всемогущий 4.5.2007, 11:46
для того и нужен шаблон
Цитата(Alexey007 @  3.5.2007,  19:45 Найти цитируемый пост)
Код

<table valign="top" border="0" width="100%" cellspacing="0" cellpadding="0">
 <tr>    
     <td width="6" background="images/texttab_bg_l.gif"></td>
     <td valign="top" bgcolor="#F3F7FC">{TEXT}</td>
     <td width="6" background="images/texttab_bg_r.gif"></td>
 </tr>
</table>

а я возьму и добавлю новый блок
Код

<table valign="top" border="0" width="100%" cellspacing="0" cellpadding="0">
 <tr>    
     <td width="6" background="images/texttab_bg_l.gif"></td>
     <td valign="top" bgcolor="#F3F7FC">{здесь будут новости}</td>
     <td width="6" background="images/texttab_bg_r.gif"></td>
 </tr>
  <tr>    
     <td width="6" background="images/texttab_bg_l.gif"></td>
     <td valign="top" bgcolor="#F3F7FC">{меню А}</td>
     <td width="6" background="images/texttab_bg_r.gif"></td>
 </tr>
</table>



Автор: Alexey007 4.5.2007, 11:55
Всемогущий,
Цитата(Alexey007 @  4.5.2007,  11:25 Найти цитируемый пост)
а если редактору понадобиться создать ещё блок? он будет в тупике

 Потому что он полный ноль в тегах и ничо не знает в HTML!!!
можно конешно воспользоваться проверенным способом str_replace(), то тогда шаблон будет неудобаен в плане, что будет 2 файла block_top и block_bottom

А дизайнеру будет не очень удобно так возиться!

Автор: Всемогущий 4.5.2007, 11:58
Цитата(Alexey007 @  4.5.2007,  13:25 Найти цитируемый пост)
А по поводу чтения файла, как наиболее безопасно?

http://php.novgorod.ru/manual/ru/function.readfile.php
http://php.novgorod.ru/manual/ru/function.file-get-contents.php

Добавлено через 1 минуту и 56 секунд
Цитата(Alexey007 @  4.5.2007,  13:55 Найти цитируемый пост)
 Потому что он полный ноль в тегах и ничо не знает в HTML!!!

 smile покажите мне его  smile такие повымерли давно smile 

Автор: Alexey007 4.5.2007, 12:15
Всемогущий, мне не до шуток smile 

По поводу ссылок, спасибо, но у меня же есть чтение из файла. только вот не понимаю что мне надо изменить)

Так как быть с шаблоном(замену верха и низа не хочется smile ), и ещё:

Цитата(Alexey007 @  3.5.2007,  17:45 Найти цитируемый пост)
+ Ко всему нужно делать проверку:Если в файле нет таких тегов, то направлять в СОВЕРШЕННО другой шаблон


Цитата(Alexey007 @  3.5.2007,  14:00 Найти цитируемый пост)
Опосаюсь за безопасность функции Parse, т.к. там идут глобальные переменные. Прошу помочь разобраться


Цитата(Всемогущий @  4.5.2007,  11:58 Найти цитируемый пост)
  покажите мне его   такие повымерли давно  

Так нужно ещё и для удобства!

Цитата(Alexey007 @  3.5.2007,  22:13 Найти цитируемый пост)
Добавлено @ 22:19Всемогущий, скажи пожалуйста, а если создать "шаблон" средствами замены str_replace, т.е. вручную записать все замены {****}, от этого производительность не изменится?


P.S. прошу ответить по возможности на все, что щас написал smile 
Буду ОЧЕНЬ признателен smile 

Автор: Всемогущий 4.5.2007, 12:29
Давай поговорим об этом потом,и займёмся реализацией конкретных модулей: это будет гораздо интересней.

Автор: Alexey007 4.5.2007, 12:51
Всемогущий, предлагаешь заняться структурой?
Дело в том, что я даж не знаю как разбить шаблоны от кода сразу...
В каких форматах лучше хранить все модули? (т.е. все кроме index.php)
Как защитить файл configuration.php от просмотра посторонних глаз.
Как защитить эти файлы ВООБЩЕ от просмотра, без гл. "руководителя" index.php?
Может так?
Код

defined( '_VALID_MOS' ) or die( 'Просмотр невозможен!' );

Это если учесть, что у меня в index.php строчка:
Код

define( '_VALID_MOS', 1 );

Вроде на локалке работаетsmile
Какой комент можно написать к данной фитче?smile
Как определиться мне, менюшки всякие- это модули или это просто includes (в них тоже будут различные функции)

100% модули:
-новости
-отправка сообщения на почту
-Ч.А.В.О.(будет на скороsmile)

Все вроде пока.

Начну делать новости. сразу вопрос, что в модуле должно содержаться?
Впринципе структура новостей:
-подключение к таблице
-замены, сплошные%) (всякие теги типа [b] [u] [i] и т.д.) можно потом правда сделать, когда будем делать в шаблоне...

Автор: Всемогущий 4.5.2007, 14:40
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=149154

Добавлено через 1 минуту и 49 секунд
Предположим новости создаёт человек со знанием HTML

Автор: CyClon 4.5.2007, 14:43
Предпочитаю структуру примерно такую:

Код

/index.php
/rss.php
/kernel/config/
/kernel/classes/
/kernel/functions/
/kernel/images/
/kernel/misc/
/kernel/themes


То есть, чтобы в корне не валялась куча файлов, а все было в папке типа kernel, engine и т.п.

Автор: Всемогущий 4.5.2007, 14:51
Цитата(CyClon @  4.5.2007,  16:43 Найти цитируемый пост)
Предпочитаю структуру примерно такую:

а разве может быть иначе? smile 

Автор: Alexey007 4.5.2007, 15:22
Всемогущий, про bbcode знаюsmile но потом, ближе к концу, будет его отладка(надеюсь вы мне поможете)


CyClon, можно и так, особой роли не играет, но спасибо.. может так будет удобнее smile 


Всемогущий, а что насчет того что я писал(про защиту чтения сис. файлов)?

Цитата(Alexey007 @  4.5.2007,  12:51 Найти цитируемый пост)
 сразу вопрос, что в модуле должно содержаться?


Добавлено через 2 минуты и 32 секунды
 smile Мне интересно, как ты читаешь посты? половину ваще пропускаешь.. писал бы: "На твое усмотрение" "Можно и так" "Понятия не имею"

Автор: Всемогущий 4.5.2007, 15:51
Цитата(Alexey007 @  4.5.2007,  17:22 Найти цитируемый пост)
Мне интересно, как ты читаешь посты? 

Предпологается иерархия 
Вы : Руководитель 
Я : Консультант по техническим вопросам.
Из этого следует что те части которые были предложены вами и не вызвали  резкой критики(естественно аргументированой) с моей стороны принимаются по умолчанию.
к примеру 

Цитата(Alexey007 @  4.5.2007,  14:51 Найти цитируемый пост)
defined( '_VALID_MOS' ) or die( 'Просмотр невозможен!' );



и теперь что б не сочли за пустую болтавню продолжаем обсужать

предлагаю сделать модуль новостей с такой структурой:
в бд хранятся 2 таблицы:

первая собственно с текстами новостей
вторая с отзывами

Добавлено @ 15:54
Код

CREATE TABLE `news` (                                      
          `id` int(10) unsigned NOT NULL auto_increment,           
          `time` datetime NOT NULL,                                
          `zaglavie` text NOT NULL,                                
          `text` text NOT NULL,                                    
          `nb_img` tinyint(1) NOT NULL,                            
          `n_img` tinyint(1) NOT NULL,                             
                
          PRIMARY KEY  (`id`),                                     
          UNIQUE KEY `time` (`time`),                              
          FULLTEXT KEY `poisk` (`text`)                            
        ) ENGINE=MyISAM   DEFAULT CHARSET=cp1251  

Автор: Alexey007 4.5.2007, 16:11
Ну по поводу новостей таблица уже заказана с такими критериями:
Код

CREATE TABLE `news` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `text` text,
  `site` varchar(50) default NULL,
  `date` date NOT NULL default '0000-00-00',
  `img` text NOT NULL,
  `visible` varchar(25) NOT NULL default 'on',
  PRIMARY KEY  (`id`)
);

Вот, нашкрябал.. Помогите улучшить и объединить 2 файла:
Файл коротких новостей
Код

$q="SELECT id, name, SUBSTRING_INDEX( text, ' ', 20 ) AS text, site, date, img, visible FROM news where visible='on' ORDER BY id desc";
    $res=mysql_query($q);
    while($row=mysql_fetch_array($res))
    {
     $id = $row[0];
     $name = $row[1];
     $text = $row[2];
     $site = $row[3];
     $date = $row[4];
     $img = $row[5];

   echo $name;
   echo $text;
   echo $site;
   echo $date;
   echo '<a href=&id='.$id.'>[Подробнее]</a>';
   echo '<hr>';
    }


 Файл длинных
Код

$row=mysql_fetch_array(mysql_query("SELECT * FROM news WHERE visible='on' and id=".$_GET['id']));
$id = intval($_GET['id']);
$sql = "(
        SELECT 0,`id`
        FROM `news`
        WHERE visible='on' and `id` <".$id."
        ORDER BY `id` DESC
        LIMIT 1
        )
        UNION (
        SELECT 1,`id`
        FROM `news`
        WHERE visible='on' and `id` >".$id."
        ORDER BY `id` ASC
        LIMIT 1
        )";
$query = mysql_query($sql) or die(mysql_error());
while(list($type,$nId) = mysql_fetch_row($query))
{
    if ($type == 0)
    {
    $back_to = '<a href=&id='.$nId.'>Предыдущая новость</a>';
    }
    elseif($type == 1)
      {
      $next_to = '<a href=&id='.$nId.'>Следущая новость</a>';
      }
}
echo '<table border="0" width="100%" cellspacing="0" cellpadding="0">
  <tr>
    <td width="33%" align="LEFT">'.$back_to.'</td>
    <td width="33%" align="CENTER"><a href="">Перейти на первую новостей</a></td>
    <td width="33%" align="RIGHT">'.$next_to.'</td>
  </tr>
</table>';
echo $row[name];
echo $row[text];
echo $row[site];
echo $row[date];
echo $row[img]);


P.S. Сразу скажу, что все эти echo данных так выглядеть НЕ должно... Все будет уходить в шаблон...

Автор: BuShaRt 4.5.2007, 16:12
 smile 
Допусти мы тоже не знаем не HTML не BB, но вот почему то я вполне, представив, что их забыл, могу сделать так:

Первая надписть
Вторая

Третья


Как я это сделал? smile))))
Просто мне в помощь пришел интерфейс на JavaScript, который вполне понятен, если конечно человек вообще способен что-либо понимать smile

Мораль: Если нужны функции редактирования текста, то ненадо мудрить, а делайте панель форматирования текста на JS.

http://www.woweb.ru/load/118-1-0-3500

Автор: Alexey007 4.5.2007, 16:14
Цитата(Alexey007 @  4.5.2007,  12:51 Найти цитируемый пост)
В каких форматах лучше хранить все модули? (т.е. все кроме index.php)

Ещё немаловажно

Добавлено через 2 минуты и 1 секунду
BuShaRt, у меня форма добаления новостей будет такая же, как на этом форуме(похожая).
А bbcode буду использовать только для того, чтобы в поле текста не было всяких тегов закрученных!

Автор: Всемогущий 4.5.2007, 17:04
сейчас пришло время разнообразных функций. будем делать всё на них

пока оставлю SQL как есть но мне кажется, что новости лучше выбирать по времени.

Код

<?php
//маленькие новости
$q="SELECT id, name, SUBSTRING_INDEX(text, ' ', 20) AS text, site, date, img, visible FROM news where visible='on' ORDER BY id desc";



$row=mysql_fetch_array(mysql_query("SELECT * FROM news WHERE visible='on' and id=".$_GET['id']));

$sql = "( SELECT 0,`id`  FROM `news` WHERE visible='on' and `id` <".$id."    ORDER BY `id` DESC   LIMIT 1   )
          UNION (SELECT 1,`id` FROM `news` WHERE visible='on' and `id` >".$id." ORDER BY `id` ASC  LIMIT 1  )";


$query = mysql_query($sql) or die(mysql_error());



         echo  universaltable($query);

function universaltable($result,$how=3){
         $mmm=@mysql_num_rows ($result);
         if($mmm<1)return false;
         $max=ceil($mmm/$how)*$how;
         echo '<table width="100%" border="1" cellpadding="0" cellspacing="0" > ';
         for($i = 1; $i <= $max; $i++) {
         if(($dd%$how)==0) echo '<tr>'."\r\n";
         if(is_array($row = mysql_fetch_assoc($result))){
         echo myrow($row);}else echo myrow(false);
         if((($dd-($how-1))%$how)==0)echo'</tr>'."\r\n";$dd++;}
         echo'</table>';
}
function myrow($row){
         if($row==false) return '<td>'.'------'.'</td>'."\r\n";
         $otvet=print_r($row,1);


         return '<td align="center">'.$otvet.'</td>'."\r\n";

}
function Oglavlenie($page,$kolvo,$inone,$otstup,$nameVARpage) {
        //$nameVARpage имя переменной которая содержит номер страници
        //где были туда и придём
         $Murl='"http://'.$_SERVER['HTTP_HOST'].$_SERVER["SCRIPT_NAME"];
         $myqery=$_GET; unset($myqery[$$nameVARpage]);

         //первый параметр номер страницы которая сейчас активна
         //$kolvo количество строк на одной странице
         //$start переменная в которая говорит  с какой страници будет начинаться оглавление
         //$stop соответственно заканчиавется

         //узнаем максимальное число страниц
        $maxpage=ceil ($kolvo/$inone) ;
         //$otstup; максимальное колво видимых номеров страниц
         //$page; номер страницы
         //$kolvo; общее кол во линий
         //$inone; линий на страницу
         $maxpage=ceil ($kolvo/$inone) ;
         if($maxpage==0){return 'Ничего не найдено.';}
         if($maxpage==1){return 'Всего одна страница.';}

         $start=$page-$otstup;if($start<1)$start=1;
         $stop=$page+$otstup ;if($stop>$maxpage)$stop=$maxpage;
         foreach(range ($start,$stop) as $v){
         $myqery[$nameVARpage]=$v;
         $endqery=$Murl.'?'.http_build_query($myqery);
         if($v==$page){$v='<b>['.$v.']</b>';}
         $oglavlenie[]='<a href='.$endqery.'">'.$v.'</a>';}



         return  implode(' | '."\r\n",$oglavlenie).' Всего страниц('.$maxpage.')';
}
?>

Автор: Alexey007 4.5.2007, 17:13
Всемогущий, это, надеюсь не PHP5? на сервере 4 стоит

Автор: Всемогущий 4.5.2007, 17:37
единственное отличие http_build_query 
http://forum.vingrad.ru/index.php?showtopic=144656&hl=http_build_query#

а вообще скоро выйдет php6 нужно модернезировать сервер

Автор: Alexey007 4.5.2007, 17:46
Если бы я знал как...
Во чо пишет:
Код

Notice: Undefined index: id in Z:\home\localhost\www\site\engine\modules\news.php on line 7

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\site\engine\modules\news.php on line 7

Notice: Undefined variable: id in Z:\home\localhost\www\site\engine\modules\news.php on line 9

Notice: Undefined variable: id in Z:\home\localhost\www\site\engine\modules\news.php on line 10
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY `id` DESC LIMIT 1 ) UNION (SELECT 1,`id`


Добавлено @ 17:58
 smile а как обновить пхп на сервере, там вроде только адмни хостинга может...

Автор: Всемогущий 4.5.2007, 18:05
ругань связана с тем что mysql ничего не вернула.

попробуй какой нибудь простой запрос и кинь весь получившийся html  в приват
потом отредактирую сообщение

Добавлено через 2 минуты и 29 секунд
совсем забыл
подправим слегка
Код

  function universaltable($result,$how=3){
         if(!is_object ($result))return false;
         $mmm=mysql_num_rows ($result);
         if($mmm<1)return false;
         $max=ceil($mmm/$how)*$how;
         echo '<table width="100%" border="1" cellpadding="0" cellspacing="0" > ';
         for($i = 1; $i <= $max; $i++) {
         if(($dd%$how)==0) echo '<tr>'."\r\n";
         if(is_array($row = mysql_fetch_assoc($result))){
         echo myrow($row);}else echo myrow(false);
         if((($dd-($how-1))%$how)==0)echo'</tr>'."\r\n";$dd++;}
         echo'</table>';
}

Автор: Alexey007 4.5.2007, 18:17
Всемогущий, так в каких форматах мне хранить все файлы?

Автор: mishaSL 4.5.2007, 19:54
Alexey007, даже не знаю с чего начать... начну с начала:

1. Мой совет по поводу этапности написания. Не надо начинать писать модули пока вы не определились окончательно с файловой структурой вашей CMS. Также было бы не плохо продумать структуру БД, тех таблиц которые не относятся к определенным модулям. 
Далее определиться какие системные классы (классы для работоспособности всей CMS) вам необходимы, к примеру класс для работы с БД, шаблонизатор (его вы уже упоменали) и т.д. Далее написать эти классы (и при этом хорошенько продумать их функции, а также удобство работы с этими классами). Если на данном этапе проблематично написание таких классов, то подобрать готовые и удобные для вас.
Дальше было бы логично начать с написания системы управления сайтом ("Админ-центр"). А потом уже пользовательскую часть.

2. По поводу конфига, на самом деле удобнее хранить конфиг в ассоциативном массиве. Но каждый делает как ему удобнее. Вы спрашивали что это:
Код

$config['db']['host'] = 'localhost';
$config['db']['user'] = '';
$config['db']['name_db'] = '';
$config['site']['path'] = '';
$config['site']['url'] = '';
// и т.д.

замечу что скорее всего вам понадобится адрес сайта, т.е. http://www.site.com

3. По поводу защиты файлов я до конца не понял, что вы конкретно имеете ввиду. Но скажу что я думаю по этому поводу: первое, насколько я понимаю все файлы будут подгружаться через index.php, тогда вполне будет достаточно определение константы, со следующей проверкой во всех файлах(то что вы предложили). Второе, правильно проставление прав доступа на файлы.

Дальше просто не по порядку замечания:

Цитата(Alexey007 @  2.5.2007,  16:02 Найти цитируемый пост)
а global ничего не портит в безопасности?

Использование global нежелательно.
Цитата(Alexey007 @  2.5.2007,  21:50 Найти цитируемый пост)
Простите за такую настойчивость, но как быть, если мне {PAGE} надо заменить фнукцией??

функция должна возвращать значение и ничего не выводить, и это значение подставляем вместо {PAGE}
Цитата(Alexey007)
Ко всему нужно делать проверку:Если в файле нет таких тегов, то направлять в СОВЕРШЕННО другой шаблон

Логика абсолютно непонятна.
Цитата(Alexey007)
скажи пожалуйста, а если создать "шаблон" средствами замены str_replace, т.е. вручную записать все замены {****}, от этого производительность не изменится?

Если я правильно понял о чем вы, то НЕТ.


Также было бы неплохо сразу продумать будете ли вы использовать ЧПУ, продумать структуру предполагаемых модулей.
Это то что пераое пришло на ум smile  

P.S. Также можете почитать эти темы:
http://forum.vingrad.ru/act-Search/CODE/show/searchid-29b064e582278e421fc9e52441ccb4f0/search_in-posts/result_type/topics/flag/search/highlite/cms/index.html

Автор: Alexey007 4.5.2007, 20:39
mishaSL, 
Цитата(mishaSL @  4.5.2007,  19:54 Найти цитируемый пост)
замечу что скорее всего вам понадобится адрес сайта

Возможно, но в каких целях?

Цитата(mishaSL @  4.5.2007,  19:54 Найти цитируемый пост)
Использование global нежелательно.

это я понял, вот и спрашивал как поправитьsmile ну по идее ещё придумаю, может идея есть какая-нить?


Цитата(mishaSL @  4.5.2007,  19:54 Найти цитируемый пост)
функция должна возвращать значение и ничего не выводить, и это значение подставляем вместо {PAGE}

уже разобрались все вместе smile 


Цитата(mishaSL @  4.5.2007,  19:54 Найти цитируемый пост)
Логика абсолютно непонятна.

Ну например, если тегов таких нет, то при выводе страницы, например, автоматически "приставлять" эти теги. Но НЕ изменять при этом файл.

Цитата(mishaSL @  4.5.2007,  19:54 Найти цитируемый пост)
Если я правильно понял о чем вы, то НЕТ.

Тогда наверно использовать регулярки?

Вроде все ответил...
А по поводу начать с админки, я не знаю как будет что устроено, что именно можно будет изменять\удалять

Автор: Alexey007 8.5.2007, 13:53
Шаблонный класс(отдельная функция и её проверка)
Помогите пожалуйста, знающие людиsmile
Проблема с реализацией:
Код

function get_templates_by_name($name){
       $i=0;
       $temp = '\''.implode("','",$name).'\'';
       $sql = 'SELECT * FROM `templates` where `name` IN ('.$temp.')';
       $result = mysql_query($sql) or die(mysql_error()) ;
       while ($line[$name[($i++)]] = mysql_fetch_assoc($result)) { }
   return $line;
       }
       $need=array('index', 'news_short');
       $bbb=get_templates_by_name($need) ;
       echo   $bbb['index'];

Таблица шаблонов:
Код

CREATE TABLE `templates` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `template` text NOT NULL,
  PRIMARY KEY  (`id`)
);
INSERT INTO `templates` VALUES (1, 'index', 'ШАБЛОН');


А выводит ошибку:
Notice: Undefined offset: 2 in Z:\home\localhost\www\site\engine\modules\news.php on line 6
Array

Автор: -=Ustas=- 8.5.2007, 14:11
Код

$line = array();
while ($row = mysql_fetch_assoc($result)) { $line[$name[($i++)]] = $row; }

Автор: Alexey007 8.5.2007, 14:19
-=Ustas=-, спасибо, ошибка убралась, но вот только теперь он вы водит Array
А должен шаблон(т.е. содержимое таблицы)

Автор: Alexey007 8.5.2007, 15:13
Вот решение (Всемогущий конешно помог)

Код

  function get_templates_by_name($name){
    $temp = '\''.implode("','",$name).'\'';
    $sql = 'select name, template from `templates` where   `name` IN ('.$temp.')';
    $result = mysql_query($sql) or die(mysql_error()) ;
    while ($dtemp=mysql_fetch_assoc($result)) {
        $gotovo[$dtemp['name']]=$dtemp['template'];
    }
    return   $gotovo ;
   }
  $need = array('index', 'news_short', 'block');
  $bbb = get_templates_by_name($need) ;
  echo $bbb['news_short'];
 

Автор: -=Ustas=- 9.5.2007, 00:13
Alexey007,  http://php.net/array

Добавлено через 2 минуты и 55 секунд
Точнее http://ru2.php.net/manual/en/language.types.array.php

Автор: Alexey007 9.5.2007, 10:33
-=Ustas=-, спасибоsmile пригодится, думаю, в процессе smile  smile 

Автор: v_enom 18.10.2007, 22:54
много букоф...
не на самом деле я начал по этой теме тоже делать движок, но вижу что она не закончена, поэтому прошу экспертов разъяснить просто концепцию того, что нужно сделать.

Пожалуйста, напишите из чего состоит дивжок(самый простой) как работает, что от куда должен брать и с чем взамиодействовать.
В инете искал тему - не нашел, там одним готовые CMS

Автор: SergV 17.1.2008, 13:25
Цитата

Пожалуйста, напишите из чего состоит дивжок(самый простой) как работает, что от куда должен брать и с чем взамиодействовать.
В инете искал тему - не нашел, там одним готовые CMS

Это всё зависит от потребностей. Это может быть типа хтмл сайта с пхп или яваскрипт вставками к примеру для организации определённых форм, или ещё что. Или иметь один index.php, а всё что выводится формируется в нём через пхп скрипты связанные с базой данных, или если без базы данных, то с текстовыми файлам где лежит необходимый контент. Плюс это авторизация пользователей, плюс админка для управления сайтом, плюс что угодно.
Если хочешь узнать подробней, просто посмотри различные CMS в работе и их внутренности.

Автор: bash 19.2.2008, 22:38
Цитата
Пожалуйста, напишите из чего состоит дивжок(самый простой) как работает, что от куда должен брать и с чем взамиодействовать.
В инете искал тему - не нашел, там одним готовые CMS



Пройди по этой ссылке:
http://www.nulled.ws/showthread.php?t=39068

Скачав этот курс и просмотрев его сразу отпадут все вопросы, поймёш что с чем взаимодействует, откуда берётся и счего начать...

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