0

我正在编写一个非常简单的 Joomla 插件,它会删除一个带有电子邮件地址的 cookie,然后另一个应用程序可以使用该插件。这都是内部使用,不会分发。无论如何,插件安装得很好,但它不会创建 cookie。我正在使用 Chrome 浏览器的开发人员视图来查看 cookie 是否出现并且它永远不会出现。

function onLoginUser()
 {
    $app = &JFactory::getApplication();

    // Get Joomla's user object
    $user = &JFactory::getUser();

    if (!$user->guest) 
    {
         setcookie('userinfotocookie-email', $user->email);

         JRequest::setVar('userinfotocookie-id', $user->id, 'cookie');
    }

    return true;
 }
}

请注意,我尝试了两种不同的方法来创建 cookie,但都不起作用。如果我故意将错误代码放入例程中,则会收到错误消息,因此我知道正在调用例程。我想我错过了关于插件如何在 Joomla 中工作的一些信息;有什么建议么?

4

2 回答 2

1

我不确定 Joomla 是什么!您正在使用的版本,但我指的是 Joomla!2.5. 我认为您忘记传递正确的参数。尝试重命名您的函数:

public function onUserLogin($user, $options = array())

我不会在 Joomla! 中使用 setcookie()。您可以轻松使用JSession。但除此之外,您的插件究竟应该做什么还不是很清楚。

于 2012-11-11T10:48:44.600 回答
1

这是我的解决方案的一般概念,它不实现 cookie。我知道它实际上并没有回答这个问题,但是在与 Valentin 讨论(见评论)并仔细考虑之后,我意识到 cookie 不是一个好的设计选择,而且容易出现很多问题。我决定改写一个 Joomla Content 插件。这会在内容中查找一对 {showappwithuser} 标签,并将其替换为指向标签对内 URL 的 iframe。例如:

{showappwithuser}http://www.somewebsiteapp.com{/showappwithuser}

这将替换为指向http://www.somewebsiteapp.com?uid=joomlausername的 iframe. 这会将信息传递给接受应用程序,然后该应用程序可以执行它需要执行的操作。完整的代码如下,但仍然有点笨拙,因为大部分内容都是硬编码的。我需要添加参数处理,以便内容创建者可以选择 iframe 设置,如宽度、高度、滚动条访问。我还计划集成 uid 参数的加密,这样应用程序之间的信息就会有些混淆。这真的可以有很多不同的方向,如果编写正确,它可以成为一个很好的插件,可以将任何非 Joomla 应用程序无缝集成到 Joomla 站点中。使用此方法将其他参数信息发送到应用程序也有无限可能。享受!

<?php

// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// import the general plugin file of Joomla!'s library
jimport( 'joomla.plugin.plugin' );


// hook into the plugin framework
class plgContentShowAppWithUser extends JPlugin 
{
    // the core code to create an iframe and set it's URL source 
    // with the logged in user name from Joomla
    public function onContentPrepare($context, &$row, &$params, $page = 0)
    {
        $starttriggerpos = strpos($row->text, "{showappwithuser}");
        $iframeurl = "";

        if ($starttriggerpos !== false)
        {
            $endtriggerpos = strpos($row->text, "{/showappwithuser}");
            if ($endtriggerpos !== false)
            {
                $iframeurl = substr($row->text, $starttriggerpos+17, $endtriggerpos-$starttriggerpos-17);

                if (!JFactory::getUser()->guest) 
                {
                    $username = trim(JFactory::getUser()->username);

                    if (strlen($username) > 0)
                    {

                        $row->text = '<iframe src="' . $iframeurl . '?uid=' . $username . '"' . ' frameborder=0 scrolling=auto width=725>This application requires a browser that supports iframes.</iframe>';
                    }
                    else
                    {
                        $row->text = "Your web site login could not be determined. Please correct this and try again.";
                    }
                }
                else
                {
                    $row->text = "You must login to the web site in order to access this content.";
                }
            }
        }
    }
}
于 2012-11-16T23:44:15.873 回答