Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Строка с подставленными переменными
Форумы портала PHP.SU » PHP » Программирование на PHP » Строка с подставленными переменными

Страниц (2): [1] 2 »
 

1. cat - 25 Июня, 2009 - 11:43:00 - перейти к сообщению
Нужна часть скрипта для следующей задачи.
Есть на сервере файл-шаблон.phtml вида:
...
<p>Текст первого абзаца - <?=$_POST[abs1]?></p>
<p>Текст второго абзаца - <?=$_POST[abs2]?></p>
...
И соответственно переменные $_POST, которые приходят из формы.
В скрипте нужно получить строку с введенными значениями.
Если делать через file_get_contents(), то значения в строке не подставляются.

Пока решаю через require шаблона и получение строки в буфер вывода. Но плохо, что при этом шаблон (строка) выводится в браузер. Приходится делать принудительный возврат браузера. А мне нужно эту строку только заполнить и перезаписать в новый файл. Без вывода в поток! Есть ли более оптимальное решение?
2. JustUserR - 25 Июня, 2009 - 11:48:41 - перейти к сообщению
Ммм то есть у вас есть файл-шаблон в котором заместо $_POST[чтототут] надо подставить аналогичную переменную и все это не выводить на экран а сохранить в другую переменную?
Тогда пользуйтесь к примеру регулярными выражениями типа такого (Я как обычно привожу на Perlе) - s/\$_POST\[(.*?)\]/$_POST["$1"]/gs
3. cat - 25 Июня, 2009 - 12:25:03 - перейти к сообщению
JustUserR пишет:
Ммм то есть у вас есть файл-шаблон в котором заместо $_POST[чтототут] надо подставить аналогичную переменную и все это не выводить на экран а сохранить в другую переменную?
Тогда пользуйтесь к примеру регулярными выражениями типа такого (Я как обычно привожу на Perlе) - s/\$_POST\[(.*?)\]/$_POST["$1"]/gs


К сожалению не понял.
Куда вставить ваше выражение? В шаблон или как-то в строку в PHP скрипте?
Т.е. при выполнении скрипта, встретив регулярное выражение, сервер сделает в строке замену переменной на ее значение? Без вывода в поток?
Извините, может я непонятно сформулировал?
Мне нужно, чтобы в скрипте сервер без вывода на экран прочитал строку с переменными и сохранил эту строку в другую переменную. Уже со значениями.
4. JustUserR - 25 Июня, 2009 - 13:01:24 - перейти к сообщению
cat Дадада это часть кода Регулярное выражение как раз делает различные замены внутри переменной-строки не выводя ничего на экран
Вообще чс помощью них можно заменить все что угодно Вообще советую вам немного про них почитать http://php.su/functions/?cat=pcre
5. valenok - 25 Июня, 2009 - 13:06:26 - перейти к сообщению
$template = include 'tpl.php';
--
tpl.php

return "Привет $_POST['name']";
6. cat - 25 Июня, 2009 - 13:31:34 - перейти к сообщению
JustUserR пишет:
cat Дадада это часть кода Регулярное выражение как раз делает различные замены внутри переменной-строки не выводя ничего на экран
Вообще чс помощью них можно заменить все что угодно Вообще советую вам немного про них почитать http://php.su/functions/?cat=pcre


Спасибо.
Но прошу прощения еще раз. Если у меня 5-6 переменных POST. Я должен написать столько же регулярных выражений для замены? Или же может быть одно универсальное, которое меняет ключ на значение? А нет ли для этого встроенной функции?
Нельзя ли показать на конкретном примере кусочек кода для двух пар переменных/значение:
$_POST[tema]=обзор и $_POST[data]=24.06.2009
Заранее еще раз спасибо.
(Добавление)
valenok пишет:
$template = include 'tpl.php';
--
tpl.php

return "Привет $_POST['name']";



В том-то и вся суть. Когда применяю incluide замена в строке происходит, но при этом содержание выводится на экран. Хотя вроде функция должна передавать строку ТОЛЬКО в переменную.
7. JustUserR - 25 Июня, 2009 - 14:38:26 - перейти к сообщению
cat Нет регулярка она универсальная и может вырезать люббые замены ПО ШАБЛОНУ
8. Ch_chov - 25 Июня, 2009 - 15:29:38 - перейти к сообщению
Цитата:
Когда применяю incluide замена в строке происходит, но при этом содержание выводится на экран. Хотя вроде функция должна передавать строку ТОЛЬКО в переменную.

Можно использовать буферизацию вывода: http://www.php.su/functions/?cat=outcontrol
CODE (text):
скопировать код в буфер обмена
  1.   ob_start();
  2.     include $tpl;
  3.     $tplContent =  ob_get_clean();

