登录 注册

登录

问题 谁来继续开发 J2SMF 桥接器?

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2008年06月02日 15:17 - 2009年07月05日 15:26 #1 作者: Joomla之门
我在本站文章中已经简要说明了 J2SMF 桥接器的功能及其优缺点 。既然作者已经停止了开发,我希望能有其他高手接着改进,继续完善这个桥接器。

我认为需要解决的问题是:

1、实现用户注册同步及登录同步(dual login)。从 JSMF 的经验来看,可能需要重新开发一个登录模块来辅助这个功能。

2、如果可能,使得 J2SMF 可疑同时支持 SMF 1.1.x 及 2.x 版本;或者只支持 SMF 2.x 也行,因为 SMF2 的功能更好。

3、开发出配套的“最新帖子”、“热门帖子”、“无人回复帖子”、“在线会员”等相关模块。

4、如果再进一步,把必须 MySQLi 改进为在 MySQL 也能桥接,那就更好了。

上述目标中,只要完成第一个就已经可以认为整合成功了。后面3条都是逐渐深入完善,如果有难度也可以暂时不考虑。

请国内的 Joomla! 开发高手关注一下这个需求,欢迎所有用户跟帖讨论这个话题。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!
最后修改: 2009年07月05日 15:26 由 .

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月05日 15:47 #2 作者: Joomla之门
没想到这个话题首帖已经发表一年了,J2SMF 的作者已经完全停止了开发。目前官网提供的最后版本只能将 SMF 1.1.x 嵌入到 Joomla 1.5 实现外观整合,无法实现用户同步。也就是说,原版的 J2SMF 基本上已经没用了 —— 除非你的论坛不需要与 Joomla 进行用户同步。

今天我花了近8个小时来寻找一个“整合 Joomla 1.5 与 SMF 论坛”的最佳方案,最后发现 J2SMF 在修改之后竟然还是最好的整合方案!

正所谓“凡事皆有可能”,这个修改方案是由 Jennifer Nodwell 研究出来的,涉及的文件只有两个,一个属于 J2SMF 桥接器,一个属于 SMF 1.1.x;所修改的代码不超过 80行。其结果是:同时实现外观整合与用户同步。

Jennifer Nodwell 修改后的 J2SMF 工作模式是:

当某个属于 Joomla 的用户登录网站后(通过 Joomla 的登录模块),点击网站的菜单进入“论坛”(SMF)时,J2SMF 桥接器自动判断该用户是否存在于 SMF 中;如果 SMF 中有这个用户,就自动登录论坛;如果 SMF 中没有这个用户,就自动为他创建 SMF 帐号并登录论坛。


我认为其优势是:用户不需要再安装专门的登录模块,Joomla 的登录模块仍然能够工作。这一点非常重要,因为用户的注册、登录等仍然由 Joomla 核心管理,这就意味着可以与 Community Builder 或者其他付费注册组件等,可以共存。

我已经用 Jennifer Nodwell 的方案替换了 Joomla 之门 下载栏目原来发布的 J2SMF 桥接器,里面附带了修改过的文件。如果你有兴趣体验,请 下载 J2SMF 桥接器修改版

我在测试时发现一个小问题:Joomla 独有的某个用户第一次访问论坛时,会显示一条错误消息,也没有让他自动登录论坛,这时刷新一下页面就成功了。

发生这个问题的原因还不清楚。希望有高手继续改进。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月08日 00:06 #3 作者: Joomla之门
为了帮助高手尽快了解 J2SMF 在修改之后存在的小问题,我详细介绍一下,希望有人能尽快修复这些 bug,那么这个方案将成为目前最好的 SMF 整合方式:

首先,请安装测试环境( Joomla! 1.5.12 + SMF 1.1.9 + J2SMF 1.0 RC5 ),按照下面的操作来体验,就能重现这些 bug,从而帮助你理解问题所在:

1、假设你已经桥接成功。这时 Joomla 里只有一个用户 admin,而 SMF 也只有一个用户,例如 smf。两个软件之间的用户还没有同步。假设你在前台为论坛创建的菜单项目是“Forum”。

