Разделение логики и представления при написании сайта

Deert

Новичок
Всем Здравствуйте. Я здесь новичок и это мой первый пост )))) Так вот. написал сайт, но не понимаю как лучше разделить логику и представление. Кто сможет помочь - помогите.
PHP:
<?php

    //Устанавливаем уровень ошибок и стратуем сессии

    error_reporting(-1);
    session_start();
    ob_implicit_flush(0);
    
    //Создаем константы с путями
    define("BASE_DIR", "http://" . $_SERVER['HTTP_HOST'] . "/"); //Индексный путь
    define("TMP_DIR", BASE_DIR . "template/"); //Путь к папке с шаблоном
    define("SYS_DIR", BASE_DIR . "system/"); //Путь к системной папке
    define("SYS_KEY", true); //Создаем ключ для того чтоб к чичтемным файлам не обратились на прямую
    $mod = trim(htmlspecialchars($_GET['mod']));
    
    //Подключаем файлы настроек. Именно соеденяемся с БД, настройки сайта(title, keywords, max file size uploading и т.д.), 
    //и файл в котором к определенной странице подключается орпделенные скрипты или стили
    require './system/data/db.php';
    require './system/data/config.php';
    require './system/library/scripts.php';

    //Объявляем функция для загрузки классов
    function __autoload ($class)
      {
        if($class = "index")
        {
          $class_dir = "system/system.php";
        }
        else
        {
           $class_dir = 'system/classes/' . $class . '.class.php';
        }
       
        if(!file_exists($class_dir))
        {
           exit ("На сайте отсутсвует класс: <b>" . $class . "</b>. Он необходим для работы скрипта.");           
        } 
        else
        {
           require './system/classes/' . $class . '.php';
        }
                                                  
      }
      
            
      $index = new index; //Создаем экземпляр класса index
      $snipet = new snippets; //Создаем экземпляр класса snippets
      $engine = new engine; //Создаем экземпляр класса engine
      $template = new template; //Создаем экземпляр класса template
      $main_tpl = $index->load_template("main.tpl", TMP_DIR); //Перемменная с главным шаблоном сайта
      
      //Проверяем если человек авторизован не забанен ли он? и дан ли ему доступ к просмтору откл. сайта?
        if(isset($_COOKIE['user_hash']))
        {
         $hash = mysql_real_escape_string($_COOKIE['user_hash']);
         $select_user = mysql_query("SELECT `banned` FROM `users` WHERE `hash`='". $hash ."' and `public`='1'") or die("Произошла MySQL ошибка: " . mysql_error());
         if(mysql_num_rows($select_user) > 0)
         {
               $group = $snipet->user_group($_COOKIE['user_hash']);
               
               if($group['banned'] == 1)
               {
                  exit($index->load_template("banned.tpl", TMP_DIR));
               }
               
            if($config['work_site'] == "off")
             {
               if($group['view_offsite'] == 0)
               {
                  exit($config['work_offsite_text']);
               }
            }
           $user = true;
          }
         else
         {
            if($config['work_site'] == "off")
             {
               exit($config['work_offsite_text']);
            }
            $user = false;
         }
        }    

    
    
          
      if(isset($mod))
        {
        
         switch($mod)
           {
              case "news":
               $page = $engine->news();//Модуль показа новостей
              break;
              
              case "category":
                $page = $engine->category(); //Модуль показа категории
              break;
              
              default:
                $page = $engine->GetModul(); //Если указан иной модуль то ищем в папке с модулями файл, с таким именем как у модуля
              break;
           
            }
         
        }
        else
        {
           $page = $engine->index();
        }
        
        
        //проверяем, были ли ошибки в результате выполнения скрипта?
        if($_SESSION['engine_error'][0])
        {
           exit($_SESSION['engine_error'][0]);
        }        
        
                        
            echo strtr($main_tpl, array(
            
                 '{content}'         => $_SESSION['content'], 
                 '{poll}'            => $template->poll(), 
                 '{popnews}'         => $template->popularnews(), 
                 '{search}'          => $template->search(), 
                 '{login}'           => $template->login(), 
                 '{arhives}'         => $template->arhiv(), 
                 '{title}'           => $_SESSION['title'], 
                 '{engine_scripts}'  => $_SESSION['engine_scripts']
                                       )
                     );
И выкладываю код файла system.php
PHP:
<?php

    if(!defined('SYS_KEY'))
    {
       exit('Несанкционированный доступ к файлу');
    }
    
    class index {
    
      public function load_template($tpl, TMP_DIR)
       {
         $tpl = TMP_DIR . $tpl;
         
         if(!file_exists($tpl))
         {
            $_SESSION['engine_error'][] = "Невозможно прочитать файл шаблона: <b>" . $tpl . "</b>";
            $result = false;            
         }
         else
         {
            $result = file_get_contents($tpl);
         }
         return $result;
       }
    
    }
 

