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

VANHALEN

Новичок
Здравствуйте.. Решил натянуть шаблоны на свой движок.. Делаю так.

PHP:
$tpl = file_get_contents('design/shablon.html');
$tpl = str_replace('%zagolovok%', $row['zagolovok'], $tpl);
$tpl = str_replace('%data%', $data, $tpl);
$tpl = str_replace('%korotko%', $row['korotko'], $tpl);
$tpl = str_replace('%podrobno%', $row['podrobno'], $tpl);
echo $tpl; }
Выходит красивый такой списочек новостей и без запарки. Но! Тут меня осиняет мысля. а чё это я все переменные из массива руками то обьявляю? Да и не из массива (полученные путём его обработки к примеру) тоже. Может можно как-то так сделать
PHP:
$tpl = str_replace('%бла бла бла%', $row['такая же бла бла бла'], $tpl);
Иными словами любое колличество любых знаков, заменить на то-же самое. Или по каким-то причинам не стоит этого делать? Заранее спасибо!
 

С.

Продвинутый новичок
Если вставлять в шаблон вместо %бла бла бла%, <?=Val('бла бла бла')?>, то будет много проще и прямее.
 

VANHALEN

Новичок
Ну вот методом научного тыка начал
PHP:
$tpl = preg_replace("(%+[a-z0-9]+%)", "переменная", $tpl);
Но вот что то мне подсказывает что ход мыслей неправильный. Серединку то наверное как раз и не нужно менять. нужно менять только % на $row[' и второй % на ']. Хотя кстати так тоже неправильно думать. А если мне надо заменить её не на переменную из массива а на просто переменную? Кто что думает?

Например у меня дата берётся не напрямую из массива, а записывается в переменную до вывода
PHP:
$data = explode("-", "".$row['data']."");  //Разделяем строку с датой
$data = ($data[2].'-'.$data[1].'-'.$data[0]); //Переворачиваем для русских людей: число-месяц-год
 

VANHALEN

Новичок
Так... отвечаю себе сам. Вторая проблемма - не проблемма
PHP:
$tpl = str_replace('%data%', $data, $tpl);
$tpl = preg_replace("(%+[a-z0-9]+%)", 'переменная', $tpl);
В таком порядке всё отлично работает. Заранее определённые переменные ставишь раньше, остальное заменяется из массива.

С первой бедой так и не разобрался. Буду учить регулярные выражения.. Но если кто подскажет раньше, от меня большой прибольшой сенкс..
 

Mamont

Новичок
Может можно как-то так сделать
PHP:
$tpl = str_replace('%бла бла бла%', $row['такая же бла бла бла'], $tpl);
Иными словами любое колличество любых знаков, заменить на то-же самое.
PHP:
$tpl = file_get_contents('design/shablon.html');
$data['%zagolovok%'] = 'Заголовок';
$data['%data%'] = 'Дата';
$data['%korotko%'] = 'Коротко';
$data['%podrobno%'] = 'Подробно';
$tpl = str_replace( array_keys($data), array_values($data), $tpl);

echo $tpl;
 

Фанат

oncle terrible
Команда форума
Выходит красивый такой списочек новостей и без запарки.
Судя по всему, в файле шаблона хранится только шаблон одной строки таблицы.
Предупреждаю: когда таких файликов станет полсотни на одну страницу - взвоешь.
Или, если файлик один, а остальной HTML всё так же пишется в коде, то это не шаблон, а профанация.
 

VANHALEN

Новичок
Судя по всему, в файле шаблона хранится только шаблон одной строки таблицы.
В шаблоне не одна строка, а вся таблица (Ну или DIVы, в зависимости от того, что требуется). Она выводится в цикле.

Предупреждаю: когда таких файликов станет полсотни на одну страницу - взвоешь.
А зачем там полсотни? Что там выводить? Заголовок, дата и текст новости. И так по кругу. Плюс шаблон панельки с переключателями страниц, уже вне цикла

Или, если файлик один, а остальной HTML всё так же пишется в коде, то это не шаблон, а профанация.
Ну вот как раз то и не осталось хтмла в коде

Результат прикреплён
Шаблон
template.jpg
Результат
frontend.jpg
 

VANHALEN

Новичок
PHP:
$tpl = file_get_contents('design/shablon.html');
$data['%zagolovok%'] = 'Заголовок';
$data['%data%'] = 'Дата';
$data['%korotko%'] = 'Коротко';
$data['%podrobno%'] = 'Подробно';
$tpl = str_replace( array_keys($data), array_values($data), $tpl);

echo $tpl;
А в чём смысл то? Тоже самое забивание руками, только в массив.. Развеч то str_replace, в отличие от моего примера вызывается один раз.
 

Фанат

oncle terrible
Команда форума
для совсем убогого дизайна, разумеется, будет 2-3 файлика.
в любом нормальном сайте - полсотни.

впрочем, убеждать таких "специалистов"-всезнаек - пустая трата времени.
появится опыт - сам поймёшь.
 

VANHALEN

Новичок
впрочем, убеждать таких "специалистов"-всезнаек - пустая трата времени.
появится опыт - сам поймёшь.
Чё то я не понял.. В чём ты меня пытался убедить? Ты разве предлагал какое-то решение, или направление куда рыть? :)

для совсем убогого дизайна, разумеется, будет 2-3 файлика.
в любом нормальном сайте - полсотни.
Ну мне сейчас вот и надо для совсем убогого.

ты все не правильно делаешь.
Да не вопрос, покажи как правильно. Куда копать.. разжёвывать не обязательно, достаточно общей мысли
 