2、现在请访问 Joomla 前台的首页。可以看到你现在是未登录游客身份。请点击 Forum 菜单,可以看到,你在论坛也是未登录游客身份。

3、现在再次回到 Joomla 首页,通过 Joomla 的登录模块,使用 admin 这个帐号登录到 Joomla;然后再次点击 Forum 菜单访问论坛,你看到了什么?我想你应该看到如下的错误提示:

Cannot verify the joomla user admin ( id '62' ) with any smf users


同时,你应该注意到,你在 SMF 论坛的状态还是未登录游客。

这时,请不要点击其它地方,直接点击浏览器的“刷新”按钮,或者按键盘的 F5 键来刷新当前页面。接下来你看到了什么?你看到你已经成功登录到 SMF 论坛了!论坛上显示的是:

欢迎你 Administrator


以上演示了 J2SMF 修改版整合方案的整合结果。现在我指出存在的问题:

1、不能自动将 SMF 中的那个默认用户同步进 Joomla 中去。我认为可以在后台点击 J2SMF 设置页面的“保存”按钮时自动提取这个用户资料并在 Joomla 中为他创建对应的帐号。

2、Joomla 用户访问论坛时,第一次提示错误,刷新后才能同步。为什么要刷新一下?必须改进到第一次访问就立即同步。

3、假设你在 Joomla 中有 5 个用户,每一个都从前台的 Joomla 登录模块登录,然后去访问 SMF 论坛,最后都能自动同步到论坛。但是,你看一下论坛首页底部的“统计”,就会发现:SMF 论坛的“会员总数”仍然是 1,这些同步过去的会员帐号并没有被 SMF 计数!

4、接着上一个问题继续看,现在进入 SMF 论坛的“会员列表”,你会发现所有的 Joomla 用户已经自动列入 SMF 用户名单了,这好像没什么错。但是,你仔细看,这些 Joomla 的用户在 SMF 中没有被分配任何用户群组,我想这可能是导致 SMF 统计会员总数时没有统计他们的原因。这一点必须纠正。

5、下一个问题是:admin 这个 Joomla 用户在 joomla 中的 userID 是 62,而当他被同步到 SMF 之后,userID 在论坛中显示的是 2(假设 SMF 在整合前总共只有一个用户,而整合之后第一个访问论坛的 Joomla 用户就是 admin)。也就是说,SMF 给同步过来的 Joomla 用户创建帐号时,从 2 开始分配 userID。这就导致同一个 Joomla 用户,在 Joomla 系统和论坛系统中拥有不同的 userID。虽然目前看不出有多大影响,但我认为这始终是一个不稳定因素。为什么不直接给 admin 用户在 SMF 中也分配 62 这个 ID ?我的改进意见是:在 SMF 中同步用户时,创建与 Joomla 相同的 userID。

6、最后一个问题是:前面我们已经让 admin 这个用户同步过了,Joomla 和 SMF 两边都有了这个帐号。这时候我们退出登录,成为游客状态。然后,我们直接点击 Forum 菜单来到论坛首页,尝试通过 SMF 的登录框,输入 admin 帐号的资料来登录,我发现不能登录。也就是说,即使用户同步了,还是不能通过 SMF 的登录框登录。这怎么行?我怀疑这与同步后的用户在 SMF 中没有给分配群组有关。不管什么原因,我认为必须允许已经同步的用户通过任意一边的登录框顺利登录网站。

以上6个小问题期待高手解决。谢谢!

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年07月08日 04:06 - 2009年07月09日 00:43 #4 作者: joey
问题没有6个。
首先,第一次登录时错误提示是因为论坛的数据库中还没有在joomla中注册的用户的资料,所以出现这个提示,程序中的思路是首先判断用户数据存贮是否正常,否则再自动将数据调整,所以刷新后正常。
对于这个问题的解决有以下两个思路。
1. 修改错误提示。  \components\com_j2smf\integration\advanced.php 中217行将这个错误提示修改下,汉化或者修改, 告诉用户需要刷新页面可正常操作。
2. 修改php代码,在判断用户资料是否存在于论坛数据中之前先做一次数据处理,或者去掉错误提示,及错误返回。 修改方法如下:
217行 		$message	= "Cannot verify the joomla user $jname ( id '$jid' ) with any smf users";
	230行	    $message	= "Cannot verify user with jid of $jid ( joomla mail '$jmail' smf mail '$smail' )";
	269行     return null;

