Joomla 2.5 Получить пользовательские данные из внешнего скрипта

Мне нужно получить информацию о пользователе, который в данный момент вошел в систему Joomla, из программы вне самой Joomla. Я обновился с 1.5 до 2.5, и то, что у меня было раньше, больше не работает.

<?php

define( '_VALID_MOS', 1 );

include_once( 'globals.php' );
require_once( 'configuration.php' );
require_once( 'includes/joomla.php' );
$option="test";
$mainframe = new mosMainFrame( $database, $option, '.' );
$mainframe->initSession();

$my = $mainframe->getUser();
$joomla_name = $my->name;
$joomla_email = $my->email;
$joomla_password = $my->password;

После некоторых исследований я пришел к следующему:

<?php
define( '_JEXEC', 1 );
define( 'JPATH_BASE', dirname(__FILE__) );
define( 'DS', '/' );

require_once ( JPATH_BASE .DS.'configuration.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );

$my =& JFactory::getUser();
$joomla_name = $my->name;
$joomla_email = $my->email;
$joomla_password = $my->password;
$joomla_username = $my->username;

Ошибок не выдает, но вроде работает. Однако пользовательский объект пуст. Этот скрипт находится в том же каталоге, что и установка Joomla. В чем может быть проблема? Спасибо!

Источники:

http://www.cmsbloke.com/accessing-joomla-objects-from-an-external-script/


person Jonah    schedule 20.06.2012    source источник


Ответы (4)


Взято из http://docs.joomla.org/How_to_access_session_variables_set_by_an_external_script.

Решение. Замените session_start(); во внешнем скрипте на

define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../..' ));
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();

Обязательно измените JPATH_BASE в соответствии с вашей структурой каталогов.

Замените $_SESSION[ 'name' ] = "value"; во внешнем скрипте на

$session =& JFactory::getSession();
$session->set('name', "value");
Now you can retrieve this session variable using:

$session =& JFactory::getSession();
echo $session->get('name');
person Dave Allen    schedule 30.09.2012

Оказывается, у меня было две проблемы:

  1. Мой скрипт был на www.example.com, в то время как я вошел в систему под example.com, поэтому другой домен сбрасывал данные сеанса.
  2. Я также не инициализировал приложение, что, по-видимому, необходимо.

Вот результаты:

<?php
define( '_JEXEC', 1 );
define( 'JPATH_BASE', dirname(__FILE__) );
define( 'DS', '/' );

require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

JFactory::getApplication('site')->initialise();

$user = JFactory::getUser();
$joomla_name = $user->name;
$joomla_email = $user->email;
$joomla_password = $user->password;
$joomla_username = $user->username;
person Jonah    schedule 20.06.2012

Я думаю, что у людей были проблемы с этим в Joomla 2.5, так как все изменилось. Я не нашел решения для того, как вы просили, но написал этот обходной путь (за исключением поля пароля), который вы можете использовать.

определить подключение к базе данных:

<?php
   $host="localhost";
   $username="DB_USERNAME";
   $password="DB_PASSWORD";
   $db_name="DB_NAME";
   mysql_connect($host,$username,$password)or die(mysql_error());
   mysql_select_db($db_name)or die(mysql_error());
?>

Эхо создать запрос и вывести результаты в таблицу:

<table style="background:#FFF; color:#000;">
<?php
$query = "SELECT username,name,email FROM j25_users "; 
$result = mysql_query($query) or die(mysql_error());
    while ($row = mysql_fetch_array($result)) { 
        echo '<tr><td>',$row["username"],'</td><td>',$row["name"],'</td><td>',$row["email"],'</td></tr>' ;
    }
?>
</table>

Вам нужно будет изменить j25_users на правильный префикс таблиц вашей базы данных.

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

Надеюсь, это пригодится вам. С Уважением.

person Lodder    schedule 20.06.2012
comment
Хорошо, мы приближаемся. Однако код, который у меня был до этого, получал информацию о текущем вошедшем в систему пользователе. Как я могу получить эту информацию здесь? Я полагаю, что Joomla имеет собственную реализацию сеанса, потому что данные не находятся в $_SESSION. - person Jonah; 20.06.2012
comment
Не слишком уверен. Я попытался использовать скрипт и реализовать библиотеки, но он продолжал говорить, что класс JFactory не найден. Если у вас все-таки получится, поделитесь, пожалуйста, потому что мне тоже очень хотелось бы знать, как это сделать. С Уважением - person Lodder; 20.06.2012

Если вы хотите пропустить использование Joomla! функции, вы можете запросить Joomla! база данных. Соедините таблицы js25_session и js25_users с идентификатором пользователя. Таким образом, вы можете получить каждого вошедшего в систему пользователя и всех гостей на веб-сайте (и, возможно, количество онлайн-пользователей).

person PetarT    schedule 26.09.2012