Обработка смешанного HTML и PHP кода с приравниванием в переменную.

Тема в разделе "PHP", создана пользователем trooll, 26 сен 2011.

Модераторы: latteo
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Приветствую.

    есть два файла:
    1) tpl.php :
    PHP:
    <html>
    <head>
        <title><?php echo $title?></title>
    </head>
    <body>

    <?php echo $body?>

    </body>
    </html>
    и

    2) index.php :
    PHP:
    <?php
    $title 
    'ЗАГОЛОВОК ДОКУМЕНТА';
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

    include(
    './tpl.php');
    ?>
    Сейчас скрипт просто вставляет содержимое файла tpl.php в скрипт index.php подставляет переменные и выплевывает в браузер.

    Интересуют варианты обработки tpl.php не в браузер, а в переменную. То есть необходимо результат не выплюнуть в браузер, а вернуть переменной. Вот как бы это реализовать. Файл tpl.php редактировать нельзя. Только сам скрипт index.php.
     
  2. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    да собственно с помощью простых функций работы с файлами...
    например:
    PHP:
    <?php 
    $title 
    'ЗАГОЛОВОК ДОКУМЕНТА'
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'

    //include('./tpl.php'); 
    $lines file('./tpl.php');
    foreach (
    $lines as $line_num => $line) {
        echo 
    "Строка #<b>{$line_num}</b> : " htmlspecialchars($line) . "<br />\n";
    }
    ?>
    все зависит от того с какой целью это все делается...
     
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Не не то... Получилось в итоге:
    Код:
    Строка #0 : <html> 
     Строка #1 : <head> 
     Строка #2 : <title><?php echo $title; ?></title> 
     Строка #3 : </head> 
     Строка #4 : <body> 
     Строка #5 : 
     Строка #6 : <?php echo $body; ?> 
     Строка #7 : 
     Строка #8 : </body> 
     Строка #9 : </html>
    А надо если на конкретном твоем примере так:
    Код:
    Строка #0 : <html> 
     Строка #1 : <head> 
     Строка #2 : <title>ЗАГОЛОВОК ДОКУМЕНТА</title> 
     Строка #3 : </head> 
     Строка #4 : <body> 
     Строка #5 : 
     Строка #6 : ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА 
     Строка #7 : 
     Строка #8 : </body> 
     Строка #9 : </html>

    То есть надо исполнить код в tpl.php и загнать его в переменную, но все это дело должно произойти в скрипте index.php.


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

    Вот и интересует есть ли возможность исполнить код в tpl.php но не выводить его а просто передать результат отработки этого кода переменной.
     
  4. barabula

    barabula

    Регистр.:
    21 май 2009
    Сообщения:
    470
    Симпатии:
    77
    PHP:
    Если я тебя правильно понял. то это делается при помощи синтаксиса heredoc
    <?php 
    include('./tpl.php'); 
    $title 'ЗАГОЛОВОК ДОКУМЕНТА'
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'

        
    $str = <<<EOD
    <html> 
    <head> 
    <title>
    $title</title><br/> 
    </head> 
    <body> 
    $body
    </body> 
    </html> 
    EOD;
    echo 
    $str
      

    ?>

    Вообщем возможно где-то ошибся, но в теории должно работать
     
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Нет, не то, ты не правильно понял задачу.

    код в файле tpl.php должен исполниться в среде скрипта index.php и результат исполнения tpl.php необходимо присвоить переменной.

    если бы шаблон tpl.php находился в одном файле (index.php) то это бы выглядело так:
    PHP:
    <?php
    $title 
    'ЗАГОЛОВОК ДОКУМЕНТА';
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

    $out '<html>
    <head>
        <title>'
    .$title.'</title>
    </head>
    <body>
        '
    .$body.'
    </body>
    </html>'
    ;
    ?>
    но у нас шаблон находиться в внешнем файле, его надо подцепить к скрипту index.php исполнить его в index.php и приравнять результат исполнения переменной.
     
  6. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    756
    Симпатии:
    221
    Забери тогда файл через
    PHP:
    <?php 
    $title 
    'ЗАГОЛОВОК ДОКУМЕНТА'
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'
    $TPLF=file_get_contents("tpl.php");
    $TPLF=str_replace("{title}","$title",$TPLF);
    $TPLF=str_replace("{key}","$title",$TPLF);
    echo 
    $TPLF;
    или записать в файл.
    В чем выгода  того  что в дизайне будут переменные?
    ?>
    что то делаем с переменной
    PHP:
    $tpl
    сождержащей шаблон
    только зачем в шаблоне пихать переменные, не проще сунуть сразу что то типа
    так
    HTML:
     <html> 
    <head> 
        <title>{title}</title> 
    </head> 
    <body> 
        {body}
    </body> 
    </html>
     
  7. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Нет это вариант не уместен. Надо именно то что я описал выше. Ибо именно от такой логике обработки шаблона и ухожу, стараюсь по возможности исключить и как можно больше сократить всевозможный парсинг и пляски со строками в обработчике.
     
  8. Delk0

    Delk0

    Регистр.:
    26 мар 2010
    Сообщения:
    284
    Симпатии:
    47
    Не нужно никаких плясок со строками и парсинга.
    Достаточно просто перехватить выходной поток

    PHP:
    <?php
    $title 
    'ЗАГОЛОВОК ДОКУМЕНТА';
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

    ob_start();
    include(
    './tpl.php');
    $text ob_get_contents();
    ob_end_clean();

    ?> 
    Готово )
     
    trooll нравится это.
  9. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    :yahoo: Ага робит, я догадывался что это можно реализовать функциями ob_* но почемуто оставил их на десерт, надо было сразу попробовать.

    Ну в общем вариант пока годиться подводных камне пока не увидел, буду тестировать. Собственно если кто то может предложить другое решения делитесь, обсудим...
     
  10. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    главное - фантазия ;)
    если у тебя во втором файле только конструкции вроде <?php echo $somevar; ?>, то можно так:
    PHP:
    <html
    <
    head
        <
    title>$title</title
    </
    head
    <
    body

    $body

    </body
    </
    html>
    и
    PHP:
    <?php
    error_reporting
    (E_ALL & ~E_NOTICE);
    $title 'ЗАГОЛОВОК ДОКУМЕНТА'
    $body 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';
    eval(
    "\$t=\"".file_get_contents("2.php")."\";");
    echo 
    $t;
    ?>
    а если с несложными текстовыми функциями, то можно и так:
    PHP:
    <html
    <
    head
        <
    title>".strtolower($title)."</title
    </
    head
    <
    body

    $body

    </body
    </
    html>