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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонизатор своими руками 
:(
    Опции темы
alexey009
Дата 1.8.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



Вот, написал класс шаблонизатора
Код

class temp{

    var $_tpldata = array();

    var $files = array();

    function set_filenames($filename_array)
    {
        reset ($filename_array);
        while(list($handle, $filename) = each($filename_array))
        {
            $this->files[$handle] = $this->make_filename($filename);
        }

        return $this->files;
    }

    function make_filename($filename)
    {
        global $root_path, $root_engine, $site;
        // Check if it's an absolute or relative path.
        if (substr($filename, 0, 1) != '/')
        {
            $filename = $root_path . $root_engine .'templates/' . $site['template'] . '/' . $filename;
        }

        if (!file_exists($filename))
        {
            die("Template->make_filename(): Error - file $filename does not exist");
        }

        return $filename;
    }

    function assign_vars($vararray)
    {
        reset ($vararray);
        while (list($key, $val) = each($vararray))
        {
            $this->_tpldata[$key] = $val;
        }

        return $this->_tpldata;
    }

    function assign_replace($vararray, $file)
    {
        reset ($vararray);
        $rrr = str_replace(array_keys($vararray), array_values($vararray), $file);

        return $rrr;
    }

}


Плиз, оцените и скажите что можно улучшить?smile


Да и ещё, нужна функция для циклов:
Код

@BeginNews@
название  - @name@<br>
содержание  - @text@<br>
@EndNews@

Т.е. то что между Begin и End выполнялось "по циклу". Как лучше организовать? 
Есть такие мысли:
1. использовать функцию strstr() но как тогда искать конец( может preg_match()) ?
2. полностью положиться на preg_match()
Знатоки, помогите с выбором ну и реализацией по возможностиsmile

Это сообщение отредактировал(а) alexey009 - 1.8.2008, 02:39
PM MAIL   Вверх
alexey009
Дата 1.8.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



Появилась ещё одна задача:
В шаблоне index.tpl написано:
Код

<img src="images/logo.gif" alt="" border="0">

Шаблон лежит в /engine/templates/new/main/index.tpl
картинка лежит в /engine/templates/new/images/logo.gif

Вопросы:
1. Как в адрес картинки дописать недостоющее "/engine/templates/new/"
2. Сильная ли будет нагрузка на сервер такими заменами(картинок то много)
3. Или лучше сразу в шаблоне писать полный адрес до картинки?
PM MAIL   Вверх
americanets
Дата 1.8.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



Цитата(alexey009 @  1.8.2008,  02:48 Найти цитируемый пост)
Вопросы:


1 введи константы IMAGE_PATCH и т д
2 терпимая smile 
3 смотря какой случай, если периодически нужно перемещать папки с файлами в другие директории то нет, константы, а так пиши как удобнее




--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Kefir
Дата 1.8.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



Вообще, думается мне, что лучше всего покопаться в сырцах смарти (я бы предложил его и использовать, но как было сказано - не подходит). В итоге в шаблонизаторе необходимы следующие фичи/ф-ции (без которых обойтись можно, но очень сложно).
1. $templater->assign // назначение переменной в шаблоне
2. $templater->fetch // получение заполненного темплейта в переменную
3. $templater->display // вывод заполненного темплейта на экран
4. шаблонизатор просто обязан "компилировать" себя в чистый ПХП код. без этого нагрузка будет большой. например шаблон "<p>@text@</p>" должен переводится в чистый ПХП - "<p><?php echo $templater->vars['text']; ?></p>". Также, соответственно, необходимо следить за изменениями в шаблоне и по необходимости копилировать заново. получается, что всесто того чтобы каждый раз парсить шаблон заново надо будет всего лишь запустить имеющийся скрипт.
5. кэширование - ещё одна фича, позволяющая снизить нагрузку.
6. вызов встроенных пхп функций из шаблона и возможность создания дополнительных функций. второе, в общем, необязательно, но вызов встроенных ф-ций необходим 100%. в шаблонах нередко необходимо посчитать чего-нибудь (к примеру {if count($image_thumbs) > 0}<img src={$image_thumbs[0]}>{else}<p>No images{/if}).

В общем сильно рекоммендую посмотреть что и как делает смарти - ребята сделали всё грамотно.
PM MAIL WWW Skype   Вверх
alexey009
Дата 1.8.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



Kefir, смарти здоровый и не понятны. я дня два сидел и въежал как его использовать, но ничерта не понял(не умею я в чужолм коде разбираться).
А так я же написал класс шаблонизатора!
Цитата

Плиз, оцените и скажите что и как можно улучшить?

PM MAIL   Вверх
skyboy
Дата 1.8.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



alexey009, зачем тебе было "разбираться в коде смарти" - не понятно. для построения шаблонов вполне достаточно списка разных конструкций(типа {if}, {foreach} и т.д.). для инициации достаточно двух методов: assign и display.
впрочем, не хочешь - не надо.
Цитата(alexey009 @  31.7.2008,  23:56 Найти цитируемый пост)
Плиз, оцените и скажите что можно улучшить?

разве то, что написал Kefir уже есть? где кеширование? каждый раз заново заменяешь текст?
где циклы в шаблоне? где условные конструкции? как сделать перебор массива? как включить один шаблон в другой? как сделать счетчик или итератор(например, чтоб на уровне шаблона сделать чередование цвета строк таблицы)? где это все?
Цитата(alexey009 @  1.8.2008,  00:48 Найти цитируемый пост)
. Как в адрес картинки дописать недостоющее "/engine/templates/new/"

а зачем, интересно? чтоб браузер корректно отобразил картинку, она должна иметь не абсолютный путь на диске относительно папки с шаблоном, а относительный/абсолютный путь основываясь на доменном имени(с точки зрения сервера - это DOCUMENT_ROOT)
PM MAIL   Вверх
Kefir
Дата 1.8.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



alexey009, да ну и чёрт с ним с кодом - поюзай его маленько - сразу поймёшь чего тебе не хватает. полистай мануал, где его фичи описаны. но опять же - я перечислил те вещи, которые обязаны быть в шаблонизаторе, иначе же это не тянет на таковой - максимум "улучшенный str_replace" В) Смарти я посоветовал как раз как источник многих полезных фич. А разобраться как его использовать - три минуты (читай, залил на сервер, подрубил инклюд и сделал экземпляр смарти, всё).
PM MAIL WWW Skype   Вверх
alexey009
Дата 1.8.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



