За последние 24 часа нас посетил 25281 программист и 1616 роботов. Сейчас ищут 1133 программиста ...

Свой шаблонизатор

Тема в разделе "PHP для новичков", создана пользователем Mister_X, 14 окт 2024 в 11:41.

  1. Mister_X

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

    С нами с:
    25 ноя 2013
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте.
    Помогите решить задачу, а то пазл не как не складывается у меня

    Есть такой файл test.tpl с таким содержимым

    Код (Text):
    1.  
    2. <html>
    3.   <head>...</head>
    4.   <body>
    5.     <div id='test_1'>
    6.       <div>
    7.         ...
    8.       </div>
    9.       {php}
    10.          for($i=0; $i<10; $i++) { echo $i; }
    11.       {/php}
    12.     </div>
    13.     <div id='test_2'>
    14.       <div>
    15.         ...
    16.       </div>
    17.       {php}
    18.         for($t=0; $t<10; $t++) { echo $t; }
    19.       {/php}
    20.     </div>
    21.   </body>
    22. </html>
    С помощью регулярных выражений я нахожу всё что находится между {php} и {/php} вот только не понимаю как запустить эти циклы. Пробовал с помощью eval и вроде всё получилось ... вот только циклы отработали за пределами блоков. Подскажите как можно запустить php внутри тегов {php} и {/php} при этом что бы структура сайта не ломалась?
     
    #1 Mister_X, 14 окт 2024 в 11:41
    Последнее редактирование: 14 окт 2024 в 11:48
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    367
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Добрый день!
    Попробуйте сделать так:
    PHP:
    1. <?
    2. $test_tpl = file_get_contents("test.tpl");
    3. $test_php = str_replace(["{php}","{/php}"], ["<?","?>"], $test_tpl);
    4. eval ("?>".$test_php);
    или так:
    PHP:
    1. <?
    2. $test_tpl = file_get_contents("test.tpl");
    3. $test_php = str_replace(["{php}","{/php}"], ["<?","?>"], $test_tpl);
    4. file_put_contents("test.php", $test_php);
    5. include_once "test.php";
    В обоих решениях в браунзер отправится
    HTML:
    1.   <head>...</head>
    2.   <body>
    3.     <div id='test_1'>
    4.       <div>
    5.         ...
    6.       </div>
    7.       0123456789    </div>
    8.     <div id='test_2'>
    9.       <div>
    10.         ...
    11.       </div>
    12.       0123456789    </div>
    13.   </body>
    14. </html>
    Удачи!
     
    #2 Vladimir Kheifets, 14 окт 2024 в 15:45
    Последнее редактирование: 14 окт 2024 в 15:54
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    Лучше бы сначала посмотреть, как работают поп. шаблонизаторы ;)
     
  4. Mister_X

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

    С нами с:
    25 ноя 2013
    Сообщения:
    8
    Симпатии:
    0
    Спасибо большое за помощь. Я в принципе делал так же за исключением одной вещи. Когда писал eval() то писал без "?>"
    Как писал я
    Код (Text):
    1. eval($test);
    А надо было
    Код (Text):
    1. eval("?>".$test);
    Ещё раз спасибо большое за помощь
    Смотрел, но к сожалению моему не до конца разобрался. Если сможете подсказать хорошие мануалы на эту тему буду признателен.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    Оно ближе ко второму показанному выше варианту. Только без повторной генерации нативного для пыха шаблона каждый раз.