За последние 24 часа нас посетили 20098 программистов и 1608 роботов. Сейчас ищут 1880 программистов ...

Простой шаблонизатор

Тема в разделе "PHP для новичков", создана пользователем ds837, 29 авг 2010.

  1. ds837

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

    С нами с:
    25 авг 2010
    Сообщения:
    11
    Симпатии:
    0
    Скажите пожалуйста где я неправ

    Есть фал шаблона называется bit.html в нём есть вот такие строчки

    Код (Text):
    1. <ul>
    2. <li>[TER]</li>
    3. <li>[BID]</li>
    4. </ul>
    есть код для обработки шаблона

    PHP:
    1. $dev .= file_get_contents('dir/bit.html');//Получаю содержимое файла в виде одной строки
    2. $ver = str_replace('[TER]', 'Название', $dev);//Заменяю строку поиска на строку замены
    3.        
    4. $tyr = create_function('$w', 'include "upload/$w";');//Создаю анонимную функцию
    5. $ver = str_replace('[BID]', $tyr('file.php'), $ver);//Заменяю строку поиска на строку замены
    6.    
    7. echo $ver; 
    в файле file.php простой код
    PHP:
    1. <?php
    2. echo 'текст';
    3. ?>
    с выводом [TER] всё хорошо а вот с [BID] беда выводится, но не в шаблон, а сверху, где я не прав, грешу на create_function(); но не знаю как сделать правильно
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    сама по себе реализация через одно место.
    насколько я знаю, в шаблонизаторах так не делается.
    создаётся класс шаблонизатора и к нему происходит обращение.

    т.е. код файла file.php при нормальном подходе должен быть:
    PHP:
    1.  
    2. <?php
    3.   $templater = new Templater('dir/bit.html');
    4.  
    5.   $ter = 'some text';
    6.   $bid = 'text bid'
    7.  
    8.   $templater->set('TER', $ter);
    9.   $templater->set('BID', $bid);
    10.  
    11.   $templater->show();
    12. ?>
    13.  
     
  3. ds837

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

    С нами с:
    25 авг 2010
    Сообщения:
    11
    Симпатии:
    0
    я не спорю,
    но тут как бы у меня задача не переписывать вывод из шаблона,
    а понять почему файл с include не хочет выводится через шаблон

    PHP:
    1. $tyr = create_function('$w', 'include "upload/$w";');//Создаю анонимную функцию
    2. $ver = str_replace('[BID]', $tyr('file.php'), $ver);//Заменяю строку поиска на строку замены
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  5. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    для начала следует понять разницу между инклудом и чтением файла.
    в данном случае нужно просто считать файл в переменную, а не инклудить его.

    насчёт динамического создания функции - забудь, тут это лишнее.

    PHP:
    1.  
    2. function tyr($filename){
    3.   $content = file_get_contents($filename) or die("File {$filename} cannot be read");
    4.   return $content;
    5. }
    6.  
    7. $ver = str_replace('[BID]', tyr('file.php'), $ver);
    8.  
    9.  
    содержимое file.php
    ==================
    текст
    ==================
     
  6. ds837

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

    С нами с:
    25 авг 2010
    Сообщения:
    11
    Симпатии:
    0
    да всё работает но тут есть проблема она корректно работает только с текстом в вот если в файле file.php

    такой код то он просто его читает и не исполняет. вот тут у меня загвоздка

    PHP:
    1. <?php $row = mysql_query('SELECT * FROM name;'); ?>
    2.  
    3. <table cellpadding="0" cellspacing="0">
    4.  
    5. <?php while ($result = mysql_fetch_assoc($row)){ ?>
    6.     <tr>
    7.         <td><a href="<?php echo $row['werte'] ?>"><?php echo $row['reter'] ?></a></td>
    8.     </tr>
    9. <?php } ?>
    10.  
    11. </table>
     
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    при инклуде код файла ВЫПОЛНЯЕТСЯ. сразу! т.е. вывод будет сделан по ходу выполнения.
    в твоём случае выход только один - использовать нормальный шаблонизатор.

    ты хочешь совместить несовместимое. когда-то раньше я тоже хотел это совершить :)

    пользуйся функциями
     
  8. ds837

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

    С нами с:
    25 авг 2010
    Сообщения:
    11
    Симпатии:
    0
    а есть ли функции в php чтобы вывести что генерирует файл например file.php

    то есть задумка такая

    1) генерируем файл (получаем в виде кода html)
    2) с функцией file_get_contents //Получаем содержимое файла в виде одной строки
    3) с функцией str_replace //Заменяем строку поиска на строку замены
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ds837
    Вообще надо в функции делать
    PHP:
    1. include "upload/$w";
    2. return ob_get_clean();
    но это страшно, криво, убого и бессмысленно O.O
     
  10. ds837

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

    С нами с:
    25 авг 2010
    Сообщения:
    11
    Симпатии:
    0
    [vs]
    спасибо это то что нужно, сделал так

    PHP:
    1. function bler($w)
    2. {
    3.      ob_start();
    4.      include "upload/$w";
    5.      return ob_get_clean();
    6. }
    7.  
    8. $dev .= file_get_contents('dir/bit.html');//Получаю содержимое файла в виде одной строки
    9. $ver = str_replace('[TER]', 'Название', $dev);//Заменяю строку поиска на строку замены
    10.          
    11. $ver = str_replace('[BID]', bler('file.php'), $ver);//Заменяю строку поиска на строку замены
    особо время на генерацию страницы не увеличилось, останавливаюсь на этом варианте, так как это лучше чем выводит html теги с помощью php.

    Gromo
    спасибо за объяснение того чего я не понимал