Forum Webscript.Ru

Программирование => PHP => Тема начата: AlieN от 20 Марта 2002, 20:39:52

Название: Темплейты
Отправлено: 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


Что делать?
Название: Темплейты
Отправлено: Britva от 20 Марта 2002, 21:00:33
нужно вот так:
eval(\'print "\'.$header.\'";\');
Название: Темплейты
Отправлено: AlieN от 20 Марта 2002, 21:03:45
Вот так?:

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\');
}

Если да то всё равно ошибки
Название: млииин
Отправлено: Britva от 20 Марта 2002, 21:11:43
напиши так как я написал!!!

eval(\'print $header\'); - ну нельзя так писать, сразу несколько ошибок
1. нет точки с запятой после $header
2. не взят $header в кавычки
3. в одинарных кавычках пеерменные ($) не подставляются, \\n,  \\r и т.д.
Название: Темплейты
Отправлено: AlieN от 20 Марта 2002, 21:16:13
Так?

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\\";");
}

Если нет по не пиши как исправлять а исправленный код плиз
Название: эх
Отправлено: Britva от 20 Марта 2002, 21:36:39
замени
Цитировать
return ("$template");

на
return addslashes($template);
Название: Темплейты
Отправлено: Dm от 21 Марта 2002, 00:30:51
возможна еще такая конструкция:
eval(\'$p= "\'.addslashes($tpl).\'";\');
?>
Название: Темплейты
Отправлено: AlieN от 21 Марта 2002, 11:33:39
Ок код работает!
А как теперь грамотно их подгружать т.е. если на странице используется 20 шаблонов это 20 евалов и следовательно 40 операторов :(
Название: Темплейты
Отправлено: Britva от 21 Марта 2002, 11:42:21
Значит так и подгружать.
А лучше в файлах хранить. я же класс специально писал.
Может еще версию для БД сделаю.
Название: Темплейты
Отправлено: AlieN от 21 Марта 2002, 12:30:48
Britva
да класс я видел но как бы это понять самому охота :)
Название: Темплейты
Отправлено: Britva от 21 Марта 2002, 12:57:19
Посмотри еще исходники форума XMB 1.5+
он использует шаблоны из БД, можешь также здесь скачать тут http://mybboard.com (бывшая команда XMB)
Название: Темплейты
Отправлено: Dm от 21 Марта 2002, 18:56:47
имхо, хранение шаблонов в файлах создает меньшую нагрузку на сервер, показывает большую производительность, плюс более безопасный вариант решения.
Название: Темплейты
Отправлено: AlieN от 21 Марта 2002, 19:13:12
Dm
вроде в базе безопаснее т.к. можно выставить права на коннект только с локалхоста
Название: Темплейты
Отправлено: Dm от 21 Марта 2002, 21:46:02
AlieN
а если с localhost\'а еще кто-то подключится? ;)
вообще это вопрос спорный, который уже ни раз решали.
и все зависит от программера и админа.
Название: Темплейты
Отправлено: AlieN от 22 Марта 2002, 14:39:11
Dm
Я программер и админ в одном лице :)
--------------------------------------------------
Теперь общий вопрос как-бы завершить тему:
--------------------------------------------------
У меня загружается скрипт
по условию он пределил в какую попрограмму ему подгружать это и так ясно теперь самое глуое:
это подгрузка шаблонов из базы , но тут возникает другой вопрос допустим для данной страницы требуется 3 шаблона
начало страницы c генерируемым титулом статическая часть и конец страницы тоже статический.

С этой подпрограммой всё ясно и понятно но тепербь другая подпрограмма: там порядка 7 темплейтов 5 из которых динамические т.е. как грамотно обрабатывать и подгружать не нагружая код одинаковыми опетаорами для каждого динамического темплейта?
Название: Темплейты
Отправлено: Dm от 22 Марта 2002, 21:32:11
AlieN
я тоже админ и программер. и что?
но с производительностью согласен?
не согласен - попробуй ab ;)
Название: Темплейты
Отправлено: AlieN от 26 Марта 2002, 13:56:13
Ещё раз о птичках!

Кто-нить подкинет мазу как правильно подгружать темплейты?
Название: Темплейты
Отправлено: Dm от 26 Марта 2002, 19:47:24
http://forums.webscript.ru/showthread.php?s=&threadid=3239
Название: Темплейты
Отправлено: AlieN от 27 Марта 2002, 13:29:09
Dm
Ну те темплейты есть детство - т.е. требуется написать такую систему которая поддерживает хотя бы тройную вложенность темплейтов
т.е.
$template1="blabla1 $template2";
$template2="blabla2 $template3";
$template3="blabla3 Yo";
и чтобы в итоге при
print $template1

было:

blabla1 blabla2 blabla3 Yo
Название: Темплейты
Отправлено: Dm от 27 Марта 2002, 18:22:06
AlieN
могу скинуть свой вариант решения. можно хоть тысячу вложенных шаблонов сделать.
используется eval.
Название: Темплейты
Отправлено: AlieN от 27 Марта 2002, 19:00:13
Dm
А он SQL использует?
Если да - то кидай
kex_net@mail.ru
Название: Темплейты
Отправлено: Dm от 27 Марта 2002, 19:08:07
AlieN
нет. все забирает из файлов. так быстрее получается.
прикрутить базу данных - не проблема, если нужно.

