$text = 'Тут какой-то текст <? тут php скрипт ?> тут опять текст';
echo '$text';
Как сделать, чтобы скрипт в переменной не выводился на экран как текст а выполнялся?
Спустя 48 минут, 47 секунд (26.08.2012 - 16:31) KOPOJI написал(а):
eval() для этого, но я не рекомендую это делать. лучше отдельно выводить текст и отдельно выполнять, это лишнее совмещать таким образом все.
Спустя 11 минут, 17 секунд (26.08.2012 - 16:42) denis79513 написал(а):
Понимаю что это не лучший вариант, но без этого никак, увы(
Спустя 20 минут, 19 секунд (26.08.2012 - 17:03) KOPOJI написал(а):
такого не бывает чтобы без этого нельзя было обойтись. Если без этого не обойтись в вашем скрипте, значит у вас неверная архитектура и вам нужно ее менять. иначе потом можете пожалеть
Спустя 1 минута, 13 секунд (26.08.2012 - 17:04) KOPOJI написал(а):
и если уж все таки будете использовать eval() - то сообщаю что внутри должен быть правильный php-код, вплоть до точки с запятой в конце строки
Спустя 32 минуты, 22 секунды (26.08.2012 - 17:36) denis79513 написал(а):
Сейчас пишу класс шаблонов для своего проекта и там нужно чтобы в переменной выполнялся php код, иначе смысл шаблонов теряется.
Спустя 1 минута, 38 секунд (26.08.2012 - 17:38) denis79513 написал(а):
Цитата (KOPOJI @ 26.08.2012 - 15:04) |
и если уж все таки будете использовать eval() - то сообщаю что внутри должен быть правильный php-код, вплоть до точки с запятой в конце строки |
да, уже чувствую проблемы)
Спустя 42 секунды (26.08.2012 - 17:39) KOPOJI написал(а):
Цитата |
иначе смысл шаблонов теряется. |
впервые об этом слышу
![blink.gif](http://phpforum.su/html/emoticons/blink.gif)
Спустя 2 минуты, 49 секунд (26.08.2012 - 17:41) denis79513 написал(а):
Ну вот смотрите например у меня шаблон main.tpl
содержимое типа:
На одной странице у меня BODY - простой текст, а на другой например цикл, который печатает строки в таблице, и как быть?
содержимое типа:
<b>{BODY}</b>
На одной странице у меня BODY - простой текст, а на другой например цикл, который печатает строки в таблице, и как быть?
Спустя 58 минут, 56 секунд (26.08.2012 - 18:40) KOPOJI написал(а):
ну так и заменяйте его на код.
Основной принцип шаблонизации - как раз в отделении бизнес-логики приложения от логики представления. а таким образом получается что вы сбрасываете на нет эту логику и вообще смысл шаблонов
Основной принцип шаблонизации - как раз в отделении бизнес-логики приложения от логики представления. а таким образом получается что вы сбрасываете на нет эту логику и вообще смысл шаблонов
Спустя 52 секунды (26.08.2012 - 18:41) KOPOJI написал(а):
Спустя 11 часов, 52 минуты, 22 секунды (27.08.2012 - 06:34) denis79513 написал(а):
А вы прочти абзац, который начинается с : А все дело в...
Там как раз моя ситуация и говорится, что "Нужно отделять логику приложения от логики отображения, но это не значит, что в HTML-шаблоне мы не можем использовать PHP-код."
У меня сейчас вот такая проблема возникла, не пойму почему, но исчезают переменные из текста.
Потом выводим на страницу значение переменной TITLE и получается:
То есть все что со знаком доллара впереди ($i) исчезает. Я не знаю почему, но предполагаю, что это в php так заложено, как это обойти?
Как следствие eval выдает ошибку из-за неправильности php кода
Там как раз моя ситуация и говорится, что "Нужно отделять логику приложения от логики отображения, но это не значит, что в HTML-шаблоне мы не можем использовать PHP-код."
У меня сейчас вот такая проблема возникла, не пойму почему, но исчезают переменные из текста.
$TPL -> set_value(array("TITLE" => "Тут текст
<?php
$i = '0';
if ($i == '0')
{
echo 'хахаха';
}
?>"
));
Потом выводим на страницу значение переменной TITLE и получается:
Тут текст
<?php
= '0';
if ( == '0')
{
echo 'хахаха';
}
?>
То есть все что со знаком доллара впереди ($i) исчезает. Я не знаю почему, но предполагаю, что это в php так заложено, как это обойти?
Как следствие eval выдает ошибку из-за неправильности php кода
Спустя 1 час, 7 минут, 30 секунд (27.08.2012 - 07:41) Игорь_Vasinsky написал(а):
eval('?>'. $some_tpl .'<?php');
это нормальная ситуация в данном случае использовать eval()
сам не однократно использовал для работы с шаблонами.
даж функция простенькая
getTpl($tpl)
{
return eval('?>'. $some_tpl .'<?php');
}
getTpl('path/to/template.tpl');
но ушки на макушке должны быть, т.к. правильно подмечено выше - должен быть правильный php, т.к. при моём примере - будет лишь нотис о работе функции, а не ошибка с номером строки и файла.
Спустя 5 минут, 40 секунд (27.08.2012 - 07:47) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 05:41) |
eval('?>'. $some_tpl .'<?php'); это нормальная ситуация в данном случае использовать eval() сам не однократно использовал для работы с шаблонами. даж функция простенькая getTpl($tpl) getTpl('path/to/template.tpl'); но ушки на макушке должны быть, т.к. правильно подмечено выше - должен быть правильный php, т.к. при моём примере - будет лишь нотис о работе функции, а не ошибка с номером строки и файла. |
Спасибо, функции я уже все прописал, примерно то же что и у вас, вот только не могу проблему решить которую описал в посте выше, можете что-то подсказать? Почему переменные пропадают?
Спустя 28 минут, 55 секунд (27.08.2012 - 08:16) KOPOJI написал(а):
не бывает такой ситуации чтобы невозможно было обойтись без eval().
К примеру тот же цикл вывода как вы говорите - накопите весь вывод в переменную и замените на значение переменной. Зачем же php-код то загонять туда на выполнение?
К примеру тот же цикл вывода как вы говорите - накопите весь вывод в переменную и замените на значение переменной. Зачем же php-код то загонять туда на выполнение?
![huh.gif](http://phpforum.su/html/emoticons/huh.gif)
Спустя 7 минут, 30 секунд (27.08.2012 - 08:23) denis79513 написал(а):
цикл я пример как пример, у меня куда более сложные условия проверяются и в зависимости от них отображается контент. Отдельно подключать модули с php кодом не хочу.
Кто-нибудь с проблемой с исчезновением переменных поможет?
Кто-нибудь с проблемой с исчезновением переменных поможет?
Спустя 11 минут, 2 секунды (27.08.2012 - 08:34) KOPOJI написал(а):
Спустя 3 минуты, 8 секунд (27.08.2012 - 08:37) Игорь_Vasinsky написал(а):
Цитата |
е бывает такой ситуации чтобы невозможно было обойтись без eval(). |
согласен, я например щас в большей мере использую альтернативный синтаксис в самих шаблонах.
ТС - убери нафиг из шаблона <?php и ?>
Спустя 8 минут, 14 секунд (27.08.2012 - 08:46) denis79513 написал(а):
Покажу популярнее.
Следующий код:
отображается так:
а должен так:
Следующий код:
$a = " $i = '0'; if ($i == '0') { echo 'хахаха';}";
echo $a;
отображается так:
= '0'; if ( == '0') { echo 'хахаха'; }
а должен так:
$i = '0'; if ($i == '0') { echo 'хахаха';}
Спустя 2 минуты, 52 секунды (27.08.2012 - 08:48) KOPOJI написал(а):
ага.. а если register_globals = on? это я про пример с заголовком. второе - если вы в eval() загоните код вывода из базы что будет если ваш сайт от-XSS-сят!?
к примеру на такую строчку
к примеру на такую строчку
UPDATE `users` SET `name`='echo "<script>window.location.replace(\"http://sex.ru\");</script>";'
Спустя 1 минута, 38 секунд (27.08.2012 - 08:50) KOPOJI написал(а):
в общем смотрите сами. я предупредил вас о вреде eval(), предложил альтернативу с накапливанием вывода - если хотите продолжать eval-ить - на здоровье.
Спустя 3 минуты, 17 секунд (27.08.2012 - 08:53) Игорь_Vasinsky написал(а):
KOPOJI
лан, уломал, напишем всем форумом хостеру ТС - чтоб eval в disable function включил.
а про обработку данных не слышали?
лан, уломал, напишем всем форумом хостеру ТС - чтоб eval в disable function включил.
а про обработку данных не слышали?
Спустя 30 секунд (27.08.2012 - 08:54) Игорь_Vasinsky написал(а):
альтернатива - ob_start() + strtr()
Спустя 1 минута, 2 секунды (27.08.2012 - 08:55) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 06:48) |
ага.. а если register_globals = on? это я про пример с заголовком. второе - если вы в eval() загоните код вывода из базы что будет если ваш сайт от-XSS-сят!? к примеру на такую строчку UPDATE `users` SET `name`='echo "<script>window.location.replace(\"http://sex.ru\");</script>";' |
Ну во первых то что я туда загоню выборку из БД не факт, а если и загоню, то использую спец. функции для безопасности. Вы можете помочь с проблемой описанной выше?
Спустя 20 минут, 1 секунда (27.08.2012 - 09:15) KOPOJI написал(а):
eval("\$i=0;");
eval("if ($i == '0') { echo 'хахаха';}");
Спустя 28 минут, 24 секунды (27.08.2012 - 09:43) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 07:15) |
eval("\$i=0;"); |
а вот за это огромное спасибо ;)
Потом может выложу свой template class на общее пользование...
Спустя 26 минут, 16 секунд (27.08.2012 - 10:10) Игорь_Vasinsky написал(а):
не надо
![biggrin.gif](http://phpforum.su/html/emoticons/biggrin.gif)
Спустя 1 час, 5 минут, 33 секунды (27.08.2012 - 11:15) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 08:10) |
не надо ![]() |
да не бойтесь так, люди кроме вас тоже иногда что-то полезное пишут)
Спустя 7 минут, 32 секунды (27.08.2012 - 11:23) KOPOJI написал(а):
Цитата |
да не бойтесь так, люди кроме вас тоже иногда что-то полезное пишут) |
никто не говорил что вы что то бесполезное пишете
имелось в виду что вы просто неправильный подход используете.. но вам виднее как выяснилось)
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
Спустя 6 минут, 1 секунда (27.08.2012 - 11:29) Игорь_Vasinsky написал(а):
совершенно верно.
я же писал выше.
если уж используешь eval() - разумней весь tpl за раз обработать - 1 вызов функции, нежели как ты, "евалить" на каждой строчке
я же писал выше.
если уж используешь eval() - разумней весь tpl за раз обработать - 1 вызов функции, нежели как ты, "евалить" на каждой строчке
![wink.gif](http://phpforum.su/html/emoticons/wink.gif)
Спустя 9 минут, 11 секунд (27.08.2012 - 11:38) denis79513 написал(а):
Цитата (Игорь_Vasinsky @ 27.08.2012 - 09:29) |
если уж используешь eval() - разумней весь tpl за раз обработать - 1 вызов функции, нежели как ты, "евалить" на каждой строчке ![]() |
я так и делаю сначала весь шаблон из кусочков собирается а в конце при помощи eval отображается.
Только у меня подозрительно маленький класс получился, около 100 строк, может нужно еще что предусмотреть важное?
Спустя 46 минут, 12 секунд (27.08.2012 - 12:24) denis79513 написал(а):
еще проблема возникла, как сделать, чтобы в коде, который обрабатывает функция eval можно было обращаться к объектам, созданным за ее приделами. Например:
$OBJ = new object;
$a = "$OBJ -> function();";
eval ($a);
Спустя 21 минута, 5 секунд (27.08.2012 - 12:45) KOPOJI написал(а):
так не получится. вы внутри строки обращаетесь к нему, тогда надо использовать __toString() - а уже не то будет
Спустя 1 минута, 13 секунд (27.08.2012 - 12:46) KOPOJI написал(а):
если только вот так
$obj = new object;
eval("\$obj->foo();");
Спустя 7 минут, 12 секунд (27.08.2012 - 12:54) denis79513 написал(а):
попробовал со слешем, выдает
syntax error, unexpected T_VARIABLE, expecting T_STRING
буду наверно тогда просто создавать объекты внутри
syntax error, unexpected T_VARIABLE, expecting T_STRING
буду наверно тогда просто создавать объекты внутри
Спустя 2 минуты, 8 секунд (27.08.2012 - 12:56) KOPOJI написал(а):
быть такого не может
Результат:
OK
только что проверил..
class bar {
public function foo() {
echo 'OK';
}
}
$obj = new bar;
eval("\$obj->foo();");
Результат:
OK
только что проверил..
Спустя 1 минута, 27 секунд (27.08.2012 - 12:57) KOPOJI написал(а):
ты наверное вместо двойных кавычек одинарные написал
Спустя 24 минуты, 38 секунд (27.08.2012 - 13:22) denis79513 написал(а):
да, одинарные, двойные я не могу использовать потому что внутри могут быть html теги и тогда получится
eval("\$obj->foo(); echo '<img src="site">';");
Спустя 51 секунда (27.08.2012 - 13:23) denis79513 написал(а):
может написать функцию которая будет менять все кавычки внутри на двойные, чтобы весь код не переписывать
Спустя 4 минуты, 3 секунды (27.08.2012 - 13:27) KOPOJI написал(а):
$text = ' <?php .... ?>';
$text = str_replace("'",'"',$text);
file_put_contents('new_file.php');
Скрытый текст |
но мое мнение вообще про идею с eval() вы знаете |
Спустя 15 минут, 30 секунд (27.08.2012 - 13:42) denis79513 написал(а):
Цитата (KOPOJI @ 27.08.2012 - 11:27) | ||
$text = ' <?php .... ?>';
|
я об этом уже подумал, а как быть, когда внутри <?php ?> есть echo "..."; там то двойные кавычки нужно оставить
Наверно лучше напишу функцию которая внутри каждого темплейта будет создавать нужные объекты, там по-мойму быстрее и надежнее будет, как считаешь?
Спустя 15 минут, 17 секунд (27.08.2012 - 13:57) KOPOJI написал(а):
а экранирование символов для чего тогда?)
eval(" echo \"hello, world!\";");
Спустя 1 минута, 12 секунд (27.08.2012 - 13:59) KOPOJI написал(а):
как на мой взгляд - динамического создания объектов внутри шаблона лучше избежать. аргументировать не могу, просто почему то так кажется (возможно, и ошибаюсь)
Спустя 5 минут, 21 секунда (27.08.2012 - 14:04) KOPOJI написал(а):
interface info {
function search();
function show();
}
class show_info implements info {
function search() {
}
function show() {
}
}
class show_info2 implements info {
function search() {
}
function show() {
}
}
eval("\$obj1 = new show_info;");
eval("\$obj2 = new show_info2;");
может и есть в этом какой то смысл..