[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вставка шаблона с PHP элементами
gidrosoldat
Хола! Столкнулся с интересным моментом и хотел бы его обсудить.
Ситуация такая, в PHP скрипте весь контент страницы находится в переменной $content. Мне к ней надо добавить шаблон формы, находящийся в файле form.tpl.

Если я добавляю таким макаром:

$content .= file_get_contents('form.tpl');


то вставки PHP кода в файле form.tpl, не срабатывают. Например, строка <?php echo getInfo($info); ?> в исходном коде странички будет, но она не выполнится. Фаирфокс ее даже розовым цветом выделяет (что бы это значило?).
В строке <input name='form[value1]' type='text' maxlength='50' class="form_field" value='<?php echo $POST['value1'];?>'> PHP вставка тоже не сработает, файрфокс покажет этот код в области ввода формы. И так далее.

Если добавлять шаблон методом кеширования:

ob_start();
include 'form.tpl';
$form = ob_get_contents();
ob_end_clean();
$content .=$form;


все будет работать как надо.
В чем тут разница? Почему в первом случае PHP код не вызывается, а во втором все в порядке?




Спустя 16 минут, 47 секунд (27.02.2011 - 11:21) uWeb написал(а):
Попробуй сначала запрос записывать в пустую переменную, а потом уже добавлять в $content.

Спустя 5 минут, 16 секунд (27.02.2011 - 11:26) gidrosoldat написал(а):
uWeb
Ты считаешь, что есть разница между
$content .= file_get_contents('form.tpl');

и
$form = file_get_contents('form.tpl');
$content .= $form;

?

Спустя 1 день, 32 минуты, 34 секунды (28.02.2011 - 11:59) Ulan написал(а):
а как ты исполняешь код из $content ? через eval?

может быть, нужно php теги добавить

$content .= "?>" . file_get_contents('form.tpl') . "<?php";

Спустя 8 минут, 42 секунды (28.02.2011 - 12:07) T1grOK написал(а):
Вот 2 полезных функции. Пользуйтесь на здоровье!

<?php
function
getTpl($tpl){
if(file_exists('skins/template/'. $tpl .'.tpl'))
return file_get_contents('skins/template/'. $tpl .'.tpl');
else
die('The template <b>'. $tpl .'.tpl</b> is absent in the specification');
}

function parseTpl($cont, $data = ''){

if(is_array($data)){

extract($data, EXTR_PREFIX_ALL, 'tpl');

ob_start();
eval('?>'. $cont .'<?php ');
$cont = ob_get_contents();
ob_end_clean();
}

return $cont;
}
?>

Спустя 1 час, 11 минут, 48 секунд (28.02.2011 - 13:19) sergeiss написал(а):
gidrosoldat - а что именно содержится в шаблоне из ПХП? Только вывод некоторых переменных?

Спустя 5 дней, 1 час, 41 минута, 3 секунды (3.03.2011 - 15:00) gidrosoldat написал(а):
Ок, пример в студию.
К ленте сформированных комментариев содержащихся в переменной $content добавляю содержимое файла form.tpl.
form.tpl :
<form method='post' action=''>
<div
id='form_text' style='float:left'>
<p
class='form_text'>Ваше Имя или Прозвище:</p></div>
<input
name='form[value1]' type='text' size='30' maxlength='500' class="form_field" value='<?php echo $POST['value1'];?>'>
<br>
<div
id='form_text' style='float:left'>
<p
class='form_text'>Комментарий:</p></div>
<textarea
name='form[value2]' style="width:60%" class="form_field" rows='4' maxlength='5000'><?php echo $POST['value2'];?></textarea>
<br>
<div
id='form_text' style='float:left'>
<p
class='form_text'>Так мы пробуем защититься от злых рекламных ботов</p></div>
<img
id="captcha" src="./libs/securimage/securimage_show.php" alt="CAPTCHA Image" />
<a
href="#" onclick="document.getElementById('captcha').src = './libs/securimage/securimage_show.php?' + Math.random(); return false">Не могу разобрать!</a>
<br />
<div
id='form_text' style='float:left'>
<p
class='form_text'>Введите код с картинки</p></div>
<input
type="text" name="captcha_code" size="10" class="form_field" maxlength="6" />
<br />
<div
id='form_text' style='float:left'></div>
<input
name='ok_comment' type='submit' value='Увековечить мое мнение!' />
<?php
echo getInfo($info); ?>
</form>



Если добавить форму функцией file_get_contents, PHP вставки не выполнятся. Почему?

Спустя 2 часа, 51 минута, 54 секунды (3.03.2011 - 17:52) Ulan написал(а):
гы, до меня дошло smile.gif в чем ошибка. когда ты используешь кеширование, ты добавляешь к строке $content уже исполненый код, и все php вставки уже отработали.

file_get_contents пишет в переменную просто строку. у тебя наверняка $content выводится через echo, с чего бы ему исполняться.
если нужно исполнить код записанный в строку нужно использовать eval()

Спустя 4 часа, 44 минуты, 59 секунд (3.03.2011 - 22:37) sergeiss написал(а):
gidrosoldat - вот смотри, пример из моего кода (то же, что и ты хочешь получить :))

Итак, есть файл1. Это может быть обыкновенный HTML файл. Потому что, хотя там и есть переменная $title, но этот код не будет совсем уж напрямую обрабатываться сервером. Это сделаю я в своем скрипте.
Пусть он будет назван enter_form.html

<label id="one_string_label" style="position:absolute; left: 167px; top: 23px; ">$title</label>
<textarea
id="one_string" style="position:absolute; left: 27px; top: 57px; width: 541px; height: 55px;" ></textarea>
....


В другом файле, скрипте-обработчике, вызываем его так (упрощенный код без обработки ошибок):
$info=htmlspecialchars( file_get_contents( 'enter_form.html' ) ); // загрузили в переменную
$title='Новый заголовок для окна'; // может быть назначено любым способом, в т.ч. из ГЕТ и ПОСТ
eval( '$info_new= "'.$info.'"; '); // просто создаём строку назначения и выполняем её
echo htmlspecialchars_decode($info_new); // выводим полученные данные

Что тут происходит важного? Внутри eval() происходит создание строки. Где данные находятся в двойных кавычках... Поэтому переменная $title заменяется на её значение. А затем мы полученную строку сохраняем в переменную $info_new. Которую выводим в следующей строке.
Существенно: если не использовать htmlspecialchars и обратную ей функцию, то хрен что получится... Потому что в файле с формой есть кавычки двойные. На время работы eval мы кавычки из формы "маскируем", а потом опять переводим в нормальный вид.

Спустя 6 дней, 16 часов, 54 минуты, 28 секунд (10.03.2011 - 15:32) gidrosoldat написал(а):
sergeiss
Ulan
спасибо, ребята. Вроде уже разобрался )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.