Или специальный php шаблонизатор,
например такой http://forum[dot]dklab[dot]ru/viewtopic.php?t=16364
9. valenok - 25 Июня, 2009 - 15:40:18 - перейти к сообщению
расширение файла поменяй на .php
и echo в файле убери если есть.
Открыавающий тег <?php не забудь.

tpl.php
PHP:
скопировать код в буфер обмена
  1. <?PHP return "Привет $_POST['name']";
10. cat - 25 Июня, 2009 - 15:52:29 - перейти к сообщению
Ch_chov пишет:
Цитата:
Когда применяю incluide замена в строке происходит, но при этом содержание выводится на экран. Хотя вроде функция должна передавать строку ТОЛЬКО в переменную.

Можно использовать буферизацию вывода: http://www.php.su/functions/?cat=outcontrol
CODE (text):
скопировать код в буфер обмена
  1.   ob_start();
  2.     include $tpl;
  3.     $tplContent =  ob_get_clean();

Или специальный php шаблонизатор,
например такой http://forum.dklab.ru/viewtopic.php?t=16364


Я сейчас так и делаю (про буферизацию писал в самом начале). Но вывод в поток (браузер) остается и приходится его подавлять обратной переадресацией через Header('location:') в конце кода. Что не совсем корректно. Хотя зрительно вывод незаметен. Спрашивал, потому что может кто подскажет изящнее решение.
(Добавление)
valenok пишет:
расширение файла поменяй на .php
и echo в файле убери если есть.
Открыавающий тег <?php не забудь.

tpl.php
PHP:
скопировать код в буфер обмена
  1. <?PHP return "Привет $_POST['name']";


Но тогда (если шаблон чистый php) строка его содержания будет вся из кусков:
"какой-то текст html".$_POST[0]."продолжение текста html".$_POST[1]."еще текст" .... и т.д.?

Надо попробовать. Но опять же наверно не лучший вариант. Ведь шаблон все равно надо будет как-то подключать в скрипт. Огорчение А в целом спасибо.
11. valenok - 25 Июня, 2009 - 16:12:51 - перейти к сообщению
Для тебя есть HEREDOC.
Есть двойные кавычки в которых значение переменных обрабатываются.
12. Ch_chov - 25 Июня, 2009 - 16:16:57 - перейти к сообщению
Цитата:
Я сейчас так и делаю (про буферизацию писал в самом начале). Но вывод в поток (браузер) остается

Что это за буферизация такая, которая ничего не буферизирует? Покажи код.

Валенок, а для чего нужно расширение у файла шаблона менять?
13. cat - 25 Июня, 2009 - 16:42:06 - перейти к сообщению
Ch_chov пишет:
Цитата:
Я сейчас так и делаю (про буферизацию писал в самом начале). Но вывод в поток (браузер) остается

Что это за буферизация такая, которая ничего не буферизирует? Покажи код.

Валенок, а для чего нужно расширение у файла шаблона менять?


Привожу скрипт полностью:
CODE (text):
скопировать код в буфер обмена
  1. <?php
  2.   require("config.php");
  3.  
  4.   // Запись на сервер новой статьи
  5.   ob_start(); //открываем буфер вывода
  6.   require("template.html"); //выводим шаблон с данными из формы
  7.   $stroka=ob_get_contents(); //отправляем новое содержание в буфер
  8.   $nom=nfiles("../articls/"); //номер последней статьи (кол-во файлов)
  9.   $name_fl="../articls/".++$nom.".html"; //имя записываемого файла
  10.   $fid=fopen($name_fl,'w+');
  11.   $new_fl=fwrite($fid,$stroka); //записываем новую статью в файл
  12.   chmod($name_fl,0666);
  13.   flush();
  14.   Header("location:index.html");
  15. ?>
  16.  

Здесь функция nfiles() самопальная подгружается из config.php.
14. Ch_chov - 25 Июня, 2009 - 16:55:47 - перейти к сообщению
Замени flush() на ob_end_clean()
(Добавление)
CODE (text):
скопировать код в буфер обмена
  1. $stroka=ob_get_contents(); //отправляем новое содержание в буфер

Наверно правильней писать: // получаем новое содержание из буфера.
15. cat - 25 Июня, 2009 - 17:04:15 - перейти к сообщению
Ch_chov пишет:
Замени flush() на $tplContent = ob_get_clean()


Прошу прощения не так быстро (уловить не хватает опыта).
Для чего новая переменная $tplContent = ob_get_clean(). Что с ней дальше делать?
И почему очистку буфера надо заменять на ob_get_clean()?
(Добавление)
Ch_chov пишет:
Замени flush() на ob_end_clean()
(Добавление)
CODE (text):
скопировать код в буфер обмена
  1. $stroka=ob_get_contents(); //отправляем новое содержание в буфер

Наверно правильней писать: // получаем новое содержание из буфера.


Да конечно. Скрипт полуфабрикат и коменты от ранее записанных строк.

 

Powered by ExBB FM 1.0 RC1