【问题标题】:Joomla logout with message带有消息的Joomla注销
【发布时间】:2014-03-25 15:58:52
【问题描述】:

我正在尝试修改

'Token Interceptor'系统插件

joomunited.com

原始插件在遇到无效令牌错误时重定向使用register_shutdown_function

我正在努力解决:

  1. 如果用户已登录,则将其注销
  2. 使用无效令牌消息重定向到登录页面

代码:

$app = JFactory::getApplication();
if (!JFactory::getUser()->guest)
{
    $app->logout();
}
$app->redirect('/index.php', JText::_('JINVALID_TOKEN'), 'warning');

我可以成功注销用户并重定向到登录页面,但没有显示错误消息。

如何在用户注销后保留消息?

我也试过了:

$app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'warning');

但这也没用……

【问题讨论】:

  • 尝试在 $app->logout() 上方加入 enque message 选项;功能。
  • @JobinJose 实际上,即使我不注销用户,该消息也不会显示...
  • 这里只是猜测。您启用了系统缓存插件吗?您可能正在从缓存中提取响应页面(因此没有消息)。是这样吗?
  • @RiccardoZorn 否,插件未启用...

标签: joomla message-queue logout


【解决方案1】:

我想出的解决方案是 Alonzo Turner 的第二个帖子 here 的变体。

插件使用url中传递的参数重定向到登录页面。然后onAfterInitialise 事件会查找此参数并在找到时显示一条消息。

class PlgSystemTokeninterceptor extends JPlugin
{

    public function __construct(&$subject, $config = array())
    {
        parent::__construct($subject, $config);
        $app = JFactory::getApplication();

        if (($app->isSite() && $this->params->get('use_frontend')) || ($app->isAdmin() && $this->params->get('use_backend'))) 
        {
            register_shutdown_function(array($this,'redirectToLogin'));
        }

    }

    public function redirectToLogin()
    {
        $content = ob_get_contents();

        if($content == JText::_('JINVALID_TOKEN') || $content == 'Invalid Token')
        {
            $app = JFactory::getApplication();

            if (!JFactory::getUser()->guest)
            {
                $app->logout();
            }

            $app->redirect(JURI::base().'index.php?invalid_token=true');

            return false;   
        }
    }

    function onAfterInitialise()
    {
        $app = JFactory::getApplication();
        $invalid_token = $app->input->get('invalid_token', 'false');

        if ($invalid_token == 'true')
        {
            $app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'warning');
        }

        return true;
    }

}

【讨论】:

    【解决方案2】:

    当您注销时,您会破坏会话,这样您就不会再收到消息了。

    这将为您提供重定向消息。

    $this->redirect = JUri::base() . 'index.php?option=com_users&view=login';    
    if (!JFactory::getUser()->guest && $app->input->getCmd('option') != 'com_users')
    
    {
        $app->enqueueMessage('message', 'warning');
        //$app->logout();
        $app->redirect($this->redirect);
    
    }
    

    这不会因为会话被破坏

    $this->redirect = JUri::base() . 'index.php?option=com_users&view=login';    
    if (!JFactory::getUser()->guest && $app->input->getCmd('option') != 'com_users')
    
    {
        $app->enqueueMessage('message', 'warning');
        $app->logout();
        $app->redirect($this->redirect);
    
    }
    

    未测试但

    $app->logout()
    echo '<div class="">'. JText::_('whatever you want') . '</div>'; 
    $module = JModuleHelper::getModule('login');
    $output = JModuleHelper::renderModule($module);
    

    类似的东西

    【讨论】:

    • 有什么方法可以传递消息吗? Alonzo Turner 在他的第二篇文章中描述了一种方法:groups.google.com/forum/#!topic/joomla-dev-general/WISy8JIvB8k 但我无法使用JInput
    • 嗯,这是使用系统插件......而不是做所有这些,如果令牌坏了,为什么不直接呈现消息和登录模块?这对我来说似乎要简单得多。
    • 抱歉,Elin 我不确定我是否关注,您介意详细说明一下吗?我必须说,我很惊讶插件解决方案竟然会获得一个无效的令牌异常以重定向到登录页面,所以如果你的建议更简单,我会非常感兴趣?
    • 如果您想注销他们并让他们重新登录,请使用 Module api 并在页面中而不是在内容中呈现登录模块。如果需要,您可以在此处呈现一条消息,使其看起来像一条常规系统消息。
    • 感谢您的澄清。唯一的问题是我需要从无效令牌异常重定向,而我能看到如何做到这一点的唯一方法是在插件中使用 register_shutdown_function...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2016-03-10
    • 2011-03-09
    相关资源
    最近更新 更多