我正在尝试将 Joomla 构建到我现有的网站中,以便将其用于优质内容。
我已经有一个定制的身份验证系统来设置我自己的会话变量。
出于某种原因,Joomla(位于不同的目录中)不想识别这些会话变量,即使添加 session_start(); 行在所有 Joomla 页面的顶部。
知道如何让 Joomla 识别我的自定义会话变量,以便我可以将位于 Joomla 中的内容限制为仅限高级用户吗?
谢谢你。
Joomla 使用自己的会话管理,因此当您使用 php 会话时,它不会保证工作。要解决这个问题,只需尝试使用 joomla 会话管理。
我知道这是一个老问题,但我决定在这里发布一个解决方案,以防有人仍在寻找它。
Joomla 确实使用自己的框架和会话管理。您仍然可以编写自己的 php 文件并访问 Joomla 会话变量。您只需要将 joomla 框架加载到您的 php 脚本中。
对于 J1.6,您需要在 php 脚本的开头包含以下行。注意:这些需要包含在最顶部,因为 joomla 将调用 session_start()。
define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/..' )); //you will need to update this path to represent your installation. This path works if you store all your custom php scripts in a subdirectory off the main joomla install directory.
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();
完成后,您可以使用以下方法存储会话变量:
$session->set('msgjson',$msgjson);
使用以下方法读取会话变量:
$msgjson = $session->get('msgjson')
并使用以下方法取消设置会话变量:
$session->clear('msgjson');
这适用于 J1.6。您可能需要更改为其他版本加载 joomla 框架的行。我将从 Joomla 根目录中的 index.php 开始,因为它必须加载框架。
我希望这有帮助。
Joomla 很可能会初始化它自己的会话(我们将其称为会话“B”),与您正在谈论的其他系统分开,该系统确定用户是否获得“高级”会话(我们将此会话称为“A” )。一旦会话“B”开始,我认为会话“B”不可能访问会话“A”中的信息。
我对解决这个问题的建议是用纯 PHP 编写会话处理代码,并在 Joomla 加载它自己的会话之前运行该代码。这样,当您运行 session_start() 时,它应该会捕获会话“A”。
将其引入 Joomla 的一个好方法是编写一个“系统”插件并调用函数“onAfterInitialise”,该函数在 Joomla 甚至设置它的会话之前被调用(至少,我对此很确定..哈哈) .
<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
class plgSystemPremium extends JPlugin
{
function onAfterInitialise() {
// ... load session
// if premium user, return
// else, redirect user to a registration page or whatever
}
}
?>
我一直看到有人说 phpsessions 在 joomla 中不起作用,而且我还没有准备好学习 joomla 框架来进行会话管理,我没有时间去做,所以我做了一些测试,我发现如果你只是在模板的主页而不是在您的网站索引页面上启动 php 会话,它将正常工作。只需将这行代码放在模板页面的首页即可:
<?php
// Starting the phpsession
session_start();
?>
Joomla 1.5 使用JSession类。
由于 Joomla 中的所有内容都由它自己的内部框架提供支持,因此我不建议为会话之类的东西编写纯 PHP,因为 Joomla 在初始化它自己的内部会话管理代码时很可能会覆盖旧的会话变量。
也许您的身份验证系统使用 cookie 并设置了一个cookie 路径,以防止浏览器将 session-id cookie 发送回 joomla 脚本。
cookie 路径可能通过session_set_cookie_params()或ini_set()设置。
我使用jumi
了一个很棒的免费组件,joomla
它可以链接到任何文件并维护会话数据。
如果您需要一个干净的页面,ob_end_clean();
请在新文件的顶部和die;
末尾使用以清除 joomla 模板。