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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с шаблонизатором, <?php echo $title; ?> - стала как строка 
:(
    Опции темы
Цербер
Дата 9.9.2008, 16:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток!
Пробую вникнуть в шаблонизаторы, и делаю небольшой пример для себя, всё вроде правильно но вот когда идёт возврат результата, пхп-шный код выводится как строка.
вот сам код:
tpl
Код

<table cellpadding="0" cellspacing="0" class="adv">
    <tr>
        <td class="adv_top" id="top_{=number}" align="center"> {=title} </td>
    </tr>
    <tr>
        <td class="adv_center" align="center">
            <img src="img/farma/photo/{=img} />
        </td>
    </tr>
    <tr>
        <td class="adv_bottom" id="bottom_{=number}">{=link}</td>
    </tr>
    <tr>
        <td class="red">{=cost}</td>
    </tr>
</table>

класс обработки:
Код

class Templater{
    var $temp='';
    
    function __construct(){
        $mas = new Mysql();
        $query = $mas->query("select * from table where new=1");
        while ($row = $mas->result_array($query)){
            $str = $this->temp = file_get_contents("tpl/farma_one.tpl");
            $number = $row['temp'];
            $title = $row['name'];
            $img = $row['img'];
            $link = '?id='.$row['id'];
            $cost = $row['price'];
            $mas_search = array("{=","}");
            $mas_need = array("<?php echo $","; ?>");
            $new_str = str_replace($mas_search,$mas_need,$str);
            echo $new_str;
        }
    }
}

Заранее благодарю!
PM MAIL ICQ   Вверх
bars80080
Дата 9.9.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



а что другого ты ожидал?
$mas_need = array("<?php echo $","; ?>");
у тебя же вставляется сама строка. а где отправка его на выполнение? да и странно это, почему было сразу не замещать {TITLE} на $title?
PM MAIL WWW   Вверх
Цербер
Дата 9.9.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bars80080
можешь показать как правильно?
PM MAIL ICQ   Вверх
bars80080
Дата 9.9.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



через класс, нет. 

а просто - хватает одной функции str_replace в которую засовываешь кусок текста и массивы с заменяемыми данными

Код

$needle = array('{TITLE}', '{IDTOP}'); $new = array($title, $idtop);
$text = str_replace($needle, $new, $text);


Это сообщение отредактировал(а) bars80080 - 9.9.2008, 16:31
PM MAIL WWW   Вверх
Sunvas
Дата 9.9.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Я бы рекомендовал str_ireplace для шаблонизатора - так не надо задумываться о регистре "переменных".


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Цербер
Дата 10.9.2008, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и снова здравствуйте=)
переделал функцию которая заменяет {var}, теперь она вставляет не переменную а её значение=)
но почему то не все значения подставляются, а только последнее=(
она находит {имя переменной} и вставляет значение, которое функции передаётся в массиве.
помогите исправить=(
Код

function __construct(){
        $mas = new Mysql();
        $query = $mas->query("select * from farma where new=1");
        while ($row = $mas->result_array($query)){
            $str = $this->temp = file_get_contents("tpl/farma_one.tpl");
            $number = $row['temp'];
            $title = $row['name'];
            $img = $row['img'];
            $link = $row['id'];
            $cost = $row['price'];
            $mas_search = array("{=","}");
            $mas_need = array("<?php echo $","; ?>");
            $new_str = str_replace($mas_search,$mas_need,$str);
            $out = $this->replace_var($str,array('number'=>$number,'title'=>$title,'img'=>$img,'number'=>$number,'link'=>$link,'cost'=>$cost));
        }
    }
    
    function replace_var($str,$data=array()){
        $pattern = '/\{([a-zA-Z]*)\}/';
        if(preg_match_all($pattern,$str,$mas)){
            //print_r($mas[0]);
            foreach ($mas[0] as $v){
                $value_mas = substr($v,1,-1);
                $str_new = str_replace($v,$data[$value_mas],$str);
            }
            echo $str_new;            
        }
    }


PM MAIL ICQ   Вверх
Sunvas
Дата 10.9.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цербер, ну загнул. Ведь можно проще:
Код

#....
$out = $this->replace_var($str,array('{number}'=>$number,'{title}'=>$title,'{img}'=>$img,'{number}'=>$number,'{link}'=>$link,'{cost}'=>$cost));
#....

    function replace_var($str,$data=array())
   {
    #Тут можно сделать проверку на то, если ли в ключах массива спереди и вконце { и } соответственно.
    return str_replace(array_keys($date),array_values($date),$str);
   }




--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
lukas
Дата 10.9.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Цербер @  9.9.2008,  16:06 Найти цитируемый пост)
Пробую вникнуть в шаблонизаторы, и делаю небольшой пример для себя, всё вроде правильно но вот когда идёт возврат результата, пхп-шный код выводится как строка.
вот сам код:


В двойных кавычках происходит экранизация всех символов... либо используй одинарные, либо функцию stripslashes


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
nerezus
Дата 10.9.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Я бы рекомендовал PHP в качестве шаблонизатора.
Твой аналог послабее будет и велосипед.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Sunvas
Дата 10.9.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(nerezus @  10.9.2008,  14:20 Найти цитируемый пост)
Я бы рекомендовал PHP в качестве шаблонизатора.

А я так не считаю.
Во-первых: такой подход очень не нравится верстальщикам - обычно их бесит, если среди HTMLa нужно вставлять PHP.
Во-вторых: и как такой файл использовать?
Если будем инклудить тупо - результат сразу будет выдаваться браузеру, мало того, что по чуть-чуть, так еще и куки после такого инклуда не будет возможности установить. Нет, конечно можно призвать на помощь ob_start() но по-мому это личшняя трата производительности.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
awers
Дата 10.9.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

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



С таким подходом советую использовать смарти
PM MAIL WWW ICQ Skype   Вверх
nerezus
Дата 10.9.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

Во-первых: такой подход очень не нравится верстальщикам - обычно их бесит, если среди HTMLa нужно вставлять PHP.
 А чем «<?» хуже, чем «{»?
Пожалуйста распиши это. Вариант «Тут на целый символ больше» не принимается.


Цитата

Во-вторых: и как такой файл использовать?
 Да абсолютно так же.

Цитата

Нет, конечно можно призвать на помощь ob_start() но по-мому это личшняя трата производительности.
 О да, экономим 3 вызова функций(работа с буффером), но пользуемся заменой(вложенные циклы).
Да вы прожженный экономист, батенька  smile 


Код

function php_template($filename, $values) {
    extract($values);
    ob_start();
    include $filename;
    $result = ob_get_contents();
    ob_end_clean();
    return $result;
}


Цитата

Если будем инклудить тупо - результат сразу будет выдаваться браузеру, мало того, что по чуть-чуть, так еще и куки после такого инклуда не будет возможности установить
 Могу в виде класса с интерфейсом а-ля Smarty дать. Интересует?

Добавлено через 1 минуту и 54 секунды
P.S. 
Цитата

С таким подходом советую использовать смарти
 Или PHP. Пример выше. И предложение сделать аналогичный класс тоже выше.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Sunvas
Дата 10.9.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(nerezus @  10.9.2008,  17:42 Найти цитируемый пост)
О да, экономим 3 вызова функций(работа с буффером), но пользуемся заменой(вложенные циклы).

Где Вы у меня циклы узрели?
Сомневаюсь, что вызов трех функций (использование буфера, кстати), инклуд файла, проверка синтаксиса и выполнение кода, соответственно будет производительнее тупой замены по файлам.

Цитата(nerezus @  10.9.2008,  17:42 Найти цитируемый пост)
А чем «<?» хуже, чем «{»?

Хотя бы тем, что надо еще писать echo; ставить имя переменной, которая, заметим, чувствительна к регистру; ставить точку с запятой; в логических условиях нужно знать синтаксис и точные данные перемменных (допустим, переменная будет в классе и т.п.). При этом, если в шаблонизаторе найдется какая-то ошибка - это минимум создат NOTICE ошибку, максимум - повесит весь скрипт. Достаточно?

Цитата(nerezus @  10.9.2008,  17:42 Найти цитируемый пост)
Могу в виде класса с интерфейсом а-ля Smarty дать. Интересует?

Лично меня - нет. Спасибо.

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

<?php
#...Посылка заголовков и прочего
ob_start('EndPage');
#...Тут - вывод на экран. и конец скрипта собственно.
function EndPage($str)
{
   return SiteHeader().$str.SiteFooter();
}

Так вот, Ваш способ при помощи PHP шаблонизатора не будет работать, потому что ob_start() в функции SiteHeader() вызовут ошибку. Будет Вам, что сказать на сей счет?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gta4kv
Дата 10.9.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

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



Цитата

Цитата

А чем «<?» хуже, чем «{»?

Хотя бы тем, что надо еще писать echo; ставить имя переменной, которая, заметим, чувствительна к регистру; ставить точку с запятой; в логических условиях нужно знать синтаксис и точные данные перемменных (допустим, переменная будет в классе и т.п.). При этом, если в шаблонизаторе найдется какая-то ошибка - это минимум создат NOTICE ошибку, максимум - повесит весь скрипт. Достаточно?

Да и в соседней теме обсуждалось что это, так сказать, моветон
PM MAIL   Вверх
nerezus
Дата 10.9.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

Где Вы у меня циклы узрели?
 Внутри str_replace их нету?)

Цитата

Хотя бы тем, что надо еще писать echo; ставить имя переменной

<?=$var?> - не надо.
С хостингом проблем не будет - отконфигурировать можно.

Цитата

 которая, заметим, чувствительна к регистру;
 Считаю это плюсом.
Посмотри на старые языки и на современные ;) Закономерность )

Цитата

 ставить точку с запятой;
 последняя ; перед ?> не обязательна. Синтаксис.

Цитата

Так вот, Ваш способ при помощи PHP шаблонизатора не будет работать, потому что ob_start() в функции SiteHeader() вызовут ошибку. Будет Вам, что сказать на сей счет?
 У меня nested-шаблоны, а не нарезка, собираются от внутреннего ко внешнему. Композит.
Поэтому такими костылями(по крайней мере так считаю подобный код) не пользуюсь.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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