Forum Webscript.Ru
Программирование => PHP => Тема начата: AlieN от 20 Марта 2002, 20:39:52
-
Суть задачи:
все шаблоны лежат в базе для некоторых страниц существуют шаблоны с переменными (как в этом форуме). Изучал исходники форума, но там всё слишком запутано ничего не понял :(
в общем попытался сделать тупо:
list($header)=mysql_fetch_array(mysql_query("select content from znak_template where template_name=\\"header\\""));
eval($header);
print $header;
Шаблон header содержит:
$title
пишет:
Parse error: parse error in \\index.php(136) : eval()\'d code on line 1
Что делать?
-
нужно вот так:
eval(\'print "\'.$header.\'";\');
-
Вот так?:
function gettemplate($name)
{
list($template)=mysql_fetch_array(mysql_query("select content from znak_template where template_name=\\"$name\\" "));
return ($template);
}
function print_start($title)
{
$title="yo";
$header=gettemplate("header");
eval(\'print $header\');
}
Если да то всё равно ошибки
-
напиши так как я написал!!!
eval(\'print $header\'); - ну нельзя так писать, сразу несколько ошибок
1. нет точки с запятой после $header
2. не взят $header в кавычки
3. в одинарных кавычках пеерменные ($) не подставляются, \\n, \\r и т.д.
-
Так?
function gettemplate($name)
{
list($template)=mysql_fetch_array(mysql_query("select content from znak_template where template_name=\\"$name\\" "));
return ("$template");
}
function print_start($title)
{
$title="yo";
$header=gettemplate("header");
eval("print \\"$header\\";");
}
Если нет по не пиши как исправлять а исправленный код плиз
-
замени
return ("$template");
на
return addslashes($template);
-
возможна еще такая конструкция:
eval(\'$p= "\'.addslashes($tpl).\'";\');
?>
-
Ок код работает!
А как теперь грамотно их подгружать т.е. если на странице используется 20 шаблонов это 20 евалов и следовательно 40 операторов :(
-
Значит так и подгружать.
А лучше в файлах хранить. я же класс специально писал.
Может еще версию для БД сделаю.
-
Britva
да класс я видел но как бы это понять самому охота :)
-
Посмотри еще исходники форума XMB 1.5+
он использует шаблоны из БД, можешь также здесь скачать тут http://mybboard.com (бывшая команда XMB)
-
имхо, хранение шаблонов в файлах создает меньшую нагрузку на сервер, показывает большую производительность, плюс более безопасный вариант решения.
-
Dm
вроде в базе безопаснее т.к. можно выставить права на коннект только с локалхоста
-
AlieN
а если с localhost\'а еще кто-то подключится? ;)
вообще это вопрос спорный, который уже ни раз решали.
и все зависит от программера и админа.
-
Dm
Я программер и админ в одном лице :)
--------------------------------------------------
Теперь общий вопрос как-бы завершить тему:
--------------------------------------------------
У меня загружается скрипт
по условию он пределил в какую попрограмму ему подгружать это и так ясно теперь самое глуое:
это подгрузка шаблонов из базы , но тут возникает другой вопрос допустим для данной страницы требуется 3 шаблона
начало страницы c генерируемым титулом статическая часть и конец страницы тоже статический.
С этой подпрограммой всё ясно и понятно но тепербь другая подпрограмма: там порядка 7 темплейтов 5 из которых динамические т.е. как грамотно обрабатывать и подгружать не нагружая код одинаковыми опетаорами для каждого динамического темплейта?
-
AlieN
я тоже админ и программер. и что?
но с производительностью согласен?
не согласен - попробуй ab ;)
-
Ещё раз о птичках!
Кто-нить подкинет мазу как правильно подгружать темплейты?
-
http://forums.webscript.ru/showthread.php?s=&threadid=3239
-
Dm
Ну те темплейты есть детство - т.е. требуется написать такую систему которая поддерживает хотя бы тройную вложенность темплейтов
т.е.
$template1="blabla1 $template2";
$template2="blabla2 $template3";
$template3="blabla3 Yo";
и чтобы в итоге при
print $template1
было:
blabla1 blabla2 blabla3 Yo
-
AlieN
могу скинуть свой вариант решения. можно хоть тысячу вложенных шаблонов сделать.
используется eval.
-
Dm
А он SQL использует?
Если да - то кидай
kex_net@mail.ru
-
AlieN
нет. все забирает из файлов. так быстрее получается.
прикрутить базу данных - не проблема, если нужно.
ЗЫ. сейчас отправлю
-
Dm
Поймал сурс.
Ещё-бы пример работы не помешало-бы + алгоритм работы - хорошо
-
Неплохо было бы выкладывать - ссылку или часть кода.
-
простейший класс работы с шаблонами:
class template {
var $template_dir = \'./templates/\';
var $ext = \'.html\';
var $template = array();
var $templates = array();
function load($names) {
$names = explode("|", $names);
foreach($names as $name) {
$fl = file($this->template_dir.$name.$this->ext);
$this->templates[$name] = implode("", $fl);
}
}
function add($id_tpl, $name_tpl, $data_tpl) {
extract($data_tpl);
if(isset($this->template[$id_tpl])) { $p = "."; } else { $p = " "; }
eval(\'$this->template[$id_tpl]\'.$p.\'= "\'.addslashes($this->templates[$name_tpl]).\'";\');
$this->template[$id_tpl] = str_replace("\\\'", "\'", $this->template[$id_tpl]);
}
}
?>
переменные:
$template_dir - каталог с файлами шаблонов
$ext - расширение файлов шаблонов
функции:
load(names) - загружает шаблон(ы) в массив $template из файлов.
Если загружается один шаблон, $names = "001". Если несколько, они разделяются
символом "|" - $names = "001|002|005|006". Сделано для того, чтобы загружать
определенные файлы шаблонов.
add(id, name, data) - производит замену переменных в шаблоне на данные и размещает результат
в массив $templates. Причем, если функцию повторить для уже использованного ключа, то
полученные данные прибавляются.
id - имя ключа.
name - название шаблона (обращается к $template).
data - массив переменных для замены в шаблоне. Вид: array("variable" => "value");
пример:
$t->add("links", "003", array( "namelink" => "test link",
"link" => "/test");
$t->add("output", "002", array( "title" => "test page",
"charset" => $charset,
"links" => $t->template["links"]));
echo $t->template["output"];
-
! Ура я уже почти понял !
Пришлось перекопать половину исходников данного форума ужасно.
В общем скоро будет написан интересный класс работы с шаблонами с использованием MySQL кому интересен сурс - мыльте
-
AlieN
лучше напиши здесь, где его можно будет скачать.
-
Dm
Можешь рассказать об алгоритме загрузки и вывода шаблонов?
-
описание функций уже было.
что именно не понятно?
-
Dm
Желательно чтобы ты описал каждую строчку
и
echo $t->template["output"];
-
AlieN
echo $t->template["output"];
вывод результирующей странички из "output", которая, в свою очередь, создается с помощью:
$t->add("output", "002", array( "title" => "test page",
"charset" => $charset,
"links" => $t->template["links"]));
и файла шаблона 002.html.
более подробно пиши, что не понятно.
-
Dm
Ты можешь описать построчно ???
PS: дико торможу
-
class template {
var $template_dir = \'./templates/\';
var $ext = \'.html\';
var $template = array();
var $templates = array();
function load($names) {
$names = explode("|", $names); // получение имен загружаемых шаблонов
foreach($names as $name) {
$fl = file($this->template_dir.$name.$this->ext); // читаем файл с шаблоном
$this->templates[$name] = implode("", $fl); // сохраняем в массиве
}
}
function add($id_tpl, $name_tpl, $data_tpl) {
extract($data_tpl); // см. ман
if(isset($this->template[$id_tpl])) { $p = "."; } else { $p = " "; } // если такой id результат существует, добавляем, иначе - создаем.
eval(\'$this->template[$id_tpl]\'.$p.\'= "\'.addslashes($this->templates[$name_tpl]).\'";\'); // производим замену переменных и запись в массив с результатами
$this->template[$id_tpl] = str_replace("\\\'", "\'", $this->template[$id_tpl]);
}
}
?>
ps. надеюсь, так будет понятнее.
-
Понял спасибо!
-
$this->template[$id_tpl] = str_replace("\'", "\'", $this->template[$id_tpl]);
обнаружил баг в выводе этого кода в форуме.
одним словом, в этой строчке необходимо произвести замену одинарной кавычки со слешем (\\\\\') на кавычку (\') без слеша.
-
Dm
Поизучав я в коде бритвы одну вещь не понял но работает он лучше
-
AlieN
пиши подробнее, что именно?
-
function gettemplate($template,$endung="htm")
{
global $templatefolder;
if(!$templatefolder) $templatefolder = "templates";
return str_replace("\\"","\\\\\\"",implode("",file($templatefolder."/".$template.".".$endung)));
}
function dooutput($template)
{
global $td_bgColor, $td_textColor ;
$template = str_replace("bgcolor=\\"title\\"","bgcolor="."$td_bgColor",$template);
$template = str_replace("color=\\"title\\"","color="."$td_textColor",$template);
echo $template;
}
V function1 mojesh delat viborku iz bazi.. prinzip yasen
-
Kuulest
А другие переменные из шаблона интеплетироваться будут?
-
Vse peremenniye yavlyayushiyasya globalnimi pri vizove function parsyatsya..to est
$data=\'12 Jan 2001\';
dooutput(....)
v temptlate pishesh $data;
-
ya eto delo ispolzuyu chtobi izmenenie zvetov i prochaya mura ne stanovilis pitkoy, znachenie peremennih bgcolor,l_color(link) nahodyatsya v file globals.inc
-
Vot bolee ponyatniy variant
function gettemplate($template,$endung="htm")
{
global $templatefolder;
if(!$templatefolder) $templatefolder = "templates";
return str_replace("\\"","\\\\\\"",implode("",file($templatefolder."/".$template.".".$endung)));
}
echo gettemplate($template);
-
Kuulest
следовательно чтобывыплюнуть один шаблон мне требуется вот что:
$template=gettemplate("blabla");
echo gettemplate("blabla");
верно?
-
//Taking Current Date
$date= (date ("l, F j, Y"));
//Template Folder:
$templatefolder=\'../../pars/eng/templates/catalogue/\';
//Producing Output:
eval("dooutput(\\"".gettemplate("catalogue_main")."\\");");
-
Kuulest
Да с этим я уже разобрался:
я класс бритвы решил использовать
-
во-первых, можно исходники выделять? [ php ]; [ /php ]
во-вторых, AlieN, напиши подробнее о твоих умозаключениях, просто интересно.
в-третьих, Kuulest, имхо, твой пример менее функционален.
плюс используются конструкции поиска/замены текста.
а это влияет на производительность.
-
1)Ссылку долго искать она в FAQ этого раздела есть шаблоны называется
2) Предоставлет хорошую гибкость - несложно будет потом на mysql переписать