Проблема с шаблоном.

mig

Guest
Проблема с шаблоном.

Сижу уже 4 часа мучиюсь над 3 строчками :) Ну не как не врубаюсь в чем дело...
Есть шаблон в котором написан всякий штмл код, а в нем {db.id} и {db.date}. Есть база в которой колонки имеют название, что и текст в шаблонах, только без db. (id, date). Как то не хочеться делать по 10 preg_replace для каждого шаблона, вот хочу сделать все на автомате так скажем. Мне нужно {db.id} заменить на $value[id], так же с ..date...

Есть код:

PHP:
$news = $db->select("SELECT * FROM news ORDER BY date DESC");
if ($news[0][0]) {
$tmp_code = template("news.html");
foreach ($news as $key => $value) {
template_repl($tmp_code, $value);
}
}
функия template_repl:

PHP:
function template_repl($string, $value) {
$test = preg_replace("/\{db\.(.*?)\}/", $value["\\1"], "{db.id} : {db.date}");
echo "$test";
}
$tt = $value["date"]; (в функции) работает как надо, однако preg_replace заменяет {db.*} на пустоту. В чем тут проблема?
 

mig

Guest
Ты можеш сказать с какого и до какого места читать? а то там столько всего, что найти по данной проблеме ответ врятли получиться :)

>> Кавычки и апострофы - две большие разницы
только не в моем случии :) как только я не пробывал...
 

Nimous

Guest
Пример 4. Использование модификатора /e
 

mig

Guest
Спасибо, все равно не понел где ошибка :( 6 часов 1 строчку мучию, ужас....

Может подскажеш?
 

Nimous

Guest
Обрати внимание на синтаксис при использовании значения из
кармана у себя и в мануале.
 

mig

Guest
Что за карман? С круглыми скобками все нормально, а с квадратными всегда выдает:

Parse error: parse error, unexpected T_CHARACTER, expecting ']' in z:\home\localhost\www\test\test.php on line 20
 

Nimous

Guest
Добавь в свой код:

PHP:
function
    array_key($array=array(),$key=''){
     return (isset($array[$key]))?$array[$key]:null;
}
и перепиши template_repl():
PHP:
...
$test = preg_replace("/\{db\.(.*?)\}/e", "array_key(\$value,'\\1')", "{db.id} : {db.date}");
...
Наверное, не лучшее решение, но работает:)
 

Nimous

Guest
Да..
$value- должен быть массив:[найденная_подстрока]=replacement
 

mig

Guest
Тут ещё 1 вопрос возник по шаблонам, решил сделать не много по другому, но почему то preg_replace сново заменяет на пустоту.

Код:
PHP:
$select = $db->select("SELECT * FROM news ORDER BY id DESC");
if ($select[0][0]) {
foreach ($select as $key => $value) {
$tmpl->var_("db", $value);
}
$tmpl->echo_("{db.id} : {db.date}");
}

class template {
var $code = array();
var $html = array();

function var_ ($name, $value) {
$this->code = "/\{$name\.(.*?)\}/e";
$this->html = "template_key(\$value,'\\1')";
}

function echo_ ($string) {
$code_ = $this->code;
$html_ = $this->html;
$code = preg_replace($code_, $html_, $string);
echo "$code";
}
}
Вроде все тоже самое, а не работает :(
 

Фанат

oncle terrible
Команда форума
там написано не только про ошибки.
читай дальше.
 

mig

Guest
Там ниже написано про post, sql, отладку. Я вот эту самую отладку делал ещё до того как писал тут, но там показывается вроде нормально за исключением template_key(\$value,'\\1'), в echo в \\1 отсутствует однин слэш (получается \1). В этом проблема? Если в ней, то как же надо что бы было?
 

mig

Guest
Может лучше скажите как сделать что бы preg_replace заменял не на пустоту, а на то, что надо?

-~{}~ 03.08.05 14:14:

Сделал "шаблонизатор", добовил блоки, но хотел узнать, не будет ли он тормазить если блоки собираются так:

[/php]function block ($name) {
$file = file($this->filename);
for ($i=1;$i<=sizeof($file);$i++) {
$string = $file[$i-1];
if (substr_count($string, "end: $name") > 0) { $var = 0; $i = sizeof($file); }
if ($var == 1) $block .= $string;
if (substr_count($string, "begin: $name") > 0) $var = 1;
if (substr_count($string, "begin: $name") > 0 && $i == 1) $this->block_main = $name;
}
$this->block[$name] .= $block;
}

function collect ($name) {
$array = $this->block;
$file = file($this->filename);
for ($i=1;$i<=sizeof($file);$i++) {
$string = $file[$i-1];
foreach ($array as $key => $value) {
if (substr_count($string, "begin: $key") > 0 && $key != $this->block_main) $var = 1;
if (substr_count($string, "end: $key") > 0 && $key != $this->block_main) $var = 0;
if ($var == 1 && substr_count($string, "begin: $key") == 0 && $key != $this->block_main) $string = "";
}
$tmpl .= preg_replace("/\<!--(.*?)begin:(.*?)--\>/e", "\$this->key(\$array,'\\2')", $string);
}
$this->tmpl = $tmpl;
}[/php]

block - сначало вытаскивает указаный блок, а collect потом собирает все в "кучу". Скажите как быстро он работать будет?
 
Сверху