Есть простой(основной) скрипт 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',,
);
После проведенного расследования выяснилось, что вредит строка
include $CFG['auth'];
А конкретно вызов JRequest::clean();, в которой происходит, дословно, следующее:
foreach ($GLOBALS as $key => $value){
if ( $key != 'GLOBALS' ) {
unset ( $GLOBALS [ $key ] );
}
}
Методов борьбы несколько:
include $CFG['auth']; на самый верх.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;
Продвижение своими сайтами как стратегия роста и независимости