PHP “теряется” массив, после include файлов из Joomla

366
21 декабря 2016, 04:50

Есть простой(основной) скрипт index.php:

<?php
require 'cfg.php'; //файл с настройками
require 'langs/' . $CFG['lang'] . '.php'; // языковой файл, прописаный в файле с настройками. Языковой файл содержит фразы в виде массива
//echo 'P1>>>>>';
//var_dump($FO_LANG);
//echo '<br>';
if(file_exists($CFG['auth'])) { //если есть файл с настройками авторизации
    //echo 'P2>>>>>';
    //var_dump($FO_LANG);
    //echo '<br>';
    include $CFG['auth']; //добавить его в скрипт
    //echo 'P3>>>>>';
    //var_dump($FO_LANG);
    if ($fo_userid > 0) { //если юзерID > ноля
        echo $fo_userid; //вывести его ID
    }
    else { //если юзерID НЕ больше ноля
        var_dump ($FO_LANG['0002_fo_not_authorized']); // вывести второй элемент массива из языкового файла
    }
}
else { //если нет файла с настройками авторизации
    var_dump ($FO_LANG['0001_fo_cfg_file_not_exist']); //вывести первый элемент массива из языкового файла
}
?>

В дополнительном файле langs/ru.php как понятно, сохранены фразы, в виде массива:

<?php
$FO_LANG = array (
  '0001_fo_cfg_file_not_exist' => 'Не верная конфигурация.',
  '0002_fo_not_authorized' => 'Вы не авторизованы!',
);
?>

Файл авторизации joomla_cfg.php, стандартный скрипт для получения данных текущего пользователя Joomla.

define( '_JEXEC', 1 );
define('JPATH_BASE', dirname('../.') );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
$mainframe->route();
$user =& JFactory::getUser();
$fo_userid = $user->get('id');

Проблема в том, что если условие file_exists($CFG['auth']), оказывается ложью, то фраза корректно считывается из массива в языковом файле. А если она оказывается истинной, и происходит "подключение" данных пользователя Joomla, то массива в видимости не оказывается и var_dump выдаёт NULL.

Понятное дело, что можно ещё раз сделать include нужных файлов, но как этого избежать и правильно добавить массив, что-бы он был виден во всех случаях в пределах основного скрипта?

Файл конфигураций cfg.php:

<?php
$FO_CFG = array (
  'auth' => 'joomla_cfg.php',
  'lang' => 'ru',,
);
Answer 1

После проведенного расследования выяснилось, что вредит строка

include $CFG['auth'];

А конкретно вызов JRequest::clean();, в которой происходит, дословно, следующее:

foreach ($GLOBALS as $key => $value){
    if ( $key != 'GLOBALS' ) {
        unset ( $GLOBALS [ $key ] );
    }
}

Методов борьбы несколько:

  1. Инклудить, инклудить и еще раз инклудить, как завещали bad practics.
  2. Разобраться, как правильно работать с Джумлой. Что-то мне подсказывает, что там есть штатные средства обеспечения многоязычности, заточенные под нее
  3. Немного поменять логику приложения и вынести include $CFG['auth']; на самый верх.
  4. Использовать для локализации не массив в глобальном неймспейсе, а класс. Как-то так:

langs/ru.php:

namespace langs;
class ru{
    const fo_cfg_file_not_exist = 'Не верная конфигурация.';
    const fo_not_authorized = 'Вы не авторизованы!';
}

index.php

$lang = 'langs\\'.$CFG['lang'];
spl_autoload_register(function ($class) {
    include_once str_replace('\\', '/', $class).'.php';
});    
echo $lang::fo_not_authorized;
READ ALSO
Подскажите с выбором DB для PHP [требует правки]

Подскажите с выбором DB для PHP [требует правки]

Нужна база данных, для PHP, максимально простая, желательно на файлах, есть DB которые базируются на JSON или XMLИспользовать PDO нет желания, драйверы...

295
Помогите новичку с регуляркой на php

Помогите новичку с регуляркой на php

Есть фраза "высота|толщина кровати(слова "кровати" может и не быть) 21 см (или нет см)"

322
Bitrix vs. OpenServer: ошибка mbstring.func_overload

Bitrix vs. OpenServer: ошибка mbstring.func_overload

Для установки Bitrix в кодировке UTF-8 требуется параметру mbstringfunc_overload присвоить значение 2 (по умолчанию там 0)

1790
getImageList MIGX вывод слайдера

getImageList MIGX вывод слайдера

Не подскажите почему на главной выводит слайдер через migx а на другой страницу не выводит

782