ну впринципе можно и смарти использовать, но вот проблемы
Цитата(skyboy @  1.8.2008,  13:45 Найти цитируемый пост)
alexey009, зачем тебе было "разбираться в коде смарти" - не понятно. для построения шаблонов вполне достаточно списка разных конструкций(типа {if}, {foreach} и т.д.). для инициации достаточно двух методов: assign и display.

не могу понять как задать циклы и как один шаблон пихать в другой, если они в разных папках (например index.tpl лежит в папке engine/tempaltes/new/main, news.tpl  лежит в папке engine/tempaltes/new/news)
главный файл лежит в корневой директории( / ).
Нужно в index.tpl подключить news.tpl и news.tpl загнать в цикл(вывести список новостей)
подскажите как?

Цитата(skyboy @  1.8.2008,  13:45 Найти цитируемый пост)
а зачем, интересно? чтоб браузер корректно отобразил картинку, она должна иметь не абсолютный путь на диске относительно папки с шаблоном, а относительный/абсолютный путь основываясь на доменном имени(с точки зрения сервера - это DOCUMENT_ROOT)


просто так надо...
не хочется каждый раз писать /engine/templates/new/images/******.gif
а просто писать images/*****.gif
Потому что шаблонов может быть несколько(все лежат в папке templates) и чтобы адреса картинок не менялись.. удобнеее тому кто будет делать шаблоны..smile
PM MAIL   Вверх
skyboy
Дата 1.8.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



Цитата(alexey009 @  1.8.2008,  13:26 Найти цитируемый пост)
не могу понять как задать циклы

preg_replace c модификатором "е"
Цитата(alexey009 @  1.8.2008,  13:26 Найти цитируемый пост)
и как один шаблон пихать в другой

preg_replace c модификатором "е"
или же strstr и подобное.

Добавлено через 1 минуту и 26 секунд
Цитата(alexey009 @  1.8.2008,  13:26 Найти цитируемый пост)
и как один шаблон пихать в другой, если они в разных папках 

очевидно, надо указывать полный путь. не знаю, что ты рассчитывал найти в исходнике Смарти. он тоже не телепатирует, а:
а) смотрит в папке, указанной как "корневая папка шаблонов"
б) смотри по полному пути
все. поиск по всему диску на предмет файлов с заданным названием никто не проводит.
PM MAIL   Вверх
Kefir
Дата 1.8.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



news.tpl
Цитата

{foreach from=$newsArray item=news}
<p>{$news->Content}</p>
{/foreach}

index.tpl
Цитата

<html>
...
{$newsBlock}
...
</html>



Код

// создаём смарти
$smarty = new Smarty();
$smarty->template_dir = 'engine/templates';
$smarty->compile_dir = '...';
$smarty->cache_dir = '...';
$smarty->config_dir = '...';

// работаем
$smarty->assign("newsArray", $newsManager->getNews());
$smarty->assign("newsBlock", $smarty->fetch("new/news/news.tpl");
$smarty->display("new/main/index.tpl");

извини, но для каждой отдельной новости мучать news.tpl - это мазохизм  smile . поэтому мы просто даём в news.tpl массив с новостями и там его весь выводим. потом говорим смарти, чтобы он в переменную $newsBlock положил то что получилось с news.tpl (то биш уже готовый блок новостей) и выводим index.tpl. Вуаля.

Добавлено через 2 минуты и 17 секунд
то есть по сути тебе надо делать так - создавать конструкцию цикла для шаблона и передавать туда массив. потом загонять то что получилось в переменную и её уже вставлять в индекс. вот и всё. по крайней мере такая система в смарти.
PM MAIL WWW Skype   Вверх
alexey009
Дата 1.8.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



Цитата(Kefir @  1.8.2008,  15:39 Найти цитируемый пост)
извини, но для каждой отдельной новости мучать news.tpl - это мазохизм

разве?
вообще-то будет как-то так:
news.tpl
Код

<table border="0" cellspacing="0" cellpadding="6">
    <tr>
        <td width="100%" valign="top">{news_error.TEXT}</td>
    </tr>
</table>
<!-- BEGIN news_block -->
<table border="0" width="400" cellspacing="0" cellpadding="0" background="engine/images/news_fon.gif">
    <tr>
        <td width="100%" valign="top">
        <table border="0" width="100%" cellspacing="5" cellpadding="5">
            <tr>
                <td>
                <table border="0" width="100%" cellspacing="0" cellpadding="0">
                    <tr>
                        <td width="100%" align="left">&nbsp;&nbsp;<font size="3" color="#FFFFFF"><b>{news_block.NAME}</b> ({news_block.DATE})</font></td>
                    </tr>
                    <tr>
                        <td width="100%" align="left"><font size="3" color="#FFFFFF">{news_block.TEXT}</font></td>
                    </tr>
                </table>
                </td>
            </tr>
        </table>
        </td>
    </tr>
</table>
<!-- END news_block -->


При этом шаблон новостей будет в отдельном файле, и эти новости можно будет куда угодно впихнуть, не изменяя шаблона той страницы, куда эти новости вставленыsmile
вот так
PM MAIL   Вверх
americanets
Дата 1.8.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



alexey009, видимо Kefir имел ввиду не дергать кждый раз файл а загнать его в переменную и ее юзать smile 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
alexey009
Дата 1.8.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



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

И ещё вопрос... вот идет компиляция..
если задать
Код

$smarty->compile_dir = 'engine/templates/new/compile';

Верно? И как далее правильно компилировать и извлекать?
PM MAIL   Вверх
Kefir
Дата 1.8.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



alexey009, ну как, делаешь парсер. я ж писал уже. к примеру
somthing.tpl:
Цитата

{if $myImage != ""}<img src="{$myImage}">{else}<p>No image specified</p>{/if}

должно перевестись в:
something.tpl.php:
Код

<?php if($templater->vars['myImage'] != "") { ?><img src="<?php echo $templater->vars['myImage']; ?>"><?php } else { ?><p>No image specified</p><?php } ?>

то есть парсер должен переводить язык шаблона в язык ПХП. потом, к примеру, делаешь в классе шаблонизатора:
Код

funciton fetch( $path ) {
  if(!Templater::compiled( $path ) || Templater::needsRecompile( $path )) {
    Templater::compile( $path );
  }
  include( Templater::getCompiledVersion( $path );
}


Добавлено через 17 секунд
ну эт всё условно. но логика именно такая.
PM MAIL WWW Skype   Вверх
alexey009
Дата 1.8.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

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



Я вот все-равно никак понять не могу, как делать ЦИКЛЫ
файл index.php
Код

$smarty = new Smarty();
$smarty->template_dir = 'engine/templates';
$sql = "SELECT `id`, `name`, SUBSTRING_INDEX(`text`, ' ', 20) AS `text`, `site`, `date`, `img`, `visible` FROM `".NEWS_TABLE."` where `visible`='on' ORDER BY id desc";
$result = mysql_query ($sql);
while($row=mysql_fetch_assoc($result)) {
    $row['name'];
    $row['text'];
    $row['date'];
}

файл news.tpl
Код

<table border="0" width="100%" cellspacing="0" cellpadding="0">
    <tr>
        <td width="100%" align="left">{NAME} ({DATE})</td>
    </tr>
    <tr>
        <td width="100%" align="left">{TEXT}</td>
    </tr>
</table>

Так вот то что в news.tpl надо загнать в цикл. 
foreach НЕ ПОЙДЕТ, т.к. он по жизни тормознутый.
если делать типа
Код

{while ($row=mysql_fetch_assoc($result))}
<table border="0" width="100%" cellspacing="0" cellpadding="0">
    <tr>
        <td width="100%" align="left">{NAME} ({DATE})</td>
    </tr>
    <tr>
        <td width="100%" align="left">{TEXT}</td>
    </tr>
</table>
{/while}

то вот это уже возникает вопрос, а в чем собвственно заключается шаблонизатор? половина кода в php файле, а другая половина уже в самом шаблоне.
где плюсы? 
Отсюда - может мне ввобще нафиг шаблнизатор и html коды пихать в php файлы и все?
Знатоки, что посоветуете?
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1112 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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