[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP вывод в шаблоне
Страницы: 1, 2
Эли4ка
Здравствуйте, дорогие форумчане, встала проблема. Есть template файл tmpl.tpl:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>
{title} </title>
</head>
<body
bgcolor={bgcolor}>
{text}
</body>
</html>


Нужно обработать все конструкции вида {var_name}. Пока делаю так( тестовый вариант):
<?php
$bgcolor = '#CCFFCC';
$text = 'Тест класса!';
$title = 'ТЕСТ!';
$data = file_get_contents('tmpl.tpl');
$data = str_replace('{bgcolor}', $bgcolor, $data);
$data = str_replace('{text}', $text, $data);
$data = str_replace('{title}', $title, $data);
echo $data;
?>


Но как быть, если переменных будет больше и нужно будет выводить не один раз, а в цикле( например запрос к БД и там 50, 100.. ответов, файл template может быть немного другого вида )
Спасибо.
walerus
Эли4ка
Я по такому же принципу обрабатываю(может и не лучший вариант). Получил данные, подгрузил темплейт, сделал замену - вывел...

Если будет больше переменных, использовать массивы, что - на что менять, чуть меньше строк получится biggrin.gif
Arh
Эли4ка
А почему не хочешь использовать php?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> <?=
$title?> </title>
</head>
<body
bgcolor=<?=bgcolor?>>
<?=
$text?>
</body>
</html>


Конечно на 2% менее красиво, зато с подсветкой кода в редакторе, с возможностью выполнять код, в том числе циклы.

Цитата
Но как быть, если переменных будет больше и нужно будет выводить не один раз, а в цикле( например запрос к БД и там 50, 100.. ответов, файл template может быть немного другого вида )


Придётся компилировать твой синтаксис в php, кэшировать это во временный файл, а потом исполнять его вместо file_get_contents. Костыль на костыле, который со временем мутирует в чудовище типа twig, который будет умолять убить его)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Эли4ка
Цитата
Эли4ка
А почему не хочешь использовать php?

Arh, у меня сейчас такая конструкция. Хочу попробовать сделать так: php только в php; шаблоны-только html. Где-то видела, что применяется, но не могу найти
Цитата
Эли4ка
Я по такому же принципу обрабатываю(может и не лучший вариант). Получил данные, подгрузил темплейт, сделал замену - вывел...

Если будет больше переменных, использовать массивы, что - на что менять, чуть меньше строк получится biggrin.gif

walerus, а не покажете свою реализацию? или секрет?
Эли4ка
brevis, спасибо, просто идеально
brevis
Там правда модификатор /e в новых версиях php deprecated. Если что -- можно соорудить решение не хуже с помощью preg_replace_callback().

_____________
Чатик в телеге
Эли4ка
brevis, у меня пока 5.3.
Видела, что в новом году вышли 5.6.33, 7.1.13 и 7.2-но их я пока ставить не собираюсь. Вот.
depp
Эли4ка
php изначально язык шаблонизатор. использование twig и прочих шаблонизаторов только замедляет приложение и усложняет его.
Эли4ка
Понимаю, но как же тогда выводить html?
Игорь_Vasinsky
так там сразу вывод с заменой.

но я тоже за нативный синтаксис

<?=$title;?>


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
sergeiss
Эли4ка, у меня с давних времен валяется простейший шаблонизатор. Он не поддерживает циклов. Но работает он с любым куском HTML. Его можно вызывать в цикле для обработки однотипных кусков кода. Например, при создании списка чего-нибудь, ну хотя бы товаров в интернет-магазине.

Темплейт достаточно простой. Это HTML со вставками имен переменных ПХП, безо всяких там скобок.
  <div class="article-small row">
<div
class="col-xs-4 col-sm-4">
<img
data-src="$articlePhoto" class="prepare-template article-image"/>
</div>
<div
class="col-xs-8 col-sm-8">
<h2>
$articleTitle</h2>
<h3>
$articleSubtitle</h3>
<div>
Автор:<span>$articleAuthor</span></div>
<div>
$articleShortContent</div>
</div>
</div>


Функция обработки темплейта
показать
function executeTemplate($tmpl, $arr = []) {
if (is_array($arr) && count($arr) > 0) {
extract($arr);
}

// преобразуем все спецсимволы HTML в их сущности
$useTemplate = htmlspecialchars($tmpl);

// делаем подстановку всех переменных
eval('$evaluatedTemplate = ' . "\"$useTemplate\";");

// преобразуем все сущности HTML в спецсимволы и выводим в поток
echo htmlspecialchars_decode($evaluatedTemplate);
} //


Ну и использование темплейта:
показать
// загрузка темплейта из файла
$tmplKey = loadTemplate('article_small');

// после загрузки данных из БД и/или их подготовки любым другим способом
foreach ($articles as $key => $article) {
executeTemplate($templatesArray['article_small'], $article);
}


В предыдущем коде $articles - это массив всех данных, прочитанных из БД, $article - ассоциативный массив, по сути одна строка из БД. Ключи в $article являются одновременно именами переменных в темплейте, те самые $articleTitle, $articleSubtitle и другие - это существенно!


Изначально я ставил себе задачу, чтобы темплейт был универсальный, т.е. чтобы с ним можно было работать как в ПХП, так и в JS. Задача была достигнута :) Тут есть свои ограничения, куда ж без них. Но система на 100% рабочая, с поставленной задачей справляется.
Почему, говоришь, еще и в JS? Чтобы при подгрузке данных аяксом и динамическом обновлении использовать тот же темплейт. Дабы не мудрить ничего лишнего.

PS. Насчет ключей в массиве $article. Естественно, они там без знака "доллар"! $artilce['articleTitle'], $article['articleSubtitle']

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.