Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с шаблонизатором, идея есть, может - что лучше предложите? 
V
    Опции темы
VingradFan
Дата 19.1.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



Всех приветствую smile

пишу шблонизатор... smile уже предвкушаю гневные отзывы, что PHP - это лучший шаблонизатор и нечего велосипед изобретать....
Но все-таки...


Итак идея: ОЧЕНЬ простой синтаксис; минимальный функционал; возможность инклуда: 
   а. Текста <!--some_text-->
   б. ПХП Скриптов <!!--some_php_file-->

допустим, сначала, для простоты рассуждений, что шаблон формируется в два этапа:
   1. текст заменяется на строки с помощью str_replace
   2. а вот тут встает проблема: как инклудить код?


придумал такой алгоритм:
1. записываем в $template то что получилось после 1-го подхода.
2. ищем все до первого <!!--(что-угодно)-->, выводим это
3. инклудим скрипт из первого <!!--(что-угодно)-->
4. удаляем из $template подстроку, которую уже вывели и первый тег <!!--(что-угодно)-->
5. возвращаемся к шагу 2.



подозреваю, что можно все проще делать....

Жду советов, спасибо!

Это сообщение отредактировал(а) VingradFan - 19.1.2009, 23:11


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
ksnk
Дата 19.1.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



  Нужно, в принципе, расчитывать на компилируемый шаблонизатор, когда шаблон компилируется в более-менее простой PHP код. Если шаблонизатор некомпилируемый - когда-нибудь настанут тормоза, знаю по своей поделке  smile 

 С таким подходом к использованию, синтаксис можно наворачивать сколь угодно сложно - собственно время компиляции шаблона будет непринципиально...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 20.1.2009, 00:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



ksnk, спасибо за наводку на компилирующий шаблонизатор...
буду гуглить smile



что-то я совсем забыл про функцию eval();!!!
она ведь решает всю проблему и сводит код к двум строчкам smile


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

-- страница вывода товара по категории. Для простоты - слева "деревянный" список категорий (категорий 50-100). Справа - таблица товаров. Снизу еще одна категория товаров (новинки... штуки 3-6). Товар - ассоциативный массив с картинкой, ценой и фиксированным набором атрибутов, некоторые из них удобно выводить выпадающим списком...
-- Список товаров разношаблонный. Для каждого товара (даже и в одной категории) может использоваться разные шаблончики. Впрочем, это на потом smile Для серьезности нагрузки нужно 50-100 товаров на страницу выдавать...
-- Таблица товаров - раскрашена полосками - чёт-нечёт + выделяются цветом некоторые столбцы.

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

В принципе, для конкретики можно в любой e-магазин ткнуться... Оно там везде такое smile

А так - задачка интересная. Разрабатывает логическое мышление.  smile Видимо, это и вся польза, так как, к сожалению, никто кроме тебя, скорее всего, пользоваться таким шаблонизатором не будет. Впрочем, а вдруг...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 20.1.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



ksnk, ну причем тут навороченный магазин smile
я ведь делаю шаблонизатор для конкретной цели: небольшая hand-made CMS...

т.ч. я думаю, eval здесь самое оптимальное решение....


PS я таки осознал, что для большого проекта нужен нативный PHP шаблонизатор smile 


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
bars80080
Дата 20.1.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



имхо, если есть варианты решения без eval(), даже с полным изменением логики работы, то надо ибегать её
PM MAIL WWW   Вверх
ksnk
Дата 20.1.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

я ведь делаю шаблонизатор для конкретной цели: небольшая hand-made CMS...

Угу, угу, знакомая история.  smile Потом , если получится неплохо, оно понравится, и ты будешь его использовать и в основном проекте, дальше - больше... Затянет, и жизнь твоя не будет стоить и ломаного цента.

Честно говоря, для небольшого проекта шаблонизатор, как таковой и не нужен. Нужно выделить все классы-функции, ответственные за формирование HTML'я в отдельный файл. обозвать его "шаблонизатором " или view-контролером по вкусу и наслаждаться жизнью...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 20.1.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



bars80080, она типо непроизводительна?


ksnk, ну раньше, когда я не слышал слова шаблонизатор у меня в шаблонах были для текстовых данных echo "somwthing"; а для подключения компонентов include (something);
но потом я прочитал, что так некруто smile и ни один дизайнер не будет писать шаблоны с вставками php...


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



VingradFan, Нужно уж определиться, это маленький проект, который по определению весь делается одним человеком, или большой проект, для которого специальный верстальщик делает специальные шаблоны.

