Как сделать шаблонный движок php? - PullRequest
5 голосов
/ 04 апреля 2011

Мне нужно сделать небольшой и простой шаблонный движок php. Я много искал, и многие из них были слишком сложны для понимания, и я не хочу использовать smarty и другие подобные движки, у меня есть идея из Stack Overflow, например:Вот так:

$template = file_get_contents('file.html');
$array = array('var1' => 'value',
                'txt' => 'text');

foreach($array as $key => $value)
{
  $template = str_replace('{'.$key.'}', $value, $template);
}

echo $template;

Теперь вместо эха шаблона я просто хочу добавить «file.html», и он отобразит файл с правильными значениями переменных, и я хочу поместить движок в отдельное место ипросто включите его в шаблон, что я хочу использовать, объявите массив и в конце включите html-файл, такой как phpbb.Извините, я прошу многое, но может ли кто-нибудь просто объяснить основную концепцию этого?

РЕДАКТИРОВАТЬ: Ну, позвольте мне быть откровенным, я делаю сценарий форума, и у меня есть тонны идей для этого, но я хочу сделать егосистема шаблонов, такая как phpbb, так что мне нужен отдельный пользовательский движок шаблонов, если вы можете помочь, тогда, пожалуйста, приглашаем работать со мной.извините за объявление ..: p

Ответы [ 4 ]

11 голосов
/ 04 апреля 2011

file.html:

<html>

<body>
<h3>Hi there, <?php echo $name ?></h3>
</body>

</html>

file.php:

<?php
    $name = "Keshav";
    include('file.html');
?>

Не проще, чем это. Да, он использует глобальные переменные, но если просто название игры, то это оно. Просто зайдите на «http://example.com/file.php'» и вперед.

Теперь, если вы хотите, чтобы пользователь видел «file.html» в адресной строке браузера, вам нужно настроить свой веб-сервер так, чтобы он обрабатывал файлы .html как сценарии PHP, что немного сложнее, но определенно выполнимо , Как только это будет сделано, вы можете объединить оба файла в один:

file.html:

<?php
    $name = "Keshav";
?>
<html>

<body>
<h3>Hi there, <?php echo $name ?></h3>
</body>

</html>
6 голосов
/ 04 апреля 2011

Что, если для упрощения поддержки сценария вы переместите его в функции?

как то так:

<?php

function get_content($file, $data)
{
   $template = file_get_contents($file);

   foreach($data as $key => $value)
   {
     $template = str_replace('{'.$key.'}', $value, $template);
   }

   return $template;
}

И вы можете использовать это так:

<?php

$file = '/path/to/your/file.php';
$data = = array('var1' => 'value',
                'txt' => 'text');

echo get_content($file, $data);
3 голосов
/ 04 апреля 2011

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

Такой подход find'n areplace намного медленнее, чем компиляция в PHP. Он не очень хорошо справляется с побегом (у вас будут проблемы с XSS). Добавить условия и циклы будет довольно сложно, и они вам понадобятся рано или поздно.

1 голос
/ 18 июля 2013
    <?php
    class view {
        private $file;
        private $vars = array();

        public function __construct($file) {
            $this->file = $file;
        }

        public function __set($key, $val) {
            $this->vars[$key] = $val;
        }

        public function __get($key, $val) {
            return (isset($this->vars[$key])) ? $this->vars[$key] : null;
        }

        public function render() {
            //start output buffering (so we can return the content)
            ob_start();
            //bring all variables into "local" variables using "variable variable names"
            foreach($this->vars as $k => $v) {
                $$k = $v;
            }

            //include view
            include($this->file);

            $str = ob_get_contents();//get teh entire view.
            ob_end_clean();//stop output buffering
            return $str;
        }
    }

Вот как это использовать:

    <?php
    $view = new view('userprofile.php');
    $view->name = 'Afflicto';
    $view->bio = "I'm a geek.";
    echo $view->render();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...