这三行内容注释掉或者删除  
即可、


对于用户id的问题不好进行同步,因为整合的思路是用户名和email的一致性整合方法, 所以id在这里是一个无关紧要的问题了, 如果这个也同步了可能存在两边注册的不同用户可能会被相互覆盖掉,只剩一个,是很严重的隐患。(具体的原因不多说了)
用户组问题是因为在判断用户不存在论坛数据之后进行的数据写入时出现的遗漏。  代码中给出了一个sql查询方法,仅仅将用户名密码和邮箱写了过去,没有考虑用户组的问题。
解决方法 1.完美的方法,增加joomla中插件的后选项。增加用户组选项
2.简单方法  直接修改源文件还是\components\com_j2smf\integration\advanced.php  这个文件,将
$query .= "`totalTimeLoggedIn`, `passwordSalt`) VALUES (NULL, '" . $user->username . "', '0', '0', '0', '', '0', '" . $user->name . "', '0', '0', '', '', '', '" . $p . "', '" . $user->email . "', '', '0', '0001-01-01', '', '', '', '', '', '', '', '0', '1', '', '', '0', '', '0', '0', '0', '', '1', '1', '0', '2', '', '', '', '', '0', '1', '', '0', '', '', '0', '0', '" . $s . "')";

修改一下。

比如修改为
$query .= "`totalTimeLoggedIn`, `passwordSalt`) VALUES (NULL, '" . $user->username . "', '".strtotime($user->registerDate)."', '0', '4', '', '0', '" . $user->name . "', '0', '0', '', '', '', '" . $p . "', '" . $user->email . "', '', '0', '0001-01-01', '', '', '', '', '', '', '', '0', '1', '', '', '0', '', '0', '0', '0', '', '1', '1', '0', '2', '', '', '', '', '0', '1', '', '0', '', '', '0', '0', '" . $s . "')";

两行内容不同之处在数字“4” 即是论坛中新手群组的id ,这个你可以根据自己的需要修改。strtotime($user->registerDate) 这点不同是增加了用户在论坛中注册时间的参数。


对于统计数据不准确是因为在用户整合时没有对论坛的统计数据进行更新,需要在相应的位置增加数据库查询以更新统计数据。
修改方法如下

在  272行 $message = "Verified user with username $jname ( joomla id '$j
之前增加内容
 if ( ! $ok )
	{
		$query1= "UPDATE `smf_settings` SET
		 value = value + 1  WHERE variable = 'totalMembers';";
		$db->setQuery($query1);
		$result = $db->loadObject();
		$query1= "UPDATE `smf_settings` SET
		 value = '" . $user->username . "'  WHERE variable = 'latestRealName';";
		$db->setQuery($query1);
		$result = $db->loadObject();
		$query1= "UPDATE `smf_settings` SET
		 value = '".$smfid."'  WHERE variable = 'latestMember';";
		$db->setQuery($query1);
		$result = $db->loadObject();
		if ($db->getErrorNum()) {
		JError::raiseWarning( 500, $db->stderr() );
		}
}
最后修改: 2009年07月09日 00:43 由 .

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年07月08日 04:12 #5 作者: joey
joomla注册的用户无法在论坛直接登录是因为两个系统的密码加密机制不同,这会时间时间大了, 初步觉得解决有点多余方法也比较麻烦,会给会员带来一些不必要的确认步骤,因为joomla的密码加密不可逆,要同步论坛存贮的密码必须让会员进行一次密码确认过程繁复了,没有意义,不过简单的认为最好的方法是关闭论坛的登录框避免这个错误出现,一个页面两个登陆框也没有必要。

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月08日 07:19 #6 作者: Joomla之门
对于用户群组问题的解决,我认为无需要求每一个用户自己去修改代码(我的原则是尽量让终端用户少操作源代码)。我们可以这样:很显然 SMF 在安装之后,都有一个默认的用户群组设置,其中最初级的那个用户群组 newbie(权限地位相当于 Joomla 里面的 registered)应该有固定的 ID。也就是说,我们让桥接器在同步时将 Joomla 里面的用户默认设置为 SMF 的 newbie 群组即可。