Обычная, imho, практика работы с шаблонами - приложение формирует ассоциативный массив с данными и передает его шаблонизатору. Шаблонизатор уже сам вставляет нужные параметры в нужные места. Чего-нибудь такое:
Код

...  
class TPL {
   function tplHello($par){
     return '<head><title>'.$par['title'].'</title></head><body>'.$par['data'].'</body>';
  }
...
}

...

echo TPL::tplHello(array('title'=>'Заголовок', 'data'=>'очень много данных...'));






--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 20.1.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



Цитата

VingradFan, Нужно уж определиться, это маленький проект, который по определению весь делается одним человеком, или большой проект, для которого специальный верстальщик делает специальные шаблоны.


пишется пока для себя, но хочется "чтоб все как у взрослых"  smile 




Цитата

приложение формирует ассоциативный массив с данными и передает его шаблонизатору


ну это понятно.... суть темы состоит в том, как передавать шаблонизатору куски кода PHP в виде файлов....

1. вариант - eval();
2. вариант - в первом посте....

пока идею иссякли smile


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

суть темы состоит в том, как передавать шаблонизатору куски кода PHP в виде файлов...

 smile Оно тебе не надо... Мне, вот, не нужно-же ...

приведи пример, где это понадобилось. Всяко можно задачку решить и без eval'а. 

eval - сильно проигрывает другим методам в скорости выполнения, так что лучше его избегать...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 20.1.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



привожу пример шаблона
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 // EN" "http://www.w3.org/TR/REC-html40/<!--doctype-->">
<html>
    <head>
        <title>
            <!--title-->
        </title>
        <link rel="stylesheet" type="text/css" href="css/<!--css_system-->">
        <link rel="stylesheet" type="text/css" href="css/<!--css_color-->">
    </head>
    <body>
        <div id='main' class='shown'>
            <table>
                <tr>
                    <td colspan="2">
                        <h1><!--site_title--></h1>
                    </td>
                </tr>
                <tr>
                    <td class='small'>
                        <p>
                            <!--menu-->
                        </p>
                        <p>
                            <!--login_form-->
                        </p>
                    </td>
                    <td>
                        <!--body-->
                    </td>
                </tr>
            </table>
        </div>
    </body>
</html>
<!--alerts-->




<!--menu-->
<!--login_form-->
<!--body-->

надо заменить на php код, который формирует меню, форму логина, и тело страницы.


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
bars80080
Дата 20.1.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

Код

$fp = fopen('template.html', 'r');
$temp = fread($fp, 9999);
fclose($fp);

$ar = array('<!--site_title-->','<!--menu-->','<!--login_form-->');
$ag = array($title, $menu, $form);
$html = str_replace($ar, $ag, $temp);

echo $html;

где $title, $menu, $form данные из БД или файлов, с генеренные и скомпонованные на пхп в нужном виде
PM MAIL WWW   Вверх
ksnk
Дата 20.1.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



VingradFan, А можно было бы придумать как записать в шаблоне "заголовок" и описать LoginForm, Body и Menu в том-же файле. Это, типа, круто. Все шаблоны маленького приложения в одном файле. Ну в крайнем случае, можно в нескольких файлах, а имя "шаблона" брать из имени файла...

Если свести к моему примеру, все будет примерно так
Код

...
      </div>
    </body>
</html>
<!--alerts-->

<!--begin:LoginForm-->
<form>
<input name='login'>
<input type='password' name='password'>
</form>
<!--end:LoginForm-->


Код

echo TPL::tplHello(array('title'=>'Заголовок', 'LoginForm'=>TPL::tpl('LoginForm',array(...)),'alerts'=>'очень много данных...'));


И куда тут теперь нужно вставить какие-то PHP-шные файлы?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
VingradFan
Дата 21.1.2009, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



bars80080ksnk, спасибо за мысли, буду перечитывать и обдумывать smile



bars80080, например, на место <!--news--> надо подгрузить компонент news.php
Код

<h2>Новости</h2>
<?php
    require (comps.'news/kernel/functions.php');
    if($_GET['read'] > 0){
        form_show();
        new_show ($_GET['read']);
        replys_show($_GET['read']);
    }
    else{
        form_show();
        all_news_show();
    }
?>



Цитата

с генеренные и скомпонованные на пхп в нужном виде

очень просто и логично звучит smile
тоесть надо каким-то образом результат работы этого скрипта записать в текстовую переменную и заменить ею <!--news--> ?
похоже надо будет менять тогда принцип работы компонентов. smile 

Это сообщение отредактировал(а) VingradFan - 21.1.2009, 00:46


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.