VANHALEN

Новичок
Ну о в общем.. Если не лень, давайте разберёмся. Думаю это будет полезно не только мне.

У меня есть, как многие любят здесь называть собственная cms для говносайта. Делал я её своим умом, с ноля. Не гнушался чужими советами и с удовольствием их принимал. Именно советы, а не пи...больство, типа ты повесишься, убей себя ап стену всезнайка. Посему, предлагаю всем профи, которые считают, что я всё далею не правильно, применить основное умение програмистов (а именно выражаться локанично, без лишнего кода) и в двух, трёх фразах, описать мне и всем остальным всезнайкам, почему данный подход к шаблонам не имеет смысла, чем он может грозить и куда нужно рыть, чтобы не наступать на чужие грабли.

Касательно CMS:
- Есть статичные страницы, которые выводятся из базы вообще без шаблона
- Есть модуль, новостей (или блога) к которому можно приделать моим методом шаблон, чтобы не выводить хтмп с помощью пхп
- Есть модуль гостевой книги, которую тоже будет удобнее выводить по шаблону.
- фотоальбом, в котором всё делается вообще через CSS
На новости, блог 2-4 файла (новости, переключалка страниц, коментарии), на гостевую 2-3 файла.
Сайты при этом работают быстро, удобно управляются, клиентам впринципе по барабану писал я переменные на китайском языве, или на русском.. Все довольны.

Чем в данном случае опасен мой метод? Почему он непродуктивен?
Обещаю принять без эмоций любую конструктивную критику.

Для примера, один из последних моих сайтов.. Функционал на других сайтах, построенных на этой CMS планируется похожийссылка
 

Духовность™

Продвинутый новичок
Да не вопрос, покажи как правильно. Куда копать.. разжёвывать не обязательно, достаточно общей мысли
это называется php native
У «native PHP» есть спец-синтаксис, сохранный еще со второй версии, когда ПХП был преимущественно шаблонизатором.
Мои шаблоны выглядят так:
 

Духовность™

Продвинутый новичок
Чем в данном случае опасен мой метод? Почему он непродуктивен?
ты мешаешь логику приложения и логику отображения В твоих шаблонах нет логики отображения, она перенесена в логику приложения, что плохо.
 

VANHALEN

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

Задача примерно сотяла такая.. Сделать так чтобы делая новый сайт, мне приходилось, только создать на чистом html несколько шаблонов, которые будут вызываться в основной дизайн. Попробовал, понял что это быстро и легко, решил продолжать. Функционал прмерно такой
Плюсы - быстро и просто. Любой школьник может сверстать. Любой дизайн натягивается на движок за 5 минут. Есть ли смысл для сайтов с похожим функционалом, применять такой вот мой "кривой метод"?

А вобщем-то идея ваша мне интересна.. Шаблон логики.. Но в любом случае чистый дизайн хотелось бы иметь вообще без логики..
 

Фанат

oncle terrible
Команда форума
Но в любом случае чистый дизайн хотелось бы иметь вообще без логики..
Это невозможно.
Логика ВСЕГДА есть.

В несчастной гостевой книге, если пользователь указал емейл - то вывести его ссылкой, если не указал - то ничего не выводить.
Где это писать? Это самая что ни на есть ЛОГИКА ОТОБРАЖЕНИЯ, логика шаблона.
И таких мест в любом мало-мальски адекватном шаблоне - тыщи.
Если пользователь с админскими правами - показывать дополнительные ссылки. условный переход
Если пользователь залогинен - показывать ссылку на кабинет. условный переход
в сайдбаре показать последние новости - цикл
и так далее.

Логика в шаблоне всегда есть.
есть только два варианта, как к ней относиться
- или прятать голову в песок, и размазывать логику по нескольким файлам, с НЕЯВНЫМИ соглашениями, которые программист должен держать в уме: вот этот блок мы обрабатываем, как цикл, а этот - как условный переход
- или не заниматься самообманом, а писать прямо в шаблоне как есть - цикл - цикл, увловный переход - условный переход.

по поводу остальных рассуждений я уже давал ссылку: http://phpfaq.ru/tpl - там всё написано
 

VANHALEN

Новичок
по поводу остальных рассуждений я уже давал ссылку: http://phpfaq.ru/tpl - там всё написано
Читал... не осилил.. потом ещё перечитаю более внимательно.

Прикольно, я задаю одни вопросы, а мне отвечают на другие :) Не ну коенчо кое в чём помогли и за это спасибо! Больше напугали..
Но оставим мою идею пока как есть (потому, что она сейчас реально работает и не содержит ничего лишнего, что мне впринципе и надо) и вернёмся к нашим баранам:
PHP:
$tpl = preg_replace("(%+[a-z0-9]+%)", 'переменная', $tpl);
Спасите! Что должно быть написано в 'переменная' ? Повторю условие:
- удалить первый и последний % , а всё, что между ними заключить в конструкцию $row['то что было между знаками процента']
 

stopkran

Дилетант
Всё равно придётся где-то явно перечислить все имена, используемые в шаблоне. Например, в массиве, а потом заменить в цикле. Как-нибудь так:

PHP:
$arr = array('zagolovok', 'data', 'korotko', 'podrobno');

foreach ($arr as $value) {
    $tpl = str_replace('%' . $value . '%', $row[$value], $tpl);
}
 

С.

Продвинутый новичок
Всё равно придётся где-то явно перечислить все имена, используемые в шаблоне.
Это совершенно лишние телодвижения, говоряшие, что т.н. "шаблон" спроектирован неправильно.
 
Сверху