Joomla 2.5 从外部脚本获取用户数据

Posted

技术标签:

【中文标题】Joomla 2.5 从外部脚本获取用户数据【英文标题】:Joomla 2.5 Get User Data from External Script 【发布时间】:2012-06-20 01:07:01 【问题描述】:

我需要从 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/

【问题讨论】:

【参考方案1】:

取自 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');

【讨论】:

【参考方案2】:

原来,我有两个问题:

    我的脚本在 www.example.com 上,而我在 example.com 下登录,因此不同的域正在丢弃会话数据。 我也没有初​​始化应用程序,这显然是必要的。

结果如下:

<?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;

【讨论】:

【参考方案3】:

我认为随着事情的变化,人们在 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());
?>

Echo 创建一个查询并将结果回显到一个表中:

<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 更改为数据库表的正确前缀。

更新:更好地导入框架来获取用户对象。

希望这对您有用。问候。

【讨论】:

好的,我们越来越近了。然而,我之前的代码得到了关于当前登录用户的信息。我怎样才能在这里获得这些信息?我相信 Joomla 有一个自定义会话实现,因为数据不在 $_SESSION 中。 不太确定。我尝试使用脚本并实现库,但它一直说“找不到 JFactory 类”。如果你确实让它工作,那么请分享,因为我也很想知道如何做到这一点。问候【参考方案4】:

如果您想跳过使用 Joomla!功能,可以查询Joomla!数据库。使用用户 ID 连接表 js25_sessionjs25_users。这样,您可以获取网站上每个当前登录的用户和所有访客(可能还有在线用户的数量)。

【讨论】:

以上是关于Joomla 2.5 从外部脚本获取用户数据的主要内容,如果未能解决你的问题,请参考以下文章

上下文模块 - Joomla 2.5

PHP 中的 Joomla 独立脚本 - 握手

Joomla 2.5:将参数传递给联系表格

Joomla 2.5 组件实现

试图找到在 Joomla 2.5 组件中提取数据库项目的最佳方法

joomla 2.5 模块从数据库中检索数据