ЗЫ. сейчас отправлю
Название: Темплейты
Отправлено: AlieN от 29 Марта 2002, 20:58:39
Dm
Поймал сурс.
Ещё-бы пример работы не помешало-бы + алгоритм работы - хорошо
Название: Темплейты
Отправлено: Britva от 29 Марта 2002, 22:26:03
Неплохо было бы выкладывать - ссылку или часть кода.
Название: Темплейты
Отправлено: Dm от 29 Марта 2002, 23:56:56
простейший класс работы с шаблонами:

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"];
Название: Темплейты
Отправлено: AlieN от 02 Апреля 2002, 14:53:56
! Ура я уже почти понял !
Пришлось перекопать половину исходников данного форума ужасно.
В общем скоро будет написан интересный класс работы с шаблонами с использованием MySQL кому интересен сурс - мыльте
Название: Темплейты
Отправлено: Dm от 02 Апреля 2002, 19:26:00
AlieN
лучше напиши здесь, где его можно будет скачать.
Название: Темплейты
Отправлено: AlieN от 04 Апреля 2002, 12:24:07
Dm
Можешь рассказать об алгоритме загрузки и вывода шаблонов?
Название: Темплейты
Отправлено: Dm от 04 Апреля 2002, 16:45:25
описание функций уже было.
что именно не понятно?
Название: Темплейты
Отправлено: AlieN от 04 Апреля 2002, 16:56:34
Dm
Желательно чтобы ты описал каждую строчку
и
Цитировать
echo $t->template["output"];
Название: Темплейты
Отправлено: Dm от 04 Апреля 2002, 17:04:16
AlieN
Цитировать
echo $t->template["output"];

вывод результирующей странички из "output", которая, в свою очередь, создается с помощью:
Цитировать
$t->add("output", "002", array(    "title"            => "test page",
                                "charset"        => $charset,
                                "links"            => $t->template["links"]));

и файла шаблона 002.html.

более подробно пиши, что не понятно.
Название: Темплейты
Отправлено: AlieN от 04 Апреля 2002, 17:23:07
Dm
Ты можешь описать построчно ???

PS: дико торможу
Название: Темплейты
Отправлено: Dm от 04 Апреля 2002, 17:32:59

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. надеюсь, так будет понятнее.
Название: Темплейты
Отправлено: AlieN от 04 Апреля 2002, 17:36:10
Понял спасибо!
Название: Темплейты
Отправлено: Dm от 04 Апреля 2002, 20:15:07
Цитировать
$this->template[$id_tpl] = str_replace("\'", "\'", $this->template[$id_tpl]);

обнаружил баг в выводе этого кода в форуме.
одним словом, в этой строчке необходимо произвести замену одинарной кавычки со слешем (\\\\\') на кавычку (\') без слеша.
Название: Темплейты
Отправлено: AlieN от 05 Апреля 2002, 19:15:53
Dm
Поизучав я в коде бритвы одну вещь не понял но работает он лучше
Название: Темплейты
Отправлено: Dm от 06 Апреля 2002, 02:18:35
AlieN
пиши подробнее, что именно?
Название: Темплейты
Отправлено: Kuulest от 06 Апреля 2002, 13:32:39
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
Название: Темплейты
Отправлено: AlieN от 06 Апреля 2002, 13:46:27
Kuulest
А другие переменные из шаблона интеплетироваться будут?
Название: Темплейты
Отправлено: Kuulest от 06 Апреля 2002, 13:55:28
Vse peremenniye yavlyayushiyasya globalnimi pri vizove function parsyatsya..to est

$data=\'12 Jan 2001\';
dooutput(....)
v temptlate pishesh $data;
Название: naschet bgcolor color
Отправлено: Kuulest от 06 Апреля 2002, 13:58:02
ya eto delo ispolzuyu chtobi  izmenenie zvetov i prochaya mura ne stanovilis pitkoy,  znachenie peremennih bgcolor,l_color(link) nahodyatsya v file globals.inc
Название: Sorry za flud prosto.. horoshaya mislya prihodit oposlya
Отправлено: Kuulest от 06 Апреля 2002, 14:00:30
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);
Название: Темплейты
Отправлено: AlieN от 06 Апреля 2002, 14:10:48
Kuulest
следовательно чтобывыплюнуть один шаблон мне требуется вот что:
$template=gettemplate("blabla");
echo gettemplate("blabla");

верно?
Название: Vot jivoy primer
Отправлено: Kuulest от 06 Апреля 2002, 15:19:49
//Taking Current Date
     $date= (date ("l, F j, Y"));
//Template Folder:
     $templatefolder=\'../../pars/eng/templates/catalogue/\';
//Producing Output:
     eval("dooutput(\\"".gettemplate("catalogue_main")."\\");");
Название: Темплейты
Отправлено: AlieN от 06 Апреля 2002, 16:00:20
Kuulest
Да с этим я уже разобрался:
я класс бритвы решил использовать
Название: Темплейты
Отправлено: Dm от 06 Апреля 2002, 21:08:03
во-первых, можно исходники выделять? [ php ]; [ /php ]

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

в-третьих, Kuulest, имхо, твой пример менее функционален.
плюс используются конструкции поиска/замены текста.
а это влияет на производительность.
Название: Темплейты
Отправлено: AlieN от 07 Апреля 2002, 15:21:00
1)Ссылку долго искать она в FAQ этого раздела есть шаблоны называется
2) Предоставлет хорошую гибкость - несложно будет потом на mysql переписать