|
|
|
|
|
для: Красная_шляпа
(18.11.2010 в 20:51)
| | универсальность нужна в первую очередь... и кстати циклов тоже желательно несколько (подобие foreach и подобие for (т.е section - очень удобно, когда нужно вывести данные в столбец, например в левом четные, в правом нечетные). и еще кстати, хорошо если передача параметров в итоге будет простой (я например делал для всего $tpl->param("name", $value), так же и массивы. у вас как-то очень сложно. как уже писал, лучше всего наверное отказаться от этой идеи и полностью использовать возможности интерпретатора... а вообще конечно ваше дело. опять же, я так считаю потому что уже сталкивался с этим вопросом и тоже много времени потратил на выбор решения.
p.s может быть не в тему написал и не то что вы ожидали. просто имхо, кажется что вы все-таки пошли не в том направлении. в код лезть совсем не хочется | |
|
|
|
|
|
|
|
для: 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 в 19:04)
| | хм. разделители грамотно. а вот синтаксис имхо. я у себя например делал синтаксис похожий на смарти... | |
|
|
|
|
|
|
|
для: Красная_шляпа
(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}}
|
пока такая разметка шаблонов | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:45)
| | а вообще как хотите. я изначально подходил к этому вопросу так же как вы, но потом отказался т.к было очень много головной боли с разбором | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:45)
| | а если опция кэширования будет отключаться? я думаю не стоит каждый раз разбирать заново шаблон если он не изменялся | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 13:44)
| | в моём случае компиляция в пхп бесполезна | |
|
|
|
|
|
|
|
для: Красная_шляпа
(17.11.2010 в 13:31)
| | одно другому не мешает | |
|
|
|
|
|
|
|
для: psychomc
(17.11.2010 в 13:23)
| | в моём случае будет кэширование | |
|
|
|
|