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 :: Версия для печати :: ob_start и global
Форумы портала PHP.SU » » Вопросы новичков » ob_start и global

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

1. glutaminefree - 18 Ноября, 2013 - 13:23:09 - перейти к сообщению
Приветствую!

В гугле ничего найти не смог по этой теме. Вобщем внутри конструкции ob_start/ob_end_clean есть подключаемый файл, и в нём не работает конструкция global.

Вот примерно так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $data = 'some data';
  3.  
  4. require('some_file.php');
  5. $html = ob_get_contents();
  6.  


Внутри подключаемого файла примерно такое:



Соответственно в $html ничего нет. $data внутри конструкции ob_start/ob_end_clean нормально дебажится, но вот в подключаемом файле почему-то даже после global не хочет отдавать данные.

Версия php - 5.4.17
ОС - Fedora 17 x86_64
2. Deonis - 18 Ноября, 2013 - 13:39:55 - перейти к сообщению
Работать обязанно. Ошибок нет, global не нужен. Проверьте - правильный ли путь до файла.
P.S. Надеюсь, что переменную вы прверяете после отключения буферизации?
3. IllusionMH - 18 Ноября, 2013 - 14:18:43 - перейти к сообщению
glutaminefree, для данной переменной уберите global. Пространство переменных для include и requrie наследуется от места подключения. Так что global не нужна и, наоборот, мешает.
Для данной строки кода это локальная переменная.
4. glutaminefree - 18 Ноября, 2013 - 14:19:10 - перейти к сообщению
Да, я уже проверил именно такой код. Работает как надо. У меня несколько иная ситуация. Там AJAX запрос и функция подлюкчения файла Wordpress'овская.

Пробовал не через AJAX тот же самый кусок кода использовать - работает отлично. Именно в AJAX обработчике почему-то переменная теряется.

get_defined_vars говорит, что переменная появляется, но пустая.

А global всё же нужен, ибо подключается файл на самом деле через функцию. Я просто подумал, что не в Wordpress дело, и накатал упрощенную версию кода.
5. IllusionMH - 18 Ноября, 2013 - 14:20:23 - перейти к сообщению
glutaminefree, подключение через get_template_part?
6. glutaminefree - 18 Ноября, 2013 - 14:22:49 - перейти к сообщению
IllusionMH пишет:
glutaminefree, подключение через get_template_part?


Через неё самую. Причём в файлах шаблонов используется абсолютно точно такой же код, и там переменная внутри подключаемого файла нормально видится.

А внутри AJAX срипта почему-то беда такая. AJAX работает у меня через хук WP

PHP:
скопировать код в буфер обмена
  1. add_action('wp_ajax_my_func', 'my_func');
7. IllusionMH - 18 Ноября, 2013 - 14:28:13 - перейти к сообщению
glutaminefree, если есть возможность тогда делайте сразу через require без функции wp.
либо
PHP:
скопировать код в буфер обмена
  1. global $data;
  2. $data = 'data';
  3.  
  4. get_template_part(); //global $data внутри шаблона
8. glutaminefree - 18 Ноября, 2013 - 14:39:21 - перейти к сообщению
Ну у меня так и происходит.

PHP:
скопировать код в буфер обмена
  1.  
  2. $comments_list = /*запрос с WP_Comment_Query*/
  3.  
  4.  
  5. /*
  6. из этого места переменная дебажится нормально,
  7. в ней то, что и должно быть
  8. */
  9.  
  10. get_template_part('parts/comments', 'loop');
  11. $html = ob_get_contents();
  12.  


Внутри comments-loop.php:

PHP:
скопировать код в буфер обмена
  1.  
  2. global $comments_list;
  3.  
  4. /*далее цикл с выводом данных*/
  5.  


Всё это прекрасно работает, если использовать из шаблонов (например search.php, или на любой странице). И даже если обвернуть в ob_start/ob_end_clean, а потом вывести буфер.

Но если я использую этот код внтури функции:

PHP:
скопировать код в буфер обмена
  1.  
  2. function more_search() {
  3.         /*Тут тот самый код*/
  4. }
  5. add_action('wp_ajax_more_search', 'more_search');
  6. add_action('wp_ajax_nopriv_more_search', 'more_search');
  7.  


То внутри подключаемого шаблона переменная оказывается пустой. Что очень очень странно. Посмотрел исходники всех функций, которые учавствуют в get_template_part и не нашёл ничего, из-за чего такое бы могло происходить. Может искал плохо.
9. IllusionMH - 18 Ноября, 2013 - 14:43:15 - перейти к сообщению
glutaminefree, пробуйте
PHP:
скопировать код в буфер обмена
  1. global $comments_list;
  2. $comments_list = /*запрос с WP_Comment_Query*/


а при AJAX запросе вы точно проходите шаги присвоения переменной?
10. glutaminefree - 18 Ноября, 2013 - 14:48:27 - перейти к сообщению
IllusionMH пишет:
а при AJAX запросе вы точно проходите шаги присвоения переменной


Да. Прокомментировал выше, что она дебажится нормально даже внутри блока ob_start/ob_end_clean в месте прямо перед подключением шаблона.
11. IllusionMH - 18 Ноября, 2013 - 14:57:10 - перейти к сообщению
glutaminefree, global $comments_list; пробовали добавить перед присвоением (внутри вашей функции)?
12. glutaminefree - 18 Ноября, 2013 - 14:58:46 - перейти к сообщению
Нет. Не думаю, что это поможет. Но всё таки проверю, но уже завтра. Сейчас работать закончил. Спасибо за советы!
13. IllusionMH - 18 Ноября, 2013 - 15:11:14 - перейти к сообщению
glutaminefree, поможет - факт.
пробелма с get_template_part в том, что до require('нужный файл') пройдет еще несколько вызовов других функций и локальные переменные для функции more_search перестанут быть таковыми в точке вызова require.
Если она будет глобальной - тогда она будет видима, но может появиться проблема с коллизией имен
14. glutaminefree - 19 Ноября, 2013 - 08:39:52 - перейти к сообщению
Действительно помогло. Спасибо за помощь.

 

Powered by ExBB FM 1.0 RC1