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

Поиск:

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


Шустрый
*


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

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



Что требуется:
1. Для каждой функции свой шаблон, пример:
index.tpl
Код

<html>
<head>
<title>@TITLE@</title>
</head>
<body>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%">@name@</td>
</tr>
</table>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
@text@
</table>
</body>
</html>

news.tpl
Код

<tr>
<td width="100%">@name01@</td><td width="100%">@name02@</td>
</tr>


Теперь пояснения:
1. замена обычных переменных: title, name
2. замена блоков text в index.tpl: заменяется на файл news.tpl, который собственно выполняется N-е кол-во раз, т.е. результат может быть:
Код

<tr>
<td width="100%">@name01-@</td><td width="100%">@name02-@</td>
</tr><tr>
<td width="100%">@name01--@</td><td width="100%">@name02--@</td>
</tr>


Ваши предложения по реализацииsmile
Готовые решения не подходят(сильно огромные)
Вариант (который щас у меня стоит) не подходит по разным причинам:
Код

<html>
<head>
<title>@TITLE@</title>
</head>
<body>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="100%">@name@</td>
</tr>
</table>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<!-- BEGIN news -->
<tr>
<td width="100%">@news.name1@</td><td width="100%">@news.name2@</td>
</tr>
<!-- END news -->
</table>
</body>
</html>


Это сообщение отредактировал(а) alexey009 - 29.7.2008, 00:00
PM MAIL   Вверх
americanets
Дата 29.7.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





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


Шустрый
*


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

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



americanets, уже прочитал. ничего нового для себя не узнал...
Там нет намеков на решение моей проблемы.
мне надо в один файл(шаблон) подключать другие шаблоны. а не разбивать 1 сраницу на несколько последовательных файлов, типа
Код

$template->pparse('overall_header');
$template->pparse('left_body');
$template->pparse('index_body');
$template->pparse('overall_footer');


Добавлено через 4 минуты и 44 секунды
По сути мне требуется "загонять" шаблон в переменную. smile 
PM MAIL   Вверх
americanets
Дата 29.7.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(alexey009 @  29.7.2008,  13:39 Найти цитируемый пост)
уже прочитал. ничего нового для себя не узнал...


ну и зря, смотри все шаблоны это что-то заменить на данные, ну вот 

Код

$Data = тут твои данные, др щаблоны и прочее;

/*
* Обрабатываешь все что нужно
*
*/
$Html = str_replace('TYT_BYDYT_DANNIE',$Data,$AllHtmlTpl);


echo $Html;


мысль ясна ?




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


Шустрый
*


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

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



Ага. спасибо. И ещё вопрос, как лучше подключить и обработать файл шаблона, чтобы была минимальная нагрузка на сервер?
PM MAIL   Вверх
americanets
Дата 29.7.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

file_get_contents() 


получать содержимое файла

Код

str_***
preg_*** 


обрабатывать , str - работают быстрее


Цитата(alexey009 @  29.7.2008,  14:00 Найти цитируемый пост)
подключить и обработать файл шаблона, чтобы была минимальная нагрузка на сервер? 


кэшируй


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


Шустрый
*


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

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



Вот, но почемуто не работает цикл. заменят только 1 раз.  smile  :
Код

function news($news){
    $html_n = $news;
    for($i = 0; $i<5; $i++){
        $name = 'ИМЯ_НОВОСТИ';
        $text = 'ТЕКСТ_НОВОСТИ';
        $html_n = str_replace('@name@', $name, $html_n);
        $html_n = str_replace('@text@', $text, $html_n);
    }
    return $html_n;
}

$start = file_get_contents('index.tpl');
$news = file_get_contents('news.tpl');

$title = 'ЗАГЛАВИЕ';
$text = 'ТЕКСТ_ЗАГЛАВИЕ';
$new = news($news);

$html = str_replace('@news@', $new, $start);
$html = str_replace('@title@', $title, $html);
$html = str_replace('@text@', $text, $html);

