Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.7570
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 06.08.2013, 15:43   #1
lohankin
Member
 
Регистрация: 03.08.2012
Сообщений: 46
Бабло: $15405
По умолчанию [PHP] нужна помощь

Всем доборое время суток!
Вопрос вроде бы простой но не могу решить уже сутки.
Вывод обрабатывается колбэк функцией примерно так:

PHP код:
<?php

function callback($buffer)
{
  
// replace all the apples with oranges
  
return (str_replace("apples""oranges"$buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush
();

?>
функция намного сложнее но все работает отлично

теперь представим что нам надо внутри callback() сделать inсlude другого файла.

если просто пишем inсlude('myfile.php'); то ясный пень ничего не выводится потому что выводится return от функции callback.

пробуем перехватить вывод еще одним ob_start()

PHP код:
function callback($buffer)
{
ob_start();

include(
'myfile.php');

$file_content ob_get_contents();

ob_end_clean ();
return 
$file_content  str_replace("apples""oranges"$buffer);

пхп ругается что ob_start внутри калбэка нельзя.
и правда нельзя цитата http://www.php.net/manual/ru/function.ob-start.php
Цитата:
===
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() и ob_start() не могут вызываться из callback-функций, так как их поведение непредсказуемо. Если вы хотите удалить содержимое буфера, то верните "" (пустую строку) из callback-функции. Вы так же не можете вызывать функции print_r($expression, true) или highlight_file($filename, true) из callback-функций буферизации вывода.
===
myfile.php надо именно инклайдить причем он сам потом дергает кучу всего и инклайдит другие файлы в том числе (

любые идеи будут очень и очень кстати )
lohankin вне форума  
Старый 06.08.2013, 16:02   #2
oledj
Senior Member
 
Аватар для oledj
 
Регистрация: 23.07.2008
Адрес: Kiev
Сообщений: 395
Бабло: $76145
Отправить сообщение для oledj с помощью ICQ
По умолчанию

а что если заинклудить твой файл в буфер, раньше, до вызова функции. в самой функции переменную определить как глобал и отдавать её совместив со вторым буфером.

такой костыль

-------------

хотя стоп, смысла в сием дейтсвии нет. тебе ведь нужны переменные с файла который инклудишь? если да, то просто определи эти переменные как глобал
oledj вне форума  
Старый 06.08.2013, 16:21   #3
lohankin
Member
 
Регистрация: 03.08.2012
Сообщений: 46
Бабло: $15405
ТС -->
автор темы ТС По умолчанию

смысла нет потому что как раз глобальные переменные для инклайда готовит калбэк.
то есть получается примерно так:

раз - генерится страница.
два - калбэк контролирует что сгенерилось
три - если сгенерилось неверно то калбэк меняет некоторые глобальные переменные и инклайдит генератор еще раз.

генератор не мой, самописный, разобраться в нем вариант 1500 говнофайлов....

файл который инклудится не чистое PHP а с включениями HTML, так что прочитать и сделать eval тоже не вариант
lohankin вне форума  
Старый 06.08.2013, 16:33   #4
Strikelol
Senior Member
 
Регистрация: 31.03.2011
Сообщений: 3,056
Бабло: $632595
По умолчанию

это наверняка в большой функции ошибка, показывай ее
Strikelol вне форума  
Старый 06.08.2013, 16:47   #5
lohankin
Member
 
Регистрация: 03.08.2012
Сообщений: 46
Бабло: $15405
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от Strikelol Посмотреть сообщение
это наверняка в большой функции ошибка, показывай ее
не, большая функция не при чем
это то же не работает:

PHP код:
<?php

function callback($buffer)
{

ob_start();

include(
'myfile.php');

$file_content ob_get_contents();

ob_end_clean (); 


  
// replace all the apples with oranges
  
return (str_replace("apples""oranges"$buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush
();

?>
PHP Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in /var/www/inn.php on line 6
lohankin вне форума  
Старый 06.08.2013, 16:49   #6
oledj
Senior Member
 
Аватар для oledj
 
Регистрация: 23.07.2008
Адрес: Kiev
Сообщений: 395
Бабло: $76145
Отправить сообщение для oledj с помощью ICQ
По умолчанию

а есть возможность сделать так чтоб myfile.php отдавал все через return?

тогда можно получить данные $file_content = include('myfile.php');

чтоб было понятней

PHP код:
<?php

ini_set
('display_errors'1);

function 
callback($buffer)
{
    
    
$var '123456';
  
    
$file_content = include('test.php');
    
    return 
$file_content.(str_replace("apples"$var2$buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush
();

?>
test.php

PHP код:
<?php

$var2 
'666';

return 
$var;
 
?>
получается что переменные доступны и там и там, то что тебе надо

Последний раз редактировалось oledj; 06.08.2013 в 16:56.
oledj вне форума  
Старый 06.08.2013, 17:02   #7
lohankin
Member
 
Регистрация: 03.08.2012
Сообщений: 46
Бабло: $15405
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от oledj Посмотреть сообщение
а есть возможность сделать так чтоб myfile.php отдавал все через return?
не, во первых там ОЧЕНЬ много чего намешано а главное там смесь HTML и PHP так что ретурн не прокатит.

пока идея только создать еще один файл, которому как то пердавать нужные переменные. он делает инклайд, а мы забираем результат через http://
lohankin вне форума  
Старый 06.08.2013, 17:20   #8
oledj
Senior Member
 
Аватар для oledj
 
Регистрация: 23.07.2008
Адрес: Kiev
Сообщений: 395
Бабло: $76145
Отправить сообщение для oledj с помощью ICQ
По умолчанию

давай просто не использовать коллбек

PHP код:
<?php

ini_set
('display_errors'1);

ob_start();

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

$contents 
ob_get_contents();

ob_end_clean();

$var '123456';



/* include */

ob_start();

include(
'test.php');

$contents2 ob_get_contents();

ob_end_clean();

/* end.include */



$contents str_replace("apples"$var2$contents);
    

echo 
$contents2.$contents;

?>

test.php

PHP код:
<?php

$var2 
'666';

?>
<b><?php echo $var;?></b>
oledj вне форума  
Старый 06.08.2013, 20:05   #9
lohankin
Member
 
Регистрация: 03.08.2012
Сообщений: 46
Бабло: $15405
ТС -->
автор темы ТС По умолчанию

в том то и штука что от калбэка не отказаться уже никак (
lohankin вне форума