За последние 24 часа нас посетили 17735 программистов и 1687 роботов. Сейчас ищут 1137 программистов ...

Подскажите с отделением шаблона от сайта

Тема в разделе "PHP для новичков", создана пользователем vova_b, 9 мар 2009.

  1. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Привет! Например есть сайт разделен на 3 области, в 1 области 2 ссылки, нажав на 1 ссылку выведуться данные в область 2, а нажав на вторую ссылку в области 1, данные вивидуться в область 3 при этом в области 2 останеться то что выводилось до этого, тоеть надо обеспечить независимоть областей, как это реализовать, если шаблон отдельно будет например в папке templates???
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Разбирайся


    index.php
    PHP:
    1. <?
    2. $result=array();
    3. include_once "classes/tpl.php"; // класс шаблонизатора
    4. $tpl=new tpl();
    5. if(!empty($_GET['act'])){
    6.   if(file_exists($modulname="moduls/{$_GET['act']}.php")){ // папка с модулями - moduls
    7.      include $modulname; // инклюд модуля
    8.   }else{
    9.      $result['error']="Нет такого модуля {$_GET['act']}";
    10.   }
    11. }else{
    12.   include "moduls/index.php"; // Дефолтный модуль
    13. }
    14. $tpl->set($result);
    15. print $tpl->load("index.tpl");
    16. ?>
    classes/tpl.php
    PHP:
    1. <?
    2. class tpl {
    3.     public $path="tpl"; // папка с шаблонами
    4.     public $vars=array();
    5.     function Set($name,$val=false){
    6.         if(!is_array($name)){
    7.            $this->vars[$name]=$val;
    8.         }else{
    9.            foreach($name as $k=>$v)$this->Set($k,$v);
    10.         }
    11.     }
    12.     function load($tplname){
    13.         if(file_exists($tln=$this->path.'/'.$tplname)){
    14.            @ob_start();
    15.            extract($this->vars);
    16.            include $tln;
    17.            $res=ob_get_contents();
    18.            ob_clean();
    19.            return $res;
    20.         }else{
    21.           trigger_error("Ошибка нет шаблона $tln",E_USER_ERROR);
    22.         }
    23.    }
    24. }
    25. ?>
    moduls/index.php
    PHP:
    1. <?
    2. $content=array(
    3.      "res"=>"Какой-то контент",
    4.      "name"=>"Чего-то там",
    5. );
    6. $tpl->Set("result",$content);
    7. $result['content']=$tpl->load("index_index.tpl"); // Шаблон модуля
    8. ?>
    tpl/index.tpl
    HTML:
    1. <?if($error){?>Ошибка <?=$error;?><br><?}?>
    2. <?=$content?>
    3. </body>
    4. </html>
    tpl/index_index.tpl
    HTML:
    1. <div style="border:1px solid red"><?print_r($result);?></div>
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Mr.M.I.T.
    PHP:
    1.  if(file_exists($modulname="moduls/{$_GET['act']}.php")){ // папка с модулями - moduls
    2.       include $modulname; // инклюд модуля
    этот код потенциально опасный в том плане, что можно заинклудить любой php файл. Безопасным его можно сделать так:
    PHP:
    1. $_GET['act'] = basename($_GET['act']);
     
  4. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Я очень благодарен, но я новечек в php и я не увидел сдесь реальзации задачи, можно в кратце пояснить
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    врятли, это готовый пример каркаса простого модульного сайта
    могу только если конкретно что-то не понятно
    Сергей, вообще не известно работает ли, писал в браузере с ходу
     
  6. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Не стоит в таком случае писать =)

    В чём именно проблема реализации? Есть какой-нибудь набросок? Попытка?
     
  7. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Впринцепе работает, только выдает ошибку:Warning: Missing argument 2 for tpl::Set(), called in /home/vov4i196/domains/free-library.ru/public_html/g/test/index.php on line 14 and defined in /home/vov4i196/domains/free-library.ru/public_html/g/test/classes/tpl.php on line 5, задача в том что сайт нужно разбить на модули и в каждый модуль подгружать php файлы, тоесть сайт разбит на 2 части в первой части находяться ссылки, при нажатии на ссылку например новости, в второю часть грузиться фаил news.php, благодаря этому коду я могу выводить значение переменной content, а прогрузить фаил news.php при этом миняеться только 2-я часть а 1-я в которой ссылки и 3-я не миняються
     
  8. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    [​IMG] Вот смотрите, когда я нажимаю на link грузиться blok1 в первую область, а еще надо что при нажании на link2 block2 грузился во 2-ю, то есть соседнюю, область, при этом значение области 1 меняться не должно.....
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ты не прав
    vova_b
    подредактировал код
    это меняет суть дела, если по путному, то нужно всё переписывать, а если по быстрому просто внести нужные изменения в сам модуль, типа так
    PHP:
    1. <?
    2.  $content1=array(
    3.      "res"=>"Какой-то контент",
    4.      "name"=>"Чего-то там",
    5.  );
    6.  $tpl->Set("result1",$content1);
    7. if($_GET['sub_act']=='newblock'){
    8.     $content2=array(
    9.      "res"=>"Какой-то контент2",
    10.      "name"=>"Чего-то там2",
    11.     );
    12.     $tpl->Set("result2",$content2);  
    13. }
    14.  $result['content']=$tpl->load("index_index.tpl"); // Шаблон модуля
    15.  ?>
    или нужно этот блок в главный шаблон?
    тогда в этом модуле присвой нужное значение $result например $result['content_block_2']="Контент блока 2";
     
  10. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Данный пример не работает, и я не очень понял почему этот код должен делать то что я говорил
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    типа урл index.php?act=news&sub_act=newblock
    а вообще наверно всётаки
     
  12. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Если чесно я не понял вопроса, мне уже не удобно перед вами. Я вообще пишу cms не чего сложного будет система новостей и впринцепе все, нужно просто разделить php от шаблона, я смотрел шаблонизаторы но не понял, у меня будут допустим модуль news.php вот я зашел на сайт http://sait.ru/ineex.php вверху шапка сбоку меню по средине будет выводиться инфа, я в меню выбрал пункт новости, и в средний блок должны вывестись новости, а сценарий описан в файле news.php(ну тоесть считывание сновости с бд и постраничный вывод), при этом шапка свержу и меню слева не должны меняться, тоесть 3 блока которые не зависимы друг от друга
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Короче, смотрите код =)
    Главный буфер $result ключи этого массива будут переменные в шаблоне index.tpl
    абсолютно без разницы в какой части движка будет заполняться $result лишь бы до вывода
    как ещё объяснить я не знаю, может на примере
    index.php
    HTML:
    1. <?
    2. /* ... */
    3. $result['menu']="Меню Меню Меню";
    4. $tpl->set($result);
    5. print $tpl->load("index.tpl");
    6. ?>
    в шаблоне
    PHP:
    1. <?=$menu;?>
     
  14. vova_b

    vova_b Активный пользователь

    С нами с:
    26 июн 2007
    Сообщения:
    21
    Симпатии:
    0
    Я практически все понял, единственное что не получаеться создать 2 блока...... и код который вы только что привели в файле с блоком писать?