echo $html;

index.tpl
Код

<html>

<head>
  <title></title>
</head>

<body>
@title@<br>
@text@<br>
@news@

</body>

</html>

news.tpl
Код

@name@<br>
@text@<br>
--------


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


Эксперт
***


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

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



Цитата(alexey009 @  29.7.2008,  14:31 Найти цитируемый пост)
1 раз


видимо последний, а как ты думал smile ты передешь ему кусок кода, он в нем все заменяет, потом так еще 4 раза перетирает его


как пример 

Код

$Html = 'la la la ';

$Html = 'Test';

echo $Html;

/////////////////////

$Html = 'la la la';
$Html .='Test';

echo $Html;



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


Шустрый
*


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

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



И что же менять?
Пробывал сам, не получилось...
PM MAIL   Вверх
americanets
Дата 29.7.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

function news($news){

    $html_n = '';

    for ($i = 0; $i<5; $i++) {
         $name = 'ИМЯ_НОВОСТИ';
         $text = 'ТЕКСТ_НОВОСТИ';
         $html_n .= str_replace(
                                 array('@name@' , '@text@'), 
                                 array($name,$text), 
                           $news);
    }
    return $html_n;
}


как то так


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


Шустрый
*


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

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



Все понятноsmile
Теперь, я думаю, надо шаблонизатор загнать в класс...
Вот только что в нем должно быть?
Мне кажется должны быть минимум 2 функции:
1. Замена
2. определение шаблона
Что ещё?

 smile P.S. в php уже более 3х лет, а в классах ничего не понимаю, посоветуйте документацию плиз
PM MAIL   Вверх
klyxa
Дата 29.7.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

<?php
    class Template
    {
        var $tplname;
        var $tpl;
        var $path;
        var $tplfile;

        function Template($tpl, $module)
        {
            $this->tplname = $tpl.".php";
            $this->path = $this->set_path($module);

            if (!$tpl) $this->kill_class("Error: Empty template name!");
            if (!$this->path) $this->kill_class("Error: Unknown template module!");

            $this->tplfile = $this->path . $this->tplname;

            if (!$this->tpl_exists()) $this->kill_class("Error: Template file $this->tplfile doesn't exist!");
        }
        
        function set_path($module)
        {
            switch($module)
            {
                case "IBlock": $dir = TPL_DIR."infoblocks/"; break;
                default: $dir = ""; break;
            }

            return $dir;
        }

        function kill_class($error)
        {
            print $error."<BR>";
        }

        function tpl_exists()
        {
            if (file_exists($this->tplfile)) return true;
            else return false;
        }

        function Load_Template()
        {
            $cnt = file_get_contents($this->tplfile);
            return $cnt;
        }

    };
?>

м?
PM MAIL   Вверх
alexey009
Дата 29.7.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



klyxa, опа smile а какая функция что делает?  smile 
PM MAIL   Вверх
americanets
Дата 30.7.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



alexey009, это не совсем - то что ты хочеш сделать, а книжка вот http://www.ozon.ru/context/detail/id/3600968/


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


Шустрый
*


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

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



americanets, спасибо, почитал...

Как разумно организовать шаблонизатор?
может вообще не создавать никаких функций и классов?
Просто ограничится
Код

str_replace(array(), array(), file)

Но все-таки хотелось организовать что-то вроде:
определение шаблонов(в функции должен задаваться "истинный" путь к файлам шаблонов(типа engine/templates/new_temp)):
Код
set_filenames(array(
    'index' => 'index.tpl',
    )
);


замены(функция должна возвращать получившееся, чтобы вставлять в след. замены шаблонов):
Код
assign_vars(array(
    '@name@' => $name,
    '@text@' => $text
    ), $file
);


ну и далее вывод(в переменной $index должен лежать результирующий шаблон)
Код

pparse($index);


И вопрос, как это все можно организовать без глюков и тормозов?

Это сообщение отредактировал(а) alexey009 - 31.7.2008, 00:25
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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