как сделать хитрый str_replace для шаблонов

stopkran

Дилетант
Это совершенно лишние телодвижения, говоряшие, что т.н. "шаблон" спроектирован неправильно.
Я тоже так шаблоны не делаю. Мне кажется, что мои - удобнее, правильнее. Но автор сказал, что у него всё работает, и пока менять идеологию не хочет. Я предлагаю улучшение в рамках его идеологии.
 

VANHALEN

Новичок
PHP:
$arr = array('zagolovok', 'data', 'korotko', 'podrobno');
foreach ($arr as $value) {
$tpl = str_replace('%' . $value . '%', $row[$value], $tpl);
}
Ну как бы это уже лучше.. Я вот только не пойму, зачем их определять заранее? То, что написано между знаками % и есть имя переменной. Задание то вобщем на регулярные выражения, я даже первую часть написал (что менять).

Конечно по вашему это всё заблуждения. Наверное так оно и есть, но я хочу понять сам принцип. Необязательно, что это пригодится в шаблонах. Может в какой-то части шаблона, может ещё где-то. Да и ту работу, которую я сейчас выполняю, мне это очень облегчит. Шаг вперёд я уже сделал, дизайна в коде больше нет.

Отдельно фанату и духовности - ребята, но ведь мне сейчас в шаблонах логика то не нужна? У меня нет таких задач. :) Ну а в остальном вы наверное правы. Буду делать шаблоны с логикой, обязательно учту
 

stopkran

Дилетант
Я вот только не пойму, зачем их определять заранее?
Ну... Можно, наверное, как вы говорите, с помощью регэкспа извлечь из шаблона. Потом, кстати, надо проверить, пришло ли значение в row:

PHP:
$arr = (preg_match_all("/\%([^%]+?)\%/", $tpl, $matches)) ? $matches[1] : array();

foreach ($arr as $value) {
    //мы не знаем наверняка, придёт ли в row нужное значение
    $new_value = (isset($row[$value])) ? $row[$value] : '';
    $tpl = str_replace('%' . $value . '%', $new_value, $tpl);
}
 

VANHALEN

Новичок
PHP:
$arr = (preg_match_all("/\%([^%]+?)\%/", $tpl, $matches)) ? $matches[1] : array();

foreach ($arr as $value) {
    //мы не знаем наверняка, придёт ли в row нужное значение
    $new_value = (isset($row[$value])) ? $row[$value] : '';
    $tpl = str_replace('%' . $value . '%', $new_value, $tpl);
}
Подставил вслепую - тишина (пустая страница), потом буду разбираться.
Потом, кстати, надо проверить, пришло ли значение в row
А с чего ему не придти то? У меня даже лично мысли такой не было проверять. Пустых полей в новости быть не может, это проверяется при вставке.
 

stopkran

Дилетант
1) после инициализации $arr посмотрите print_r($matches);

2) Если у вас один шаблон и одна таблица с данными, проверять нечего; если хотя бы две таблицы, то ведь имя таблицы человек выбирает руками, произвольно, и может ошибиться. Т.е. надо как-то сверять набор полей шаблона и набор полей данных.
 

fixxxer

К.О.
Партнер клуба
VANHALEN
Ну предположим, перечислять нигде ничего не надо. Достаточно вытаскивать список переменных из шаблона, а не из входных данных.

Берешь ты, допустим, preg_replace_callback с регуляркой вида /%([\d\w_]+)%/ и $1 в callback-функции меняешь на $vars[$1], где $vars - твои переменные шаблона.

Потом ты хочешь добавить простое условие - показать или скрыть такой-то блок в зависимости от того, передана ли в шаблон переменная (банально: подставить урл картинки в тэг img, но если урл не задан - вообще не выводить img). Если ты сейчас передаешь в качестве переменной для подстановки целиком тег img извне, поздравляю, ты сделал феерично неудобную фигню. Ну да ладно вот захотел ты, добавляешь какой-то { if var } ... { end }, начинаешь возиться с регулярками, и уже получается как-то очень сложно, черт уже в этих регулярках ногу сломит.

Тут тебе приходит в голову. Ведь можно просто заменять наши процентики на php инструкции:

%var% -> <? if (isset($vars['var'])) print $vars['var'] ?>
{ if var } .. { end } -> <? if (!empty($vars['var'])) : ?> .... <? endif ?>
итд.

Делаешь на это евал, тормозааа. Думаешь, а почему бы не делать этот пхп код заранее и не кэшировать его в файл, которому просто делать include.

И тут я тебя поздравляю ты изобрел smarty :)

Здесь теперь есть 2 подхода - либо делать как смарти, либо ручками писать прямо-таки пхп код. Этот вопрос холиварный и занимает этот форум уже лет 10, но факт в том что это два основных нормальных способа делать шаблоны )
 
Сверху