当然了,如果能在 J2SMF 桥接器的后台增加一个选项,让用户从下拉选单上选择要将 Joomla 用户同步到 SMF 的哪个群组,就更方便了(下拉列表的内容从 SMF 直接提取当前的所有群组名称)。

最好的方法是关闭论坛的登录框避免这个错误出现


这个主意我也想到过,不过似乎 SMF 论坛的管理界面中没有“关闭登录框”的选项。如果通过 hack 代码来关闭这个登录框,我觉得还不如继续研究允许用户从 SMF 直接登录。

感谢 joey 熬夜研究这个问题。我建议 joey 参考一下 SJSB 桥接器 的部分代码,因为 SJSB 的目标也是整合 Joomla! 1.5 + SMF, SJSB 就实现了 Joomla 用户直接从论坛登录。我相信从 SJSB 中可以挖掘出这个问题的解决方案。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年07月08日 20:03 #7 作者: joey
对于登录框的修改,涉及到smf的模板部分, 由于对smf并未使用和研究过, 我暂时还做不出修改。

从有关资料了解到joomla的加密方式从最新版开始加入了随机码干扰加密,所以不能像以前版本一样可以直接取加密后的密码结果用于论坛。

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月10日 19:22 #8 作者: Joomla之门
今天下午测试了 joey 的代码,结果如下:

1、将/components/com_j2smf/integration/advanced.php 文件的217行修改为中文提示后,确实友好了一些,但没有从根本上解决问题。

我的原意是:用户不再需要刷新,就能完成同步。

请允许我这个不懂编程的人谈一点假设:我们可否让 advanced.php 这个文件对 Joomla 的登录表单进行监控,探测用户的登录行为。一旦用户从 Joomla 的登录框(mod_login)登录,就马上触发 advanced.php 文件中相应代码去某个数据表(例如 jos_smfsync)中检查该用户是否同步过,如果没有记录,就去 SMF 论坛创建这个用户,同时给他分配默认的“新手”用户群组,同步完成后立即在 jos_smfsync 表中创建一条记录,表示该用户已同步,以后该用户再从 Joomla 登录表单登录网站时,就不会触发同步动作。

或许这个方法不太好,因为增加了数据库的查询操作。如果您还有更好的创意,欢迎指出。

总之,我的想法是:不再需要用户去刷新页面,我们将两步压缩成一步。

2、关于给分配用户群组的代码我应用后,再去论坛中查看用户列表,发现新增会员被分配了群组,但群组名称是问号(??),我想这应该是“新手”二字没有正常显示的原因。希望 joey 抽空解决一下这个乱码问题(或许只是一个 utf8 编码函数问题?)。

3、我还应用了那一段关于会员数量统计的代码,似乎无效。我查看论坛首页底部的统计数据时,“会员总数”那里竟然没有数字了,其旁边的“最新注册会员”那里仍然只显示 SMF 安装结束后那个默认用户。

4、joey 的代码还修复了一个 bug:我前面忘记报告这个 bug 了,那就是,当 Joomla 的用户被同步到 SMF 之后,在 SMF 中查看“用户列表”,会发现新增的用户其“注册日期”都是 1970-01-01,实际上当然不是这个日期。

今天应用了 joey 的代码之后,发现新增用户的注册日期显示正常了。


总结一下:joey 的代码真正修复的问题只有一个,就是“注册日期”正常了。其它问题似乎都没有解决。

当然了,这已经是很不错的进展了。因为其他了解 SMF 的高手都还没有拿出方案来,而 joey 才是第一次用 SMF。希望 joey 继续研究这个问题,抽时间再完善。谢谢!

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月10日 19:25 - 2009年07月10日 19:41 #9 作者: Joomla之门
刚才也找到了隐藏 SMF 自带登录表单的方法:

第一步,在 SMF 管理面板上进入“功能及选项 -> 外观及选项”,去掉“在每页显示快速登录”这一项的勾选。这个只是隐藏了登录框,但没有隐藏“登录”和“注册”两个顶部导航按钮,也没有隐藏提示游客“登录”或“注册”这两个链接。

