|
|
|
| Типа такого
{{loop id=0}}
<div>
{{var1}}
{{loop id=1}}
<div>
{{var2}}
</div>
{{loop;}}
</div>
{{loop;}}
|
Пока только так
tables.htm
<table border="1" cellspacing="0" cellpadding="4">
<tr><th>Имя</th><th>Возраст</th></tr>
{{loop id=0}}<tr><td>{{name}}</td><td>{{age}}</td></tr>{{loop;}}
</table>
<br><br>
<table border="1" cellspacing="0" cellpadding="4">
<tr><th>Имя</th><th>Должность</th></tr>
{{loop id=1}}<tr><td>{{name}}</td><td>{{post}}</td></tr>{{loop;}}
</table>
|
page.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{{Title}}</title>
</head>
<body>
{{Content}}
</body>
</html>
|
test.php
<?php
define("RootPath", str_replace("\\", "/", dirname($_SERVER["PHP_SELF"])));
define("AbsolutePath", str_replace("\\", "/", realpath(".")));
require AbsolutePath."/system/config.php";
require AbsolutePath."/system/consts.php";
require AbsolutePath."/system/vars.php";
require AbsolutePath."/system/functions.php";
date_default_timezone_set($timezone);
function __autoload($ClassName) {
require AbsolutePath."/system/classes/$ClassName.class.php";
}
$tpl = new Template("tables.htm");
$tpl->Loop(0)->vars[0]["name"] = "Иван";
$tpl->Loop(0)->vars[0]["age"] = "18";
$tpl->Loop(0)->vars[1]["name"] = "Мария";
$tpl->Loop(0)->vars[1]["age"] = "17";
$tpl->Loop(0)->vars[2]["name"] = "Сергей";
$tpl->Loop(0)->vars[2]["age"] = "22";
$tpl->Loop(1)->vars[0] = array("name" => "Иван", "post" => "Программист");
$tpl->Loop(1)->vars[1] = array("name" => "Мария", "post" => "Менеджер");
$tpl->Loop(1)->vars[2] = array("name" => "Сергей", "post" => "Генеральный директор");
$tpl->parse();
$content = $tpl->asString();
$tpl = new Template("page.htm");
$tpl->vars["Title"] = "Тест";
$tpl->vars["Content"] = $content;
$tpl->parse();
echo $tpl;
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Тест</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="4">
<tr><th>Имя</th><th>Возраст</th></tr>
<tr><td>Иван</td><td>18</td></tr><tr><td>Мария</td><td>17</td></tr><tr><td>Сергей</td><td>22</td></tr>
</table>
<br><br>
<table border="1" cellspacing="0" cellpadding="4">
<tr><th>Имя</th><th>Должность</th></tr>
<tr><td>Иван</td><td>Программист</td></tr><tr><td>Мария</td><td>Менеджер</td></tr><tr><td>Сергей</td><td>Генеральный директор</td></tr>
</table>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 22:23)
| | чем не устраивает просто замена
{{loop .. на <?php for...
и т.п? | |
|
|
|
|
|
|
|
для: psychomc
(16.11.2010 в 22:41)
| | eval и буферизация, я сначала так хотел, но потом передумал. | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 22:43)
| | видно я давно перерос этот форум ни на один вопрос я тут ещё ни разу ответа не получил... | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 22:55)
| | http://www.php.ru/forum/viewforum.php?f=27 о форум php.ru это что-то один долбоёб хвалится другому что однажды в жизни мини-форум написал... мастер-класс по созданию гостевой книги, рекурсивный обход каталога... что за хуйня? сегодня был в банке снимал деньги и пока ждал когда перевод оформят, открыл журнал(не помню название) и там неутешительные данные по IT в России были что наша страна производит 0.2-0.5% софта в мире, а США 37%... | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 23:17)
| | И среди 37% треть русских трудится)) | |
|
|
|
|
|
|
|
для: grafen
(17.11.2010 в 07:56)
| | думаю вряд ли | |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 22:43)
| | хм...ни то ни другое. делаете замену -> сохраняете файл -> подключаете с помощью include/require | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 01:23)
| | Не понял...
Попытался представить чтоже должно у меня получится если отпарсить такой такой шаблон:
{{loop id=L1}}
<h3>{{Heading}}</h3>
<ul>
{{loop id=L2}}
<li>{{Item}}</li>
{{loop;}}
</ul>
{{loop;}}
|
Код на пхп:
<?php
Class Node {
public $vars = array();
public $childs = array();
public function __construct($vars = array(), $childs = array()) {
$this->vars = $vars;
$this->childs = $childs;
}
}
$Tree = array();
$Tree["L1"][] = new Node();
$Tree["L1"][] = new Node();
$Tree["L1"][0]->vars["Heading"] = "Работа";
$Tree["L1"][1]->vars["Heading"] = "Недвижимость";
$Tree["L1"][0]->childs = array("L2" => array(new Node(array("Item" => "Резюме"))));
$Tree["L1"][0]->childs["L2"][1] = new Node(array("Item" => "Вакансии"));
$Tree["L1"][1]->childs = array("L2" => array(new Node(array("Item" => "Жильё"))));
$Tree["L1"][1]->childs["L2"][] = new Node(array("Item" => "Коммерческая"));
$Tree["L1"][1]->childs["L2"][] = new Node(array("Item" => "Производство"));
$Tree["L1"][1]->childs["L2"][] = new Node(array("Item" => "Прочая нежилая"));
echo "<pre>";
print_r($Tree);
|
Array
(
[L1] => Array
(
[0] => Node Object
(
[vars] => Array
(
[Heading] => Работа
)
[childs] => Array
(
[L2] => Array
(
[0] => Node Object
(
[vars] => Array
(
[Item] => Резюме
)
[childs] => Array
(
)
)
[1] => Node Object
(
[vars] => Array
(
[Item] => Вакансии
)
[childs] => Array
(
)
)
)
)
)
[1] => Node Object
(
[vars] => Array
(
[Heading] => Недвижимость
)
[childs] => Array
(
[L2] => Array
(
[0] => Node Object
(
[vars] => Array
(
[Item] => Жильё
)
[childs] => Array
(
)
)
[1] => Node Object
(
[vars] => Array
(
[Item] => Коммерческая
)
[childs] => Array
(
)
)
[2] => Node Object
(
[vars] => Array
(
[Item] => Производство
)
[childs] => Array
(
)
)
[3] => Node Object
(
[vars] => Array
(
[Item] => Прочая нежилая
)
[childs] => Array
(
)
)
)
)
)
)
)
|
Вот думаю как покрасивше синтаксис сделать, типо такого:
<?php
$tpl->LOOP["L1"][0]->vars["Heading"] = "Работа";
$tpl->LOOP["L1"][0]->LOOP["L2"][0]->vars["Item"] = "Резюме";
$tpl->LOOP["L1"][0]->LOOP["L2"][1]->vars["Item"] = "Вакансии";
// ...
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 12:42)
| | я имел ввиду примерно такую схему:
контроллер создает объект класса -> открывает шаблон (например template.tpl) -> парсит (заменяет {{ на <?php и т.п) -> сохраняет разобранный шаблон как php-файл (например template.tpl.php) ->разобранный шаблон подключается в контроллер.
а вообще передача параметров у вас сложная какая-то очень | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 13:23)
| | в моём случае будет кэширование | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:31)
| | одно другому не мешает | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 13:44)
| | в моём случае компиляция в пхп бесполезна | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:45)
| | а если опция кэширования будет отключаться? я думаю не стоит каждый раз разбирать заново шаблон если он не изменялся | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:45)
| | а вообще как хотите. я изначально подходил к этому вопросу так же как вы, но потом отказался т.к было очень много головной боли с разбором | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 13:47)
| | Что-то не пойму...
<?php
error_reporting(E_ALL);
$Tree = array();
$Tree["L1"][0]["vars"]["Heading"] = "Работа";
$Tree["L1"][1]["vars"]["Heading"] = "Недвижимость";
$Tree["L1"][0]["childs"] = array("L2" => array(array("vars" => array("Item" => "Резюме"), "childs" => array(),)));
$Tree["L1"][0]["childs"]["L2"][1] = array("vars" => array("Item" => "Вакансии"), "childs" => array(),);
$Tree["L1"][1]["childs"] = array("L2" => array(array("vars" => array("Item" => "Жильё"), "childs" => array(),)));
$Tree["L1"][1]["childs"]["L2"][] = array("vars" => array("Item" => "Коммерческая"), "childs" => array(),);
$Tree["L1"][1]["childs"]["L2"][] = array("vars" => array("Item" => "Производство"), "childs" => array(),);
$Tree["L1"][1]["childs"]["L2"][] = array("vars" => array("Item" => "Прочая нежилая"), "childs" => array(),);
// echo "<pre>";
// print_r($Tree);
// echo "</pre>";
class Loop {
public $vars = array();
public $childs = array();
public function __construct($Array) {
$this->vars = $Array["vars"];
$this->childs = $Array["childs"];
}
}
class Test {
public $loop = array();
function __construct() {
global $Tree;
foreach ($Tree as $k => $v) {
foreach ($v as $vv) {
$this->loop[$k][] = new Loop(&$vv);
}
}
}
}
$test = new Test();
echo "<pre>";
print_r($test->loop["L1"][0]->vars);
?>
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(16.11.2010 в 22:23)
| |
{{include header.html}}
<h1>{{$Title}}</h1>
<div>{{$Entry}}</div>
<h2>Навигация:</h2>
{{@Categories}}
<h3><a href="#">{{$Category}}</a></h3>
<ul>
{{@Articles}}
<li><a href="#">{{$Article}}</a></li>
{{Articles;}}
</ul>
{{Categories;}}
<h2>Список сотрудников:</h2>
<table border="1" cellpadding="2" cellspacing="0">
<tr><th>Имя</th><th>Должность</th></tr>
{{@Employees}}
<tr><td>{{$Name}}</td><td>{{$Post}}</td></tr>
{{Employees;}}
</table>
{{include footer.html}}
|
пока такая разметка шаблонов | |
|
|
|
|
|
|
|
для: Красная_шляпа
(18.11.2010 в 19:04)
| | хм. разделители грамотно. а вот синтаксис имхо. я у себя например делал синтаксис похожий на смарти... | |
|
|
|
|
|
|
|
для: psychomc
(18.11.2010 в 20:33)
| |
<?php
/**
* Название (имя) класса
*
* Полное описание
*
* @author Ф.И.О. <e-mail>
* @version 1.0
*/
class Template {
public $vars = array();
public $list = array();
private $content;
private $samples = array();
public function __construct($filename) {
$content = file_get_contents($filename);
$this->content = $content;
$this->getSamples($content);
// print_r($this->samples);
}
public function parse() {
$tree = array();
$this->parseList($this->list, $tree);
print_r($tree);
$this->content = $this->Cut($this->content);
$replacements = $this->getVars($this->content);
$this->content = $this->assignVars($this->content, $this->vars, $replacements);
}
public function P(&$tree) {
foreach ($tree as $k => $v) {
if (isset($tree["childs"])) {
//
}
}
}
public function __toString() {
return $this->content;
}
public function asString() {
return $this->__toString();
}
/**
* метод assignVars - подставляет значения в шаблон
*
* @param строка $content
* @param ассоциативный массив $vars
* @param массив $replacements
* @return строка
*/
private function assignVars($content, $vars, $replacements = array()) {
if (!empty($vars) and is_array($vars)) {
foreach ($vars as $k => $v) {
$content = str_replace("{{\$$k}}", $v, $content);
}
}
if (!empty($replacements) and is_array($replacements)) {
foreach ($replacements as $v) {
$content = str_replace($v, "", $content);
}
}
return $content;
}
private function parseList(&$list, &$tree) {
foreach ($list as $k => $v) {
$count = count($v);
for ($i = 0; $i < $count; ++$i) {
$tree[$k][$i]["data"] = $this->assignVars($this->samples[$k][1], $v[$i]->vars, $this->getVars($this->samples[$k][1]));
if (isset($v[$i]->list)) {
$this->parseList($v[$i]->list, $tree[$k][$i]["childs"]);
}
}
}
}
private function Cut($content) {
$pattern = "/\{\{\@([_a-z][_a-z\d]*)\}\}(.*?)\{\{\\1;\}\}/uis";
$content = preg_replace($pattern, "", $content);
return $content;
}
private function getVars($content) {
$content = $this->Cut($content);
$matches = array();
preg_match_all("/\{\{\\$[_a-z][_a-z\d]*\}\}/ui", $content, $matches); // \$ -> \\$
return $matches[0];
}
private function getSamples($content) {
$pattern = "/\{\{\@([_a-z][_a-z\d]*)\}\}(.*?)\{\{\\1;\}\}/uis";
$matches = array();
preg_match_all($pattern, $content, $matches);
if (!empty($matches[0])) {
$count = count($matches[0]);
for ($i = 0; $i < $count; ++$i) {
$this->samples[$matches[1][$i]] = array($matches[0][$i], $matches[2][$i]);
$this->getSamples($matches[2][$i]);
}
}
}
}
?>
<?php
error_reporting(E_ALL);
require "Template.class.php";
$tpl = new Template("content.html");
$tpl->vars["Title"] = "Тест";
$tpl->vars["Entry"] = "lorem inspum dollor east inspum
loram inspum east dollor as lorem inem inspum dollor east
inspum loram inspum east dollor as lorem inspum dollor east
inspum loram inspum east dollor as lorem inspum dollor east
inspum loram inspum east dollor as lorem inspum dollor east
inspum loram inspum east dollor as lorem inspum dollor east
inspum loramem inspum dollor east inspum loram inspum east
dollor as lorem inspum dollor east inspum loram inspum east
dollor
s lorem inspum dollor east inspum loram inspum east dollor
as lorem inspum dollor east inspum loram inspum east dollor
as lorem inspum dollor east inspum loramem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
easast inspum loram inspum east dollor as lorem inspum
dollor east inspum loram inspum east dollor as lorem inspum
dollor east inspum lo
ramem inspum dollor east inspum loram inspum east dollor as
lorem inspum dollor east inspum loram inspum east dollor as
lorem inspum dollor east inspum loram inspum east dollor as
lorem inspum dollor east inspum loram inspum east dollor as
lorem inspum dollor easast inspum loram inspum east dollor
as lorem inspum dollor east inspum loram inspum east dollor
as lorem inspum dollor east inspum loramem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loram inspum east dollor as lorem inspum dollor
east inspum loramem inspum dollor east inspum loram inspum
east dollor as lorem inspum dollor east inspum loram inspum
east dollor as lorem inspum dollor east inspum loram inspum
east dollor as lorem inspum dollor east inspum loram inspum
east dollor as lorem inspum dollor east inspum loram";
$tpl->list["Categories"][0]->vars["Category"] = "Сотовые телефоны";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "Nokia";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "SE";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "LG";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "Samsung";
$tpl->list["Categories"][1]->vars["Category"] = "Сантехника";
$tpl->list["Categories"][1]->list["Articles"][]->vars["Article"] = "Ванны";
$tpl->list["Categories"][1]->list["Articles"][]->vars["Article"] = "Унитазы";
$tpl->list["Employees"][]->vars = array("Name" => "Иван","Post" => "Программист",);
$tpl->list["Employees"][]->vars = array("Name" => "Сергей","Post" => "генеральный директор",);
$tpl->list["Employees"][]->vars = array("Name" => "Мария","Post" => "Менеджер",);
echo "<pre>";
// print_r($tpl->list);
$tpl->parse();
// echo $tpl;
?>
|
Не въебу как быть с вложенными циклами... мозгами понимаю что больше двух вложенных циклов на странице не нужно, можно ограничется этим числом, но хочется универсальности | |
|
|
|
|
|
|
|
для: Красная_шляпа
(18.11.2010 в 20:51)
| | универсальность нужна в первую очередь... и кстати циклов тоже желательно несколько (подобие foreach и подобие for (т.е section - очень удобно, когда нужно вывести данные в столбец, например в левом четные, в правом нечетные). и еще кстати, хорошо если передача параметров в итоге будет простой (я например делал для всего $tpl->param("name", $value), так же и массивы. у вас как-то очень сложно. как уже писал, лучше всего наверное отказаться от этой идеи и полностью использовать возможности интерпретатора... а вообще конечно ваше дело. опять же, я так считаю потому что уже сталкивался с этим вопросом и тоже много времени потратил на выбор решения.
p.s может быть не в тему написал и не то что вы ожидали. просто имхо, кажется что вы все-таки пошли не в том направлении. в код лезть совсем не хочется | |
|
|
|