Работа с глобальными переменными в нодах

Аватар пользователя godson godson 8 января 2016 в 13:20

Есть пару php-шных страниц, которые хотелось бы одеть в оболочку сайта. Создаю ноду с php-фильтром. Все работает, кроме функций, в которых прописаны переменные global $peremennn;
Как решить проблему?

Комментарии

Аватар пользователя sg85 sg85 8 января 2016 в 14:49

Если страницы действительно обычные PHP скрипты, то никаких проблем быть не должно, как и не должно быть никаких глобальных переменных(очень мало ситуаций, где они там могут понадобиться, честно говоря, не вижу ни одной, кроме пары-тройки злых костылей), если у Вас есть глобальные переменные, значит Вы пытаетесь приспособить кусок какого-то сайта в тело ноды, только здесь нельзя забывать, что у любого сайта(который является веб приложением) есть ядро(даже если его разработчик был пьян или накурен), в котором инициируются глобальные переменные(реестры, синглтоны и другие способы хранение состояния/конфигов приложения опустим, ибо суть дела не меняет, да и тут их, скорее всего попросту нет), соответственно, просто взять и перетащить, например, кусок кода из битрикса, в друпал(да и не только), попросту не выйдет(хотя, конечно, смотря что это за кусок)

Глобальной переменной $peremennn в друпале нет, так что, как разберетесь, что это и для чего, думаю вопрос решится сам собой.

Аватар пользователя godson godson 8 января 2016 в 16:22

Такой переменной конечно нет в друпале, это просто пример той переменной, которая есть в добавляемом скрипте.
Код мой от начала до конца, хотя, соглашусь, что, наверняка, написан не совсем правильно... я нигде никогда не изучал пхп, просто смотрел примеры скриптов, и делал по образу и подобию... Таким образом, более-менее "изучил" язык... Функция необходима, поскольку клонировать один и тот же код по всему скрипту считаю неразумным... может есть другой вариант?...

Аватар пользователя Orion76 Orion76 11 января 2016 в 13:48

Если Вам необходимо просто написать функцию, для использования ее в других "частях" сайта, создайте простейший модуль(это звучит страшно, на самом деле ничего сложного), и напишите ее там.. (спросите у гугла "drupal свой модуль")
Если эта функция используется только при темизации, тогда еще проще - вставте ее в файл template.php в папке текущей темы оформления сайта.

Аватар пользователя godson godson 11 января 2016 в 19:23

У меня довольно специфичная задача, и мой код вам навряд ли чем-то поможет. Могу сказать, что скрипт немного напоминает бота, который разную входящую информацию (в том числе из форм) по разному обрабатывает, и отправляет результат. Проблема в том, что там не одна функция, и почти всем им должны передаваться переменные... а весь код весит почти 100кб. Представьте, если я его весь засуну в template.php... Чтобы модуль свой написать, надо немало инфы перелопатить... видно придется все-таки по этому пути идти...

Аватар пользователя Formatix Formatix 11 января 2016 в 20:26

100 кб кода в ноде/шаблоне - это АД.
думается, если друпал - то только модуль ..

Аватар пользователя godson godson 30 января 2016 в 19:01

Попробовал создать модуль. Там, оказалось, чтобы выводить страницу, нужно ее всю в переменную вгонять, потом передавать ядру друпала, чтобы тот ее вывел у себя. Но у меня скрипт выводит данные после каждой операции через print. Получается, что теперь мне надо полностью переписывать код... Неужели других вариантов нету?

Аватар пользователя noobishe noobishe 31 января 2016 в 13:04

что там переписывать? вначале добавить что то типа $output = ''; print'ы поменять на $output .= и вконце return(или print) $output;

Аватар пользователя sg85 sg85 4 февраля 2016 в 19:30

в начале скрипта - ob_start(); в конце скрипта - $output = ob_get_clean(); таким образом, весь Ваш вывод окажется внутри переменной, хотя такой способ будет некошерен ибо в подобном коде без 200 грамм потом будет не разобраться.

Аватар пользователя godson godson 4 февраля 2016 в 20:08

Не получилось у меня... Вывод в переменную вогнал по совету noobishe, но вывести в друпал не получилось. Модуль видать не так-то просто написать...
Вот что я написал:
function ras_menu() {
$items = array();
$items['gr2'] = array(
'title' => 'Страница',
'page callback' => 'drupal_get_form',
'page arguments' => array('ras_page_form'),
'access callback' => TRUE
);
return $items;
}

Тут код, который собирает $outputt

function drupal_get_form() {
global $outputt;
$ras_page_form=$outputt;
return $ras_page_form;
}

Он при установке говорит, что не могу переопределить drupal_get_form.... Что не так сделал?

Аватар пользователя chilic chilic 4 февраля 2016 в 20:44

Нельзя свою функцию называть drupal_get_form

Если уж так сильно хочется использовать эти скрипты то лучше сделать так:

function mymodule_page_callback() {
  ob_start();
  module_load_include('тут путь к файлу');
  $page = ob_get_contents();
  ob_end_clean();
  return $page;
}