第二步,打开 SMF 当前模板的 index.template.php 这个文件,分别搜索与 register、login 和 greeting 有关的代码,将这几段代码都注释掉,就能隐藏上一步没完成的部分。


尽管如此,我还是不赞成修改 SMF 源代码来隐藏其登录表单。因为在这个整合方案中,我们已经修改了 SMF 的 LogInOut.php 文件,我觉得这个文件对 SMF 安装插件(Mod)似乎没有影响,所以可以接受。如果再修改更多的 SMF 源代码,可能会影响到用户安装 SMF 插件,甚至影响到 SMF 核心的升级。

所以,如果可能的话,尽量研究一下让 Joomla 用户可以从 SMF 的登录表单登录就行了。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!
最后修改: 2009年07月10日 19:41 由 当天晴时.

登录 或者   注册一个会员帐号 来参与讨论

更多
2009年07月11日 01:02 - 2009年07月11日 01:12 #10 作者: joey
附件是我按照前面的方法修改好的,测试除了字符显示问题之外其他的基本都正常, 可以覆盖\components\com_j2smf\integration 目录下同名文件再测试下.


由于对smf和joomla了解很少,再多的修正没有做出来.
整合后论坛字符乱码问题经过测试,发现刷新n次以后偶尔会有正常的字符出现,大部分时间是问号,所以说这个字符问题带有随机性,原因我没有找到,不知是桥接器的问题还是其他方面的问题导致, 按常理这个乱码一般出现在mysql数据库查询时对字符集校对处理错误导致,但偶尔能正常显示却很不好说(太深奥我也不懂了!)最好开发者或者同时熟悉这两个程序代码的朋友能找找原因.
最后修改: 2009年07月11日 01:12 由 mcbig.

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月11日 09:02 #11 作者: Joomla之门
我刚刚测试了 joey 附件中的文件。用的是 Joomla! 1.5.11 + SMF 1.1.9。

这次有新的发现:

1、通过 Joomla 登录表单登录后,第一次访问 SMF 论坛,并没有提示要刷新,而是直接自动登录了。这似乎是好事。

2、如果在论坛上任何页面按 F5 刷新,就会发现 SMF 中的会员总数在增加。每刷新一次就增加一个会员!

3、乱码问题我刷新多次没有看到正常的情况。我觉得这是个严重问题。因为这些乱码在 SMF 独立访问时显示正常中文,桥接状态访问时是乱码;相反的,如果在桥接状态下发帖,显示的中文是正常的,回到 SMF 独立状态,就变成了乱码。我想 J2SMF 桥接器在传输数据时或许使用了某种不是 utf-8 的编码。

PS:刚刚看到一个消息,JFusion 下一个版本 1.2.0 将加入对 SMF2 的整合支持,并且增加了 Universal Framelesss(通用无缝整合),如果 JFusion 这次成功了,恐怕 J2SMF 的改进就没多少意义了。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论

  • Joomla之门
  • Joomla之门 的头像 话题作者
  • 离线
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • COM_KUNENA_SAMPLEDATA_RANK_ADMIN
  • Joomla是最好的建站CMS!
更多
2009年07月11日 18:20 #12 作者: Joomla之门
J2SMF 整合 SMF 论坛后示范帖子中出现乱码的原因今天找到了。是无意中发现的。

下午我测试 通过 JFusion 整合 Joomla 1.5.12 + SMF 2.0 ,测试时发现一旦切换到“无缝整合”模式,SMF2 的示范帖子中也出现同样的乱码问题。我感到比较奇怪。J2SMF 的问题怎么在 JFusion 上面也出现了?

我检查了一下,原来测试用的这个 Joomla 1.5.12 前几天刚测试过 J2SMF,其“全局设置”中还保留着以 MySQLi 作为数据库引擎的设定。我想问题或许在这里。于是改回 MySQL,乱码消失。

由此可见:乱码问题是由于 Joomla 的 MySQLi 驱动与 SMF 的 MySQL 驱动之间交换数据时没有处理好编码造成的。很可惜安装 SMF 时没有见到 MySQLi 的选项,如果能让 SMF 使用 MySQLi 驱动,或许就没有乱码了。

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论