С.

Продвинутый новичок
Суть разделения логики и представления состоит в том, что эти компоненты могут модифицироваться независимо друг от друга. Как это делается практически -- не регламентировано. Есть только принципы, основанные на здравом смысле. Например логично было бы код, отвечающий за логику и представление размещать в разных файлах.
 

Linker

Новичок
Deert

вот эта вот строка:
PHP:
$mod = trim(htmlspecialchars($_GET['mod']));
совершенно ненужная, абсолютно,
т.к. далее, в блоке switch, переменная $mod сравнивается c определённым конкретным значением, соответственно даже саму переменную можно не заводить $mod, а просто $_GET['mod'] сразу использовать.
 

Фанат

oncle terrible
Команда форума
Всем Здравствуйте. Я здесь новичок и это мой первый пост ))))
Добро пожаловать. Новичков мы любим и всегда поможем.
не понимаю как лучше разделить логику и представление.
Начни, пожалуй, с коротенькой статьи http://phpfaq.ru/tpl , а главное - с её практической части. Если что-то непонятно - то спрашивай. Но по-моему, там всё предельно ясно.
как можно па колдовать с моим кодом?
Замечаний к коду очень много.
начиная с того, что слово TMP ассоциируется только с временными файлами, а не с шаблонами (которые обычно сокращают до TPL), и того, что значение константы, имя которой содержит слово DIR, не может начинаться на "http://" - что приводит тебя к чудовищным архитектурным решениям, типа хранения контента страницы в сессии. для начала ознакомься с вот этим текстом http://phpfaq.ru/paths и срочно перепиши свой код так, чтобы он работал с файлами
и заканчивая нежизнеспособностью твоего шаблонизатора.
 

Фанат

oncle terrible
Команда форума
кроме того, с функциями доступа к БД нельзя работать напрямую. обязательно надо написать класс или хотя бы функцию-обёртку
и данные нельзя помещать в запрос напрямую, а только через плейсхолдер.
Постарайся осилить хотя бы половину статьи http://habrahabr.ru/post/148701/ и воспользуйся хогтя бы функцией dbget() из неё.
 

Deert

Новичок
Linker понял, спс.
Начни, пожалуй, с коротенькой статьи http://phpfaq.ru/tpl , а главное - с её практической части. Если что-то непонятно - то спрашивай. Но по-моему, там всё предельно ясно.
Ну в принципе все понятно.
срочно перепиши свой код так, чтобы он работал с файлами
Из вашей ссылки я понял, что прописывать путь к файлам через HTTP нельзя, нужно например использовать $_SERVER['DOCUMENT_ROOT']

А можно увидеть хотя б приблизительную структуру кода, и файлов нормально написанную?
 

Фанат

oncle terrible
Команда форума
посмотри какой-нибудь из известных фреймворков. CI, Yii, symfony

Правда, просто "посмотреть" не получится, придётся конкретно изучать.
Но зато и результат будет стоить того
 

Deert

Новичок
А на сколько реально написать все грамотно самому???
 

С.

Продвинутый новичок
Да без проблем. Только грамоту познать надо.
 

Deert

Новичок
мне все говорят, что надо разделять логику и представления. А в инете столько паттернов то и не знаешь как придумать
 

WMix

герр M:)ller
Партнер клуба
по моему мнению, разделение логики и представления заключается хотябы в том, что сначала идут вычисления без единого HTML, а далее чистый HTML с выводом переменных и возможными контрольными структурами, важно что и то и другое легко читается...

разделение на модель, контроллер и представление это дополнение, те. выделение кода по сбору данных, вырезается из основной логики и выносится в отдельные, для каждой модели свои файлы.

обертка базы данных в дополнительный класс дает еще один уровень абстракции, именуемый DAO...

что стоит написать такое?

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

с DAO уже несколько сложнее... важно понять зачем это делается...

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

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

PS мое скудное обьясние ни вкоем случае не понимать буквально, но как совет...

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

AmdY

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

Фанат

oncle terrible
Команда форума
Если будешь спортом заниматься - то не покроешься.
(если ты думал, что программирование отличается от других точных наук, и его можно освоить за 2 дня, то ты, к сожалению, ошибся)
 

Фанат

oncle terrible
Команда форума
Бегло просмотрел. но ничего не понял.
Если это у тебя работает - ну что ж, пользуйся.
Хотя все замечания остались на месте, но никто и не ждал, что ты за два дня всё исправишь.
 
Сверху