Chinaunix

标题: “在线课程管理”之Claroline使用集 [打印本页]

作者: lsstarboy    时间: 2009-03-06 23:19
标题: “在线课程管理”之Claroline使用集
  现在流行的在线学习和课程管理系统(LCMS)中,Claroline是一个小巧、高速、比较符合中国人习惯的系统,虽然在国内的呼声远不如Moodle,但是还是比较有实力的一个软件,欢迎大家把在使用过程中的经验和问题反映出来,但网友们学习参考!

  本人也是因为测试流行的课程管理软件才刚接触的Claroline,经过和其他系统的对比,发现比较符合个人的口味,将会陆续把使用的问题写出来,免得网友再走弯路。

  以下是索引:

  1、Claroline是什么。

  2、wiki不认中文链接的原因分析及解决。

      3、改为默认utf-8编码

  4、不认中文名、创建课程时会创建重复的课程解决

  5、解决填空题不能设置无顺序的答案的问题

  6、改造建议(个人意见)

  7、数据库分析

  8、备课、学生使用简单说明

  9、输入数学公式(1.9RC5版)

  10、修改单选题默认选项为4个

  11、解决中文乱码的问题。

[ 本帖最后由 lsstarboy 于 2009-4-22 00:02 编辑 ]
作者: lsstarboy    时间: 2009-03-06 23:24
1、Claroline是什么?
  官方网站信息:
  Claroline is an Open Source eLearning and eWorking platform allowing teachers to build effective online courses and to manage learning and collaborative activities on the web. Translated into 35 languages, Claroline has a large worldwide users’ and developers’ community.


Claroline是一个开源的在线学习和工作平台,它可以使教师在网上制作一个高效的在线课程并管理相应的学习和协作活动。Claroline有遍布全球的用户和开发者,并被翻译成35种语言。

  中国Claroline网站是:www.claroline.net.cn,被译为:课廊。

  常用链接:课廊之家:http://www.moodle123.com/forumdisplay.php?fid=11

[ 本帖最后由 lsstarboy 于 2009-3-12 16:55 编辑 ]
作者: lsstarboy    时间: 2009-03-06 23:34
二、wiki不能使用中文链接

  1原因:受其他在线课程管理系统的影响,随手把Mysql数据库改为utf8_unicode_ci,结果数据库里用utf8存储,但是claroline查询时还用默认的latin1编码查询,导致查询不到。

  2、从wiki开始追踪(简记):(1)wiki中,链接指向page.php?action=save,那么到page.php里找save的action,再找到wikipage的save,然后再到wikistore,这里有一句是需要判断返回的行数。但是由于编码不对,所以返回0。
    返回函数在 inc\claro_init_global.inc.php:131行
   inc\claro_init_local.inc.php:329行

  3、解决:把phpMyAdmin改为latin1连接,导出所有数据。存储为claroline.sql。
        再把claroline.sql里所有的utf8_unicode_ci改为latin1_bin。
        把所有的utf8改为latin1,这一个是改编码方式,上一行改的是数据库的连接编码。   
        存储为ascii方式,删除掉原来的claroline所有表,然后再导入进数据库。

    4、UTF8编码的修改:Claroline可以使用utf8编码,但是系统中文包采用gb2312编码,需要同时把mysql数据库和中文包变为utf8,可以用gedit或Ultredit修改,同时把语言包里的默认语言改为utf8,具体方法见下一帖。

[ 本帖最后由 lsstarboy 于 2009-4-21 23:19 编辑 ]
作者: lsstarboy    时间: 2009-03-10 22:54
三、改为utf-8编码:
  
  claroline的设计非常优秀,可以方便地改为任意编码。特别是mysql的连接方式,仅仅有三处需要改动:

 1、修改lang里的编码:locale_settings.php,把gb2312换为utf-8,注意保存为utf-8编码。

 2、修改complete.lang.php的编码方式:可以用“记事本”或UltraEdit等编辑工具找开,然后“另存为”的时候,修改一下编码方式。

 3、修改三处mysql_connect时的默认编码:
   
   (1)inc\claro_init_global.inc.php:131行
   (2)inc\claro_init_local.inc.php:329行
   (3)wiki\lib\class.dbconnection.php:171行
 
   分别在上面三行后加上一行,内容为: mysql_query("SET NAMES UTF8");

 4、修改mysql数据库的编码方式:
   (1)修改claroline数据库的默认编码,可以在phpmyadmin的操作里修改。
   (2)如果是已经建立了数据库,那么需要先导出,导出时需要保证汉字都正确。 
      注意:对于已经存在的数据库,导出时一定要注意“导出blob类型为二进制”,这个必须保证不选择。如果选择上这个选项,那么所有的文本格式的文字将会丢失!!
   (3)删除数据库。
   (4)修改连接编码方式。在phpmyadmin的“服务器: localhost”,也就是第一页那儿改为:utf8_unicode_ci。
   (5)把导出的数据库文件编码改为utf-8,可以使用“记事本”或Ultraedit32的“另存为”改。
   (6)导入数据库文件,注意导入的时候要选准数据库名,要注意编码方式要选utf-8(如果不一小心写成utf8,那么firefox不影响,但是IE6编码会出错,改为utf-8就可以了)。

  5、刷新,右击,查看页面源代码。可以看一下编码方式是哪一种,如果显示是utf8,并且出现正确的汉字,那么改造就完成了。


  6、问题:wiki在utf8下不能中文显示不正确,但是编辑的时候正确。
    原因:在wiki/lib/wiki2xhtml/class.wiki2xhtml.php中,在大约200-230行左右,有一个去除Word等程序附加的一些东西的程序,用str_replace函数,这个函数在utf-8编码时会出现问题,导致吃掉部分中文的编码,所以显示不正确。
    解决:临时还没找到解决方案。在php官方网站上也有人说这个问题。由于wiki一般不能从word复制文本,所以这个块可以不启用,注释掉也可以,也可以在文件开头的地方把下面的参数改为0。
        $this->setOpt('active_fix_word_entities',1);


  7、如果是已经存在的系统,那么要把excercise里的所有文件编码修改为utf-8,这个工作会比较大。
-end-

[ 本帖最后由 lsstarboy 于 2009-4-10 13:12 编辑 ]
作者: lsstarboy    时间: 2009-03-12 18:46
四、常见问题:

  1、在课程讲义里,上传的文件如果是中文名或者是中文路径,会出现不认或乱码的情况。

    这个问题的确出现在正常的编码为gb2312的版里,但是如果改为utf8编码后,一切正常。如果坚持用gb2312的版本,则可以修改document.php,具体的位置还需要再追踪。

  

---------------------------------------------------------------------------------------------------------------------------

  2、新建的讲义里,如果存在中文名的图片等,则会不认。如果使用的1.9,并且采用了GB2312编码,图片中语言名乱码请看29楼。

    这是因为在editor\tiny_mce\themes\advanced\image.php里大约50行,要去除文件名中的危险字符,并且用了“strict”的匹配模式。
$imgFile['name'] = replace_dangerous_char($imgFile['name'],'strict');

这个函数有两个,分别在
inc/lib/file.lib.php和inc/lib/html.lib.php
函数的前半部分没有问题,但是后半部分的strict模式会出问题,连作者也写了一个注释:
......
        // TODO FIXME is this valid in all charsets ???

        if ($strict == 'strict')
        {
            $string = str_replace('-', '_', $string);
            $string = str_replace("'", '', $string);
            $string = strtr($string,
                            'M-@M-AM-BM-CM-DM-EM-`M-aM-bM-cM-dM-eM-RM-SM-TM-UM-VM-XM-rM-sM-tM-uM-,
                            'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');
        }

        return $string;
    }
}
解决的办法,可以临时把调用函数的'strict'去掉。

  应该是所有的,与strict模式相关的地方都不能正确地显示汉字。(有UTF-8编码)

-------------------------------------------------------------------------------------------------------

 3、图片重名会被覆盖掉。

  这好像是一个系统的Bug,查一下官方网站再说。

--------------------------------------------------------------------------------------------------------

 4、创建完课程之后,系统会等待很长时间没有响应,如果多次刷新,则会创建好多个相同的课程。

  这是因为在课程创建后,系统会自动发一封电子邮件到创建者的邮箱。如果系统设置里没有设置smtp服务器,那么claroline就一直处于等待状态。
    解决办法:(1)设置有效的smtp,并设置相应的用户名和密码。 (2)把sendmail.lib.php大约50行左右,修改:(没测试完成)

________________________________________________________________________________________________________

[ 本帖最后由 lsstarboy 于 2009-7-26 21:36 编辑 ]
作者: moodle123    时间: 2009-03-14 12:05
我是moodle123的管理员,对claroline比较感兴趣,在2006年就开始学习claroline,
使用claroline做了一些实践,学而网 http://www.ontext.cn/,你有兴趣可以去看看
但是我个人对程序本身不懂,因此,诚邀您到moodle123中的claroline发布板块担当版主。
http://www.moodle123.com/forumdisplay.php?fid=11
作者: lsstarboy    时间: 2009-03-17 19:22
五、Claroline填空题不能设置为多个答案和无顺序答案的修改:

  有很多题有不定项的答案,比如:中国哪些省靠海?
  如果答案设置的第一个空是江苏省,那么第一个空填其它的都是错误。
  这些答案应该是没有顺序的题目和可以有多种答案的题目,但是在课廊中,它只能严格按照每个空的顺序来。

  修改方法:把附件中除了图片外的文件解压到exercise/lib里,把原文覆盖。
  用法:多个答案用“|”隔开。但是这样学生可以把每个空都填成一样的答案。所以还要有一个系列号,表明这些答案是不能重复的。系列号在最后加上“||X”,X是任意一个字母。

  见下图例:

图1:设置方法:


图2:填写答案:


图3:结果:

answer_fib.tar.gz

6.53 KB, 下载次数: 140


作者: lsstarboy    时间: 2009-04-10 20:21
六、对Claroline必须的改造:

  1、编码:如果用gb2312编码,则会有很多地方不认中文名。必须改为utf-8编码,这样能认大多数的中文名,但偶尔也会出现个别字乱码的问题,但是机率很小。(声音的声就会乱码)。
  
  2、“课程讲义”感觉翻译为“课程素材”更为恰当。

  3、填空题的改造,见上帖。
作者: lsstarboy    时间: 2009-04-11 11:12
七、数据库分析(基于1.8版):

每个课程
 1、announcement:课程公告。
 2、以bb开头的有9个数据表,是phpbb论谈的简缩版:
   bb_categories:论谈的分类
   bb_forums:论谈区,包括排序等。
   bb_posts:帖子
   bb_posts_text:帖子内容
   bb_priv_msgs:看结构应该是论谈的站内短消息,但是在1.8版本中没有这个功能。
   bb_rel_topic_userstonotify:“有回复时请通过EMAIL通知我”的选项。
   bb_topics:主题
   bb_users:论谈的用户,但是好像不记录。
   bb_whosonline:谁在线上,现在没启用。

 3、
   calendar_event:日历信息,实际上是课程计划
   course_description:课程说明,这个是指在课程简介里的“简介”、“教学目标”、“技能和方法”等。
   course_properties:课程的属性,是不是允许自注册,显示不显示wiki等。
   document:“课程讲义”里的内容,不包括目录
 
 4、学习小组的2个数据表:
   group_rel_team_user
   group_team

 5、外部链接资源2个数据表:
   lnk_links
   lnk_resources

 6、学习路径5个数据表:
   lp_asset
   lp_learnPath
   lp_module
   lp_rel_learnPath_module
   lp_user_module_progress

 7、练习7个数据表:
   qwz_answer_fib
   qwz_answer_matching
   qwz_answer_multiple_choice
   qwz_answer_truefalse
   qwz_exercise
   qwz_question
   qwz_rel_exercise_question
 8、工具列表和首页介绍:
   tool_intro:这一个是课程首页上的介绍
   tool_list:这一个表是左侧工具栏的信息,也就是课程的左侧菜单。

 9、练习跟踪信息6个表,比如谁做完练习,得了多少分:
   track_e_access
   track_e_downloads
   track_e_exercices
   track_e_exe_answers
   track_e_exe_details
   track_e_uploads

 10、用户信息表两个,但是好像没有使用:
   userinfo_content
   userinfo_def

 11、wiki的4个数据表
   wiki_acls
   wiki_pages
   wiki_pages_content
   wiki_properties

 12:作业里的两个数据表(这个跟wiki放在一起,拼写也类似,很容易当成是wiki的数据表)
   wrk_assignment
   wrk_submission

[ 本帖最后由 lsstarboy 于 2009-4-11 11:15 编辑 ]
作者: lsstarboy    时间: 2009-04-11 18:21
一、概述

  我们一般的备课分:教案、导学案、相关资源、练习以及讨论,这些内容都在Claroline上有相对应的分类。

  对于我们信息技术课的备课的情况来说,Claroline有三大核心:讲义(资源)区,练习区,学习路径。  如果是其它科目,还要有作业。   在课程的左侧,从上到下依次的作用是:

    * 课程简介:包括课程的教学目标、教学任务、技能和目标、辅导资源、活动内容、教学评价方式等。这地方其实包括平时教案的头部和本课程的全面部署。

    * 课程计划:这一个是本课程从什么时候开始起效,到什么时候结束。对于上课使用来说我们可以不计较时间,但是对于在线培训来说,一个常用的做法就是给一个限定的时间进行学习。

    * 课程公告:针对本课程的公告,注意这个公告也同时出现在首页上。

    * 课程讲义:这是核心部分,所以的教案、导学案(学案)、相关资源都放这儿。使用的时候注意建好目录,不仅为你自己使用方便,而且方便了课程的使用者和参考者。

    * 课程练习:所有的练习题都放这儿。目前只能建:单项选择题,多项选择题,填空题,判断题(实际上也是选择题),区配题(本质上还是选择题)。相对于moodle来说,题型稍微少一点。

    * 学习路径:Claroline最有特色的部分。其实就是要求学生必须按照一定的顺序来学习。每个学习路径就相当于一个专题,或者是一个大模块中的一节课。比如电子表格教学,一般至少分两节课,那么就可以建立两个(或以上)个学习路径,每节课学习一个。

  学习路径不是新的内容,而是把“课程讲义”、“课程练习”、“作业”三部分的内容按一定的顺序串起来,使学生在学习时不致于面对庞大的资源而不知所措。

    * 作业:其实这一节我认为应该提到学习路径的前面去,这样更符合逻辑。在学习路径中,也可以包含作业。

  作业和练习的区别在于:作业需要上传文件或者新建文件,得分情况需要课程管理员来批改,而练习只需要简单的操作,并且得分情况可以由系统自动给出。

    * 学习讨论:可以开展针对本课程的一些讨论。其实就是一个简化的,大名鼎鼎的开源PHP论谈系统:phpbb。

    * 学习小组:可以把学员分开不同的小组,方便开展分组教学。

    * 用户列表:可以看本课程都有哪些用户。

    * 聊天答疑:一个简单的在线聊天系统,如果有问题,可以通过本平台进行简单的交流。

    * 协作资源:一个简化的wiki系统,可以由所有学员和教师共同完成某一专题的内容。

二、教学资源都放到哪儿去?


    * 教案、学案:可以进到“课程讲义”里面。在这儿既可以上传你已有的word或wps的教案,也可以直接用网页的形式写。写网页基本上和FRONTPAGE差不多,有一个可视化的编辑器。

  还可以输入数学公式,但是在1.8版里有点麻烦,1.9里的已经很好用了,但是目前(2009年4月初)为止还不能在公式里输入中文。

    * 图片、视频等资源:当然也应该放到“课程讲义”里,其实这一个项目的英文名是“documents”,本身就应该包括了“资源”,但是翻译为“讲义”感觉把范围缩小了一点,很容易产生岐义,我认为翻译为“教学资源”更合适。

    * 已有的PPT等演示文稿:也入到“课程讲义”里,理由同上。

    * 练习题:当然放到“课程练习”里了。但是如果你有制作好的doc,pdf等格式的练习,那么还是放“课程讲义”里好了。

    * 给学生布置的作业:如果你了解了“作业”和“练习”的区别,你就会知道放到“作业”里,因为对作业的评价,是需要课程管理员的批改才行得出的。单纯由计算机就能批改完成的题目,还是放到“课程练习”里吧。

    * 留给学生一些讨论的话题:直接放“学习讨论”里吧,这个简单的BBS专项就是讨论。

    * 有一些未解的东西,想留到以后慢慢补充:那么就放“协作资源”里,这儿就相当于“百度知道”,任何人都可以把他知道的东西补充进来。当然,不用害怕把内容搞乱了,系统自动记录每次更动,如果对新的改动不满意,你可以把它恢复到最近的、你满意的那一次。

三、备课还需要注意什么?

  下面的内容不是强制的,只是一些可以使你提高备课效率的建议:

   1. 在“课程讲义”里至少创建三个文件夹:“教案”、“导学案”(“学案”)、“教学素材”。这样如果你需要修改的话,你可以轻松地找到地方。

   1. 如果本课程需要几节课才能完成,建议你在课程讲义里也分好节次,方便学习和修改。

  并且建议在“学习路径”中,为每节课建立一个单独的学习路径,如“第一节:图片的设置”,“第二节:文字的设置”,“第三节:表格的使用”。这样可以使学生快速地找到学习的目标。

   1. 如果您有能力,请尽量使用网页方式,而少使用doc、wps的文档。理由:(1)网页修改更方便。(2)不需要在学生的机器上安装word或wps等软件,对于终端型的机器来说,更具有优势,甚至你可以在手机上来学习。

   1. 在制作完学习路径后,可以把“课程讲义”、“课程练习”和“作业”隐藏,这样可以使学生把注意力引向“学习路径”,从而避免在资源和教案中闲逛。

  需要提示一下,即使把“课程讲义”等隐藏,在“学习路径”中一样可以正常显示和正常使用。  可以通过“工具微调”来隐藏相应的档目。方法是在对应的栏目上单击鼠标,直到显示一只闭着的眼睛为止。

   1. 为了提高在网络上的安全性,Claroline对字符有严格的过滤,这会导致某些中文显示不正常,如果遇到这种问题,建议把乱码的字符删掉,然后再换一个词来替换。汉字表达丰富这一特点,在这儿可以派上用场。

[ 本帖最后由 lsstarboy 于 2009-4-11 18:22 编辑 ]
作者: lsstarboy    时间: 2009-04-17 22:40
九、在Claroline里输入数学公式(转自“课廊中国”)
http://www.claroline.net.cn/clar ... wtopic.php?topic=40

有两种方法可以实现,我这里先只介绍在自己的服务器上实现的方法。以Claroline 1.8.11为例,简单的操作流程:

转至目录“\claroline\inc\lib\mimetex”,我们可以看到几个重要文件

mimetex.exe    (适用于Windows服务器)
mimetex.linux  (适用于Unix服务器)
mimetex.darwin (适用于Mac服务器)

假定我使用的是Windows服务器,则把文件“mimetex.exe”移至服务器的“cgi-bin”目录(假如完整的路径是“www/cgi-bin/”,这个目录对应的地址则是“http://你的网址/cgi-bin/”),并将该文件重命名为“mimetex.cgi”

在目录“\platform\conf”找到文件“claro_main.conf.php”,搜索“$GLOBALS['claro_texRendererUrl']”,并修改如下:

$GLOBALS['claro_texRendererUrl'] = 'http://你的网址/cgi-bin/mimetex.cgi';

  

我本地使用效果示范:

编辑帖子时按照插入图片进行操作,地址为http://你的域名/cgi-bin/mimetex.cgi?x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}

http://你的域名/cgi-bin/mimetex.cgi?\Large f(x)=\int_{-\infty}^x e^{-t^2}dt



如果是在Claroline 1.9 RC5里,那就很简单了,设置好之后,在编辑器第二排Button上会出现一个代码数学公式的按钮,点击后直接输入:

x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}

f(x)=\int_{-\infty}^x e^{-t^2}dt

就可以产生以上两个公式。
----------------------------------------------------------------------------

lsstarboy补充:

Claroline官方不建议修改这个文件,其实手动修改后再进入“平台管理”,则会得到“配置文件被修改”的错误提示。建议用“平台管理”来设置,方法是:
Claroline > 平台管理 > 本平台的配置 > 系统设置 > 高级设置 > 准确网址(Mathematical renderer URL)。
  
输入“http://你的网址/cgi-bin/mimetex.cgi”就可以了。

[ 本帖最后由 lsstarboy 于 2009-4-17 22:41 编辑 ]
作者: lsstarboy    时间: 2009-04-20 20:09
十、把修改单选练习题默认为4项。

  我们现在的习惯是默认4项选择题,分别是ABCD,但是Claroline只提供了默认的两项,并且文本框太宽。
  可以修改源代码来完修改这个任务:
  exercise/lib/answer_multiplechoice.class.php


  第72行:

 
            // add 2 empty answers as minimum requested number of answers
            $this->addAnswer();
            $this->addAnswer();

再加上两个“            $this->addAnswer();”:
 [quote]            // add 2 empty answers as minimum requested number of answers
            $this->addAnswer();
            $this->addAnswer();
            $this->addAnswer();
            $this->addAnswer();
这样就把默认的两个选项改为四个。

第530行:

                        $html .=
                                '</td>' . "\n"
                    .         '<td valign="top"><textarea rows="7" cols="25" name="answer_'.$i.'">' . htmlspecialchars($answer['answer']) . '</textarea></td>' . "\n"
                    .         '<td><textarea rows="7" cols="25" name="comment_'.$i.'">' . htmlspecialchars($answer['comment']) . '</textarea></td>' . "\n"
                    .         '<td valign="top"><input name="grade_'.$i.'" size="5" value="' . htmlspecialchars($answer['grade']) . '" type="text" /></td>' . "\n"
                    .         '</tr>' . "\n\n";

  其中rows就是文本框的高度,cols就是文本框的宽度,一共有两组,第一组是答案,第二组是解释。对于1024x768的分辨率来说,把rows改为2,对于答案(第一组),把cols改为60也可以,我们一般不用解释栏,所以可以只改rows,而不改cols。
  不过最好把两组的rows改为一样,如果不一样的话,会出现一行大小不相同的情况,影响界面美观。

[ 本帖最后由 lsstarboy 于 2009-4-20 20:13 编辑 ]
作者: lsstarboy    时间: 2009-04-21 23:42
十一、Claroline在上传文件不认中文文件和路径,以及在“课程讲义”里某些字符乱码:
 
  出现这个问题的主要原因在于Claroline开发组没有考虑双字节字符问题,在进行字符过滤时过滤了部分扩展的ASCII码,也就是128-255的部分字符,导致把某些汉字给过滤掉。

  需要改两个函数,在Claroline里,有两个地方定义了“replace_dangerous_char()”,一个在file.lib.php里,一个在html.lib.php里,这两个都需要改动。

  先来看一下函数:
function replace_dangerous_char($string, $strict = 'loose')
    {
        $search[] = ' ';  $replace[] = '_';
        $search[] = '/';  $replace[] = '-';
        $search[] = '\\'; $replace[] = '-';
        $search[] = '"';  $replace[] = '-';
        $search[] = '\'';  $replace[] = '_';
        $search[] = '?';  $replace[] = '-';
        $search[] = '*';  $replace[] = '-';
        $search[] = '>';  $replace[] = '';
        $search[] = '<';  $replace[] = '-';
        $search[] = '|';  $replace[] = '-';
        $search[] = ':';  $replace[] = '-';
        $search[] = '$';  $replace[] = '-';
        $search[] = '(';  $replace[] = '-';
        $search[] = ')';  $replace[] = '-';
        $search[] = '^';  $replace[] = '-';
        $search[] = '[';  $replace[] = '-';
        $search[] = ']';  $replace[] = '-';
        $search[] = '..';  $replace[] = '';
        $search[] = '?;  $replace[] = 'o';
   
   
        foreach($search as $key=>$char )
        {
            $string = str_replace($char, $replace[$key], $string);
        }
        
        // TODO FIXME is this valid in all charsets ???
        if ($strict == 'strict')
        {
            $string = str_replace('-', '_', $string);
            $string = str_replace("'", '', $string);
            $string = strtr($string,
                            '懒旅呐噌忏溴矣哉重蝮趱鲽壬仕栝觌晴掏蜗祉铒仝圮??疡',
                            'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');
        }
   
        return $string;
    }


  1、最后面一段,是用在严格的匹配场合,这个很容易就把汉字过滤掉,所以最好还是禁用提它。但是整个1.8.11源码里面,只有两处地方使用strict,一个是上传图片时,一个是wiki中,另一个是work上传作业,所以还可以把那几个strict去掉。
  去掉后的安全性对于汉字来说,应该影响不大。

  2、$search()和$replace最后一行是个冷门的字符,并且$search里还很容易把右边的单引号吃掉。切换到二进制模式下看,前面的字符是B0,也就是十进制的176,对应的字符是“摄氏度”左边的小圆圈;第二个字符是6F,也就是十进制的111,也就是“o"(opqrst的第一个)。
  这样就会把所有的B0换成"o",所以如果你仔细看乱码的部分,总能看到一个“o”的字样。所有字符编码是B0的字都会被吃掉,常见的有:
“氚窗靼劝陌蛋栋钒赴拱喊浒及话岚桨景堪腊莅冒前砂寻野郯拾蜂前税邪习伟园影职装桶涟”等。
  对于汉字来说,必须注释掉最后一个$search()。

  3、由于Claroline的作者用法语,而法语使用扩展的ASCII,所以他们更注意了他们的安全,而没有考虑到多位语言编码的问题。其实对于多位编码来说,扩展的ASCII特殊字符不存在威胁,因为只要它出现,就会被当成一个多字节的字来对待。(此条仅是个人观点!)

[ 本帖最后由 lsstarboy 于 2009-4-25 22:43 编辑 ]
作者: lsstarboy    时间: 2009-04-25 19:37
十二、让“辅导员”有查看课程统计的权限

  我们经常需要让“辅导员”可以查看学生的做题情况,但是Claroline默认只允许“课程管理员”查看。我们正常情况下都是一个人备课,多个人使用,为了保证课程的完整性,最好不要任命多个管理员,而是任命多个“辅导员”,所以有必要为“辅导员”加上“课程统计”的权限。

 1、查看统计主要是修改claroline/tracking里的文件,最主要的特征是:claro_is_course_manager(),这样就严格限制了“课程管理员”才能查看统计。可以把它修改为:claro_is_course_tutor() || claro_is_course_manager(),这样就同时允许了两个组的成员访问“课程统计”。

 2、在tracking里的文件基本上都需要修改。

 3、还需要为每个课程建立一个“课程统计”的链接,默认“辅导员”也是看不到这个链接的,需要在工具栏里加上一个。方法见下帖。
  

[ 本帖最后由 lsstarboy 于 2009-4-25 22:46 编辑 ]
作者: lsstarboy    时间: 2009-04-25 21:53
十三、添加工具栏(左侧栏)

 (一)工具栏(左侧栏)分析

  1、需要三个工具栏的数据表和三个权限表:

    三个工具栏相关的表共同决定哪些工具栏在课程里可见:

    course_tool:这里面是工具栏的名称、类型
    module:相关的链接,启用不启用
    _tool_list:针对每个课程的工具栏设置,可以单独设置显示还是不显示。

   下面这三个权限表组合起来用,共同决定对哪些用户显示工具栏。

   right_action:这里面的记录数正常情况是course_tool记录数的两倍,为每个tool做了两个动作:read和edit。其中有个tool_id,就是对应于course_tool里的id,如查自己添加了工具栏,那么别忘了在这儿添加上对应于profile为4(即课程管理员)的两个动作。
   right_profile:这里面存放的其实就是用户组:匿名、注册用户、课程学员、课程管理员。还有自已定义的用户组,我自定义了“教师”组,用来管理学生。这个表只有profile_id字段和下个表有关系,就是对应于某个课程不同组的权限。
   right_rel_profile_action:这个就是权限表。通过profile字段和right_profile表发生联系;通过action_id字段和right_action表发生联系;通过course_id和course表发生联系,也就针对某个课程的权限。

  2、既然是工具栏,所以在module里的type属性必须是tool,否则不会出现。(这是工具栏和小程序applicate的区别,小程序在页面的某个地方,比如标题栏左边)

  (二)工具栏查询的源代码,可以看出工具栏三个数据表的关系:

 
// find module or claroline existing tools

        $sql = "SELECT DISTINCT ctl.id            AS id,
                      pct.id                      AS tool_id,
                      pct.claro_label             AS label,
                      ctl.script_name             AS external_name,
                      ctl.visibility              AS visibility,
                      IFNULL(pct.icon,'tool.gif') AS icon,
                      ISNULL(ctl.tool_id)         AS external,
                      m.activation ,
                      m.name                      AS name,
                      IFNULL( ctl.script_url ,
                              pct.script_url )    AS url
               FROM `" . $tbl_course_tool_list . "` AS ctl,
                    `" . $tbl_module . "`           AS m,
                    `" . $tbl_tool_list . "`        AS pct

               WHERE pct.id = ctl.tool_id
                 AND pct.claro_label = m.label
                 ". ($active ? " AND m.activation = 'activated' " :"") . "
               ORDER BY external, pct.def_rank, ctl.rank";


    所以如果要添加一个新的工具栏,必须满足那三个相等的条件。

  (三)添加工具栏的步骤

  1、在course_tools里添加好一个工具栏,下面是两个示例:
id         claro_label        script_url icon def_access        def_rank        add_in_course        access_manager
                 1        CLDSC        index.php         info.gif         ALL         1        AUTOMATIC        COURSE_ADMIN
                 2        CLCAL        agenda.php        agenda.gif        ALL         2        AUTOMATIC        COURSE_ADMIN

  第一个字段是ID,可以让数据库自动处理;第二个字段是为工具栏起的名字,注意要唯一,要记住,后面还要用;第三列是工具栏所对应的文件名,注意相对路径是:claroline/module/工具栏名/。如果要链接到claroline的其它目录,最好还是做一个符号连接;然后就是icon,这是图标。

  2、在module里加入对应的名称:
id         label         name            activation         type         script_url
                1         CLDSC         Course description         activated         tool         index.php
                 2         CLCAL         Agenda             activated         tool         agenda.php

  第二个字段的名要和上个表的claro_label对应;name填写一个显示的名称,可以直接用汉字;activation要启用,如果不启用,也要以到系统模块里设置启用。

  3、需要加入课程的tool_list,注意每个课程都需要单独加入:
id         tool_id         rank         visibility         script_url         script_name         addedTool
                 1           1          1             1         NULL         NULL         YES
                 2           2          2              1         NULL         NULL         YES


  这里的第二列对应于第一个表中的id;visibility列是决定显示还是不显示。

  这样就加完了一个工具栏,课程管理员已经可以看到了。

  4、设置三个权限表。
    根据上面的分析,很容易把这个权限表做出来:
    (1)为加入的tool在right_action里做两个action,一个是read,一个是edit。
    (2)进入课程,应该可以看到这个工具栏的。


  5、问题:如果想把内容连接到course文件夹里的一个文件,默认的工具栏是在modules文件夹里,所以要建一个符号链接,这样才能找到文件。

 (四)最有权威的步骤应该参考:
claroline\admin\module\module_list.php的exInstall部分。它引用了:
claroline\inc\lib\module.manage.lib.php,详见:
register_module_tool()函数和install_module()的7个步骤。

[ 本帖最后由 lsstarboy 于 2009-4-26 16:17 编辑 ]
作者: lsstarboy    时间: 2009-04-26 15:45
十五:工具安装磁盘空间计算的Bug:

  在module下做了一个链接后,发现无法再安装新的工具了,总是提示“不能解压文件”。
  下面是安装的步骤:

  1、由claroline\admin\module\module_list.php,200行左右
 
  if( false !== ($modulePath = get_and_unzip_uploaded_package()) )
                }


  2、get_and_unzip_uploaded_package在claroline\inc\lib\module.manage.lib.php里225行,后面调用了fileUpload.lib.php文件的treat_uploaded_file(),而treat_uploaded_file()又调用了同一文件内的enough_size(),再调用dir_total_space():

function dir_total_space($dirPath)
{
    chdir ($dirPath) ;
    $handle  = opendir($dirPath);
    $sumSize = 0;

    while (false !== ($element = readdir($handle) ) )
    {
       if ( $element == '.' || $element == '..')
        {
            continue; // skip the current and parent directories
        }

       if ( is_file($element) )
        {
            $sumSize += filesize($element);
        }

       if ( is_dir($element) )
        {
            $dirList[] = $dirPath.'/'.$element;
        }
    }

    closedir($handle) ;


  可以看出,它把link类型的文件也算了进去,这是不合理的。所以需要在处理“.”和“..”的语句里加上一个is_link():

function dir_total_space($dirPath)
{
    chdir ($dirPath) ;
    $handle  = opendir($dirPath);
    $sumSize = 0;

    while (false !== ($element = readdir($handle) ) )
    {
       if ( $element == '.' || $element == '..' || is_link($element) )
        {
            continue; // skip the current and parent directories
        }

       if ( is_file($element) )
        {
            $sumSize += filesize($element);
        }

       if ( is_dir($element) )
        {
            $dirList[] = $dirPath.'/'.$element;
        }
    }

    closedir($handle) ;

[ 本帖最后由 lsstarboy 于 2009-4-26 15:56 编辑 ]
作者: lsstarboy    时间: 2009-04-27 16:41
十六:在学习路径中,如果中途点击了“全屏”,那么题目会跳到第一个去,并且是未做的状态。

  原因:learnPath\navigation\viewer.php
1、24-27行,修改USE_FRAMES为零,可以把默认的属性改为全屏:
// the following constant defines the default display of the learning path browser
// 0 : display only table of content and content
// 1 : display claroline header and footer and table of content, and content
define ( 'USE_FRAMES' , 0 );


2、本文最后一段,$displayFrames有两个来源,一个是默认的值,也就是上面的那个值,另一个是从网页传递过来的值,也就是用户点了“全屏|在框架中”的链接传递过来的参数。但是这个不论是哪一种值,都重新去显示一个新的startModule.php,而startModule.php里没有判断用户是不是正在进行练习,所以就造成了每次点击“全屏|在框架中”链接的时候,都会从第一题开始。
if( $displayFrames )
{
?>
&nbsp;&nbsp;&nbsp;&nbsp;<frameset border="0" rows="150,*,70" frameborder="no">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<frame src="topModule.php" name="headerFrame" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<frame src="startModule.php" name="mainFrame" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<frame src="bottomModule.php" name="bottomFrame" />
&nbsp;&nbsp;&nbsp;&nbsp;</frameset>
<?php
}
else
{
?>
&nbsp;&nbsp;&nbsp;&nbsp;<frameset cols="*" border="0">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<frame src="startModule.php" name="mainFrame" />
&nbsp;&nbsp;&nbsp;&nbsp;</frameset>
<?php
}

  解决:待定。设想:(1)可以在startModule.php中添加一个用户是不是正在进行练习的判断
           (2)可以把三个frame都显示,但是全屏时把另外两个都隐藏,只剩下一下。这种功能可能需要js的支持。

[ 本帖最后由 lsstarboy 于 2009-5-8 21:48 编辑 ]
作者: lsstarboy    时间: 2009-05-08 22:11
十七、模块说明:manifest.xml
  每一个模块必须有一个说明文件,这是安装文件的依据,其实像“练习”“课程讲义”“学习路径”等,都是一个标准的模块,和普通模块的区别在于它们不在module目录里,而在系统目录里,所以这些模块也不能不删除和禁用的(可以在系统管理的模块管理里面查看)。
  下面是“学习路径”的模块说明,用xml写的,应该很好懂。

<module>
  <label>CLLNP</label>
  <name>Learning path</name>
  <version>1.0</version>
  <license>GPL</license>
  <icon>learnpath.gif</icon>
  <type>tool</type>
  <web>http://www.claroline.net/wiki/CLLNP/</web>
  <entry>learningPathList.php</entry>
  <description>
  <![CDATA[
     This tool is an original tool of claroline.
     It's able to ordering course step.
     Each step can be a text, a document or a qwizz.
     This tool can read ane write SCORM
  ]]>
  </description>

  <author>
     <name>Claro team</name>
     <email>devteam@claroline.net</email>
     <web>http://www.claroline.net/</web>
  </author>

  <requirements>
    <claroline>
      <version>1.8</version>
      <configuration>
      </configuration>
    </claroline>
</requirements>

</module>

作者: lsstarboy    时间: 2009-05-09 16:26
十八、练习分析

  本来应该和第十六帖放在一起,但内容偏多,所以单开一个帖:

  1、答案存放在哪儿?下面是练习的excerse_submit.php的面页源代码(注:是浏览器看到的html源代码,不是服务器端php的源代码),习题做到第11题:
<!-- 3 -->
<input type="hidden" name="a_3" value="5" />

<!-- 3(end) -->

<!-- 4 -->
<input type="hidden" name="a_4" value="10" />

<!-- 4(end) -->

<!-- 5 -->
<input type="hidden" name="a_5" value="16" />

<!-- 5(end) -->

<!-- 6 -->
<input type="hidden" name="a_6" value="19" />

<!-- 6(end) -->

<!-- 7 -->
<input type="hidden" name="a_7" value="TRUE" />
<!-- 7(end) -->

<!-- 8 -->
<input type="hidden" name="a_8" value="22" />

<!-- 8(end) -->

<!-- 9 -->
<input type="hidden" name="a_9" value="28" />

<!-- 9(end) -->

<!-- 10 -->
<input type="hidden" name="a_10" value="FALSE" />
<!-- 10(end) -->

<!-- 11 -->
<input type="hidden" name="a_11" value="31" />

<!-- 11(end) -->

<!-- 12 -->
<input type="hidden" name="a_12" value="36" />

<!-- 12(end) -->
<tr class="headerX">
<th>习题 11 / 88</th>
</tr>


  可以看出,前面做题的答案,没有直接传到数据库中,而是包含在页面的html源代码中,均用不显示的一个控件来记录。这样有个好处,不用频繁地更新数据库,节省服务器资源,但是直接带来的一个坏处,如果网络不稳定,遇到某一个题打不开的情况,前面所有的努力都要重来。
  其实从系统的追踪成绩数据库也可以看到这一点,在没有点击提交答案之前,数据库(track_e_exe_details)里是没有成绩的。
  习题答案的设置主要是用Question类来完成的,在exercise\lib\question.class.php里定义。

  我认为答案放到SESSION中要比较好一些,这样既可以记录下每次的答案,而且在网络出现问题时还可以从出问题的题目开始,避免了重复劳动。

  2、题目内容放到哪儿?
  题目在SESSION中,只要一点击开始练习,那么每道题都记录到SESSION中,同理,这是为了减少数据库的查询。
下面内容是其中的一道是非题,是第5道:
[4]=>
    string(993) "O:8:"Question":12:{s:2:"id";i:7;s:5:"title";s:105:"一般来说,矢量图像的文件容量比较小,图像在放大或者旋转等操作是不会失真";s:11:"description";s:31:"<!-- content: html tiny_mce -->";s:10:"attachment";s:0:"";s:4:"type";s:2:"TF";s:5:"grade";s:1:"2";s:14:"questionDirSys";s:70:"/usr/local/www/nginx-dist/claroline/courses/ZSF01/exercise/question_7/";s:14:"questionDirWeb";s:45:"/claroline/courses/ZSF01/exercise/question_7/";s:6:"answer";O:15:"answerTrueFalse":10:{s:2:"id";i:1;s:10:"questionId";i:7;s:12:"trueFeedback";s:0:"";s:9:"trueGrade";s:1:"2";s:13:"falseFeedback";s:0:"";s:10:"falseGrade";s:1:"0";s:13:"correctAnswer";s:4:"TRUE";s:8:"response";s:0:"";s:9:"errorList";a:0:{}s:9:"tblAnswer";s:28:"c_ZSF01_qwz_answer_truefalse";}s:17:"tmpQuestionDirSys";s:76:"/usr/local/www/nginx-dist/claroline/courses/ZSF01/exercise/tmp49f648773ae5a/";s:11:"tblQuestion";s:20:"c_ZSF01_qwz_question";s:22:"tblRelExerciseQuestion";s:33:"c_ZSF01_qwz_rel_exercise_question";}"


  3、学习路径的帧分析:

  “学习路径”最主要的是startModule.php帧,如果不是全框架模式中,还有一个头帧,一个尾帧。它本身有两个帧:tableOfContent.php是左侧的学习路径列表;还有一个名为scoFrame帧,就是右侧占80%面积的那个主要操作区域,如果是练习,就是excerse.php,如果是讲义,就是documents.php。

  4、成绩追踪:最主要的是track_e_exe_details,只要是提交了答案,那么无论答案是对是错,也不论你做了几道题,都在这个表中建了对应的记录。比如共有100道题,那么只要提交一次答案,那么这个表中就会多100条记录。
  track_e_access:是记录的是追踪的用户ID和追踪号的关系;track_e_exercices记录了用户所用的时间,开始的时间,用户ID,成绩,还有最重要的一个是“练习序号”。简单解释一下“练习序号”:上面的例子中,提到的track_e_exe_details为每次练习都建立了100条记录,那么不同的用户就有不同的100条记录,怎么样来区分哪个100条记录是A用户,哪个100条记录是B用户的呢?就是根据这个“练习序号”。

[ 本帖最后由 lsstarboy 于 2009-5-9 16:48 编辑 ]
作者: lsstarboy    时间: 2009-05-10 17:05
十九、课程中的注册用户

  乍看上去没什么问题,但是细考虑,就会发现有许多问题:
  (1)用户重复加入时会出现什么情况?
  (2)作为班级加入的时候,和普通的用户自行注册的情况有什么不同吗?
  (3)如果用户自己加入了课程,而班级又要加入时。
  (4)用户在不同的班级,两个班级都加入了同一个课程。
  (5)删除的时候,如果用户加入了很多次,是一次全删除呢?还是保留一定的加入权限?

  其实在用户列表里,有时候要删除很多次才能把一个用户删除掉,有很多人以为这是一个Bug,其实这就是基于上面的问题的考虑。

  先看一下课程的用户数据库:在主数据库中的cours_user:
字段          类型                          整理         
code_cours         varchar(40)         utf8_unicode_ci  //课程代码
user_id            int(11)                 UNSIGNED     //用户id
profile_id           int(11)                         否                      //用户的类别
isCourseManager         tinyint(4)                         否          //是不是该课程的管理员
role                         varchar(60)         utf8_unicode_ci  //角色
team                int(11)                         否                         //没找到用途
tutor                 int(11)                         否                   //是不是“课程”辅导员(还有一个是“组辅导员”,很容易混淆。)
count_user_enrol         int(11)                         否              //用户自行加入的次数
count_class_enrol         int(11)                         否            //因为班级加入的次数

  最后两个字段,就是用户加入的次数。只要加入一次,相应的字段就加1,删除时每次按两种情况分开减1,直到两者之和<=1时才删除。

  添加用户和删除用户的函数可以参看:course_user.lib.php里的function user_remove_from_course()和user_add_to_course()。

  最后再提醒:如果一个班级都加入某个课程,那么整个班级的所有成员都自动进入该课程。

  建议:应该设置一个“班长”或者“班级辅导员”。


[ 本帖最后由 lsstarboy 于 2009-5-10 17:08 编辑 ]
作者: lsstarboy    时间: 2009-05-10 17:29
二十:使用“班级”发挥作用,在工具栏里添加“班级查询”工具——设想方案:

  1、需求分析:几个班同时上课的时候,在成绩统计中很不方便,因为几个班的学生都混在一起,不方便老师的查看,同时把所有的练习成绩分析都混在了一起,不能很好地反映某个班的整体水平。
  虽然老师可以在练习前把练习结果清空,但是这样会清空所有学生的练习结果,会把其他班级的学生成绩一起清空。
  2、作用:
  (1)为每个班添加一个“班级辅导员”,也就是教师。但是虽然是老师,但是对课程不一定有编辑使用的权利。
  (2)每个班相当于一个“组”的地位,有自己的聊天室、讨论区和讲义区,方便老师根据课程本身的内容进行发挥和补充。
  (3)“班级辅导员”可以查看成绩统计,了解学生的成绩情况和习题集的得分情况。(最好可以把很多次的成绩进行汇总。)
  3、角色层次:
  这样修改之后,Claroline变成了三级角色:课程管理员、课程辅导员和普通用户;组辅导员和组员;班辅导员和班成员。其中课程管理员和课程辅导员可以有多个,但是组辅导员和班辅导员只设一个。
  班级管理可以仍旧由平台管理员来管理,因为辅导员只负责教学,不负责人事。^_^
  4、需要修改的地方:
  (1)添加一个工具。
  (2)修改所有和“班级”有关的文件,特别是inc/lib/class.lib.php里关于班级添加、删除、修改等内容。
  (3)修改claro_init_local.inc.php,添加一个“班级”的SESSION,以及判断是不是“班级辅导员”的函数。
  (4)依照group,做工具的具体实施。

[ 本帖最后由 lsstarboy 于 2009-5-10 17:43 编辑 ]
作者: lsstarboy    时间: 2009-05-20 22:17
二十一、Claroline1.9正式版,日历事件显示乱码:

  原因:日历用utf-8编码。

  解决方案:所有编码都用utf-8编码,这样最省事,免得有些字打不出来。
作者: lsstarboy    时间: 2009-05-20 22:21
二十二、在经过内部端口映射的服务器中,短消息会导致域名解析错误,比如在nginx做的反向代理中会解析到"_"等泛域名的设置。

  /inc/lib/display/banner.php,第251行:

$userToolUrlList[]  = '<a href="'
                . get_path('clarolineRepositoryWeb')
                . 'messaging" target="_top">'
                . get_lang('My messages').'</a>'
                ;   


可以直接在messaging后面加上"/index.php“。

------------------------------------------------------------------------
--下面可以解决内网的访问,还不能解决wiki解析到内网IP的问题。
注:现查明是nginx的问题,由于nginx按正规规则来解析php,但是一般的配置脚本里都只写 \.php$的规则,这样将导致没有.php的访问不解析到php中,所以造成访问不正常。解决的方法是在nginx.conf里加上一个指向网站域名或路径的规则,比如:
        location ~ //claro {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /web$fastcgi_script_name;
            include        fastcgi_params;
        }

受此影响的还有wiki的主题。


-----------------------------------------------------------
wiki解析到内网IP:
wiki/lib/lib.javascript.php里有个定义,直接用HTTP_HOST,导致是内网IP。
    function document_web_path()
    {
        return "http://" . $_SERVER['HTTP_HOST'] . dirname( $_SERVER['SCRIPT_NAME'] );
    }

考虑到一般浏览器都可以解析到相对路径,还是直接用dirname的那一段吧。

[ 本帖最后由 lsstarboy 于 2009-5-21 22:13 编辑 ]
作者: lsstarboy    时间: 2009-06-19 12:24
二十三、Claroline模块编写规则:

1.文件结构:

  conf/def/:配置文件,包括默认值的配置项目要求
  css/       :可选的css目录
  setup/  :数据库的安装与卸载脚本
  lang/  :语言文件,可以实现多语言模块
  manifest.xml:模块信息文件

2.manifest.xml
  以下通过“在线人数”模块的manifest.xml来说明,采用PHP的注释方法:

<module>                                                             //------模块说明开始
  <label>CLONLINE</label>                                 // --------模块的名称,是模块的唯一标识,用来区分模块名和创建目录
  <name>Who is online</name>                         // --------模块的说明,显示在模块管理等里面
  <version>0.2</version>                                   // --------模块版本
  <license>GPL</license>                                   // ---------模块所遵循的协议
  <default_dock>userBannerRight</default_dock>   // --------模块所在的位置,仅对applet类型有效,
                                                                           // --   对于tools类型和adminitrator类型无效
  <type>applet</type>                                      // --  类型,目前claroline有三种类型:tool=》显示在课程的左侧栏,
                                                                          //                     和“课程练习”“学习路径”等并列。
                            //  applet:小程序类。共有13个位置,可以在模块管理的配置里查询
                                                   //   administrator:管理类,和小程序相似,但是只有一个显示位置:平台管理里。
  <web>http://www.claroline.net/wiki/CLONLINE/</web> // ---------模块网址

  <description>                                                  // --------描述,一个关于本模块的简短说明
    This plugin allow to know who is online on the platform
  </description>

  <author>                                                       // -------- 作者信息:
     <name>Claroline team</name>
     <email>info@claroline.net</email>
     <web>http://www.claroline.net</web>
  </author>

  <requirements>                                           // -------- 系统要求:
    <claroline>
      <version>1.8</version>
    </claroline>
</requirements>
</module>

3.配置文件规则:
  还以上面的为例,但是只取其中的一部分:
$conf_def['config_code'] = 'CLONLINE';       // -------- 模块名,要和manifest.xml里定义的名称相同,也就是模块的唯一标识
$conf_def['config_file'] = 'CLONLINE.conf.php';      // -------- 配置文件名,这个文件创建到platform/conf/里
$conf_def['config_name'] = 'Who is online';           // -------- 配置说明

$conf_def['section']['main']['label']      = 'Main';    // --------- 配置的标签名,正常情况为mail即可,在配置是显示“主要配置”。
$conf_def['section']['main']['description']= '';       // --------- 配置的说明,显示在标签名下
$conf_def['section']['main']['properties'] =          // ------  配置属性,也就是配置项目,些例为一个属性,即“刷新时间”。
array ( 'clonline_refreshTime'     
       );

$conf_def['section']['display']['label']      = 'Display';  // -------- 增加了一个“显示”配置标签
$conf_def['section']['display']['description']= '';         //  -------- 说明
$conf_def['section']['display']['properties'] =             // --------  共定义了四个属性。下面的
array ( 'showUserId'
      , 'showEmail'
      , 'showStatus'
      , 'usersPerPage'
      );

// MAIN                                      // -------- 以下逐个定义上面所指的属性,第一个定义main标签里的“刷新时间”。
$conf_def_property_list['clonline_refreshTime'] =     
array ( 'label'       => 'Refresh time'                // --------- 选项名:
       , 'description' => '5 is a good value for this. (Minimum 1 minute; Maximum 60 minutes)'
                                                                      // ------ 选项说明,就是显示在选择右边的文字部分,注意这部分可以被换成其它语言,
                                                                     //语言转换在Claroline是自动的,不需要单独处理。
       , 'default'     => '5'                                 // -------- 默认值,注意整数型也要带引号,否则会出错。
       , 'unit'        => 'minutes'                        // -------- 单位:(!!没找到原型!!)
       , 'type'        => 'integer'                        // -------- 类型:有string、integer、multi、wwwpath、preg等类型,在config.lib.php里有定义
        ,'acceptedValue' => array ( 'min'=> 1  // 接受的值,最小是多少,最大是多少,如果是preg类型,还可以使用正则表达式
                                  , 'max'=> 60)      
       );
......                                                             // ---------- 下一个属性

4.lang文件
  lang文件和系统里的lang格式一样,但是不需要另建目录,如果是中文,文件名如下:
     lang_simpl_chinese.php
     英文语言可以写做:
     lang_english.php

  文件内的语法和lang里的格式相同。

5.数据库文件:
    还是上面模块,首先是install.sql
CREATE TABLE IF NOT EXISTS `__CL_MAIN__user_online` (         
  `id` int(11) NOT NULL auto_increment,                                      // -------- 定义数据库
  `user_id` int(11) NOT NULL default '0',
  `last_action` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

// __CL_MAIN表明是建立在主数据库里,而不是建立在课程里,建立在课程里前缀写作:__CL_COURSE

uninstall.sql只有一句,大家都能看懂:

DROP TABLE IF EXISTS `__CL_MAIN__user_online`;

[ 本帖最后由 lsstarboy 于 2009-6-19 21:09 编辑 ]
作者: lsstarboy    时间: 2009-06-23 00:15
二十四、Claroline1.9模板分析:

  Claroline1.9版实现了模板的设计,让广大claroline爱好者终于又增加了点底气,特别是对于喜欢玩美工的用户,从今开始,Claroline不再会只是单一的界面,而是可以像phpbb和joomla!一样,由爱好者来设计各种眩目的主题和皮肤了。

  但是需要泼点冷水,如果你玩过华丽、易用的皮肤,不要对模板寄于太大的希望,它的模板只是实现了它的基本功能,并且还没有完全从php代码中脱离出来,只是提供了一个简单的方法来修改界面。

  修改Claroline的界面显示可以通过CSS样式表来完成,这是Claorline最直接的主题,Claorline很早的版本就支持这种修改,并且在1.8版中还有很多官方提供的主题,它的修改在1.9版中只是改了一下位置,改到web/css中,一个文件夹就是一个主题,可以直接复制出来修改,本人基本上是CSS陌,所以只是简单提一下,不再班门弄斧了。下面就只说一下claroline1.9中模块的规则。

1、使用的规则:

  (1)定义一个CoreTemplate类,并同时指定一个模板名称,下面是claroline首页的源代码:
      
$template = new CoreTemplate('platform_index.tpl.php');

                类CoreTemplate代表一个template的操作集合,它在inc/lib/display/phptemplate.lib.php里定义,是PhpTemplate类的一个扩展。
      扩展时只加了一个构造函数,从构造函数可以看到claroline在寻找模拟文件时的顺序:
$customTemplatePath = get_path('rootSys') . '/platform/templates/'.$template;

      
        包含platform/templates里的文件,这里是用户自定义的模板文件
$defaultTemplatePath = get_path('includePath') . '/templates/'.$template;

        
      
        包含inc/template里的文件
if ( file_exists( $customTemplatePath ) )
        {
            parent::__construct( $customTemplatePath );
        }

      
        如果存在用户自定义的模板
elseif ( file_exists( $defaultTemplatePath ) )
        {
            parent::__construct( $defaultTemplatePath );
        }

      
        如果存在系统自带的模板
else ......

        如果两者都不存在
  从上面的代码可以看出,claroline在寻找模板的时候,先到用户自定义模块目录去找,用户自定义模板要放到网站根目录 /plateform/templates 下。在系统自带的模板文件中,claroline也有一个声明说,如果用户有自定义的模块,建议放到/plateform/templates下,这样可以保证在升级时不丢失所做的修改。

  从上面的代码还可以看出,$template应该可以带目录符号,仅仅是从代码推测,还没有进行测试。

   (2)指定类的属性变量:
例如:

$my_html_cont = '<a href="http://www.sdcangyuan.com">sdcangyuan</a>' ;  
$template->assign("my_html",$my_html_cont);


  $template就是上个步骤里的那个对象实例,这个调用的是PHPTemplate类的方法,可以自定义一个属性,基本上原理和smarty差不多。
  assign变量要求第一个参数为字符型,第二个参数可以是任意类型。
  
  来看一下assign函数:

    public function assign( $name, $value )
    {
        $this->$name = $value;
    }


  assign函数很简单,只有一句,为本类添加一个变量,变量名为$name,变量值为$value,按照php的语法,这个地方的name应该是字符型的,并且不能带$,因为带了$就会被php解析为变量。

  (3)使用
  在使用的时候很可能会令很多人失望,其实从上面的assign函数也可以看出,PhpTemplate根本没有对变量进行处理,如果继续向后看,也不存在关于$name的处理语句,我认为主要有两个原因:第一,它不知道最终的$name是什么,因为是传递过来的字符串作为变量名;第二,它不知道你到底要对$name进行哪方面的操作,所以,还是不处理为好,具体的处理到模板中再说。这一点和smarty有点区别。

  由于模板类没有对变量进行处理,所以就必须在用的时候进行处理,来看一下模板中的应用:
<?php echo $this->my_html; ?>


     怎么样?还是有点php的感觉吧。因为在模板文件中,除了html代码外,基本上到处都是<?php和?>,可以看一下 plateform_index.tpl.php,初次看的时候就一个字:乱。看习惯了倒觉得还可以,但是也不如看smarty的模板舒服。
  至于用法.......不懂php还真不好办,但也有个好处,遇到循环、判断等语句时,直接写php,跟不在模块里的情况一样。
  也有坏处,只能一直echo下去......

  2、实现的功能
  个人认为,模板的设计有三个方面的作用:
  (1)使设计模板成为可能:虽然功能不是很强,代码和html也不是很好地做到分离,但毕竟向前跨出了一大步。
  (2)增加了缓冲的功能,由于在类的实现里,用了ob_start等输出缓冲函数,可以大大提高网页的速度,同时还可以为静态化输出做好了基础。
  (3)实现简单,速度也比较快,基本上就是“原装”的PHP语句,没有语法分析等步骤,应该基本上可以保证速度。

  关于模板的处理,基本上体现的Claroline开发组“以实用为主”的思想,没有采用现成的模板,而是自己简单地实现了一套(对模板系统不熟悉,或者是借用的某一套?),对于懂点php的用户来说,应该也不是很困难。

  完整的实例,读一下网站首页的index.php和plateform_index.tpl.php,基本上可以看到使用的方法。
作者: lsstarboy    时间: 2009-06-24 23:12
二十五、导航栏

Claroline的导航栏

  Claroline左上角一大堆导航栏,用的时候可能感觉不到什么,反正挺方便,但是如果真让你说出他们的作用和名字,那恐怕也是一个小小的难题。

  本文先来确定一下他们的名字,再大体上说一下他们的作用,最后再简单探索一下他们的修改。

  1、导航栏各部分的名称

  还是看图吧:
   
  
  (1)平台标题区:
   整个网站的名称,如果设置了logo,高显示logo,如果设置了“上一级部门名称”,则在右侧显示上一级部门的图标。
   需要注意,这个区域会出现其它的小程序(applets模块),在“模块设置”里,给这个区域安排了两个位置,但是在称呼的时候稍微改了名,叫做“campusBannerLeft”(学校左侧区)和“campusBannerRight”(学校右侧区),而不叫“平台左侧区”、“平台右侧区”,也许开发者原始的意图就是把claroline当作一个网校来看待的。小程序会显示在标题的下面,并且会单独占用一行,感觉有点不爽,个人认为它应该到标题的右边去比较合适。

  (2)用户标题区:
  这个区域应该就是“正宗”的导航栏,显示了最常用的几种操作。
  同样,这个区域也有“用户信息左侧栏”(userBannerLeft)和“用户信息右侧栏”(userBannerRight),一个经典的例子,whoisonline(谁在线上)模块默认就显示在userBannerRight区域里。

  (3)课程标题区:
  这个区域显示的是课程的名称、课程代码和创始人。这个区域我感觉最别扭:首先,第一行写的是课程名称,第二行应该是一个简短的说明,本来应该是不错,但是在这区域紧密的地方,那一小行说明显得有点不舒服,它们的地位毕竟和那几行不是一个层次。把它移到课程名称后面,再用小点字体,着色再淡一些,也许更好一点。其次,第二行的第一部分,图上是“EMAIL_WEB”,这是课程代码,但是在下一行仍然有,内容有点重复,所以干脆不如就直接写:课程创始人--XXXX。
  这个也有左侧区和右侧区,当我们进入一个课程后,在右上角有一个下拉的菜单,里面是各种工具的集合,它就处在“课程标题右侧区”里。

  (4)面包屑区:
  初次看它的时候,真的愣了一阵子,不知道为什么叫做“面包屑”区,经过查询,才知道源于一个童话故事,叫“汉泽尔和格雷特尔”,当主人公被后母遗弃到森林里时,他们试图用面包屑找到回家的路。在网页上,当用户深入到网页中很多层时,可以很方便地通过它来返回到上面的任意层中,通常叫做“面包屑导航”区。同时,它还有另外一个好处:可以看到整个网站的构造。
  这个区域的内容随着用户浏览的内容不同而改变。
  另外,这个也有左侧区和右侧区,做过管理员的都知道“学生”和“课程管理员”身份的切换,那个功能就是处在“课程标题右侧区”里。


  2、作用:
  点击平台标志,可以到达网站的首页,如果存在上一级部门网站,可以点击上一级部门图标进入上一级部门的网站。

  用户标题区里是最常用的操作,是整个网站的灵魂部分,并且在除了全屏显示的内容,如“学习路径”外,都一直存在,可以在不同的地方跳转。

  课程标题区可以方便地到达课程首页,同时看到一些简单的课程信息。但在使用的过程中,我很少用它,也许和个人的操作习惯有关。

  面包屑导航区,根据它的含义,可以使用户方便地返回某一个位置,不至于在网站中“迷路”。

  3、修改:
  这四个导航区,1.9版都把它放到一起,放到一个模板文件里,在inc/templates/banner.tpl.php文件里。但是如果你要修改它的话,最好把它复制到/platform/templates目录里。尽量不修改默认的东西是一个好的习惯。
  
    

  在上面的UltraEdit32的截图中,经过语法收缩,可以清楚地看到各个标题区的位置和顺序。如果要修改,展开就可以进行修改。但是如果想完美地修改显示的内容和样式,也许要追踪到它的定义类或者函数里面修改,但对于普通的修改来说,修改这儿,再加上main.css的样式,应该是足够了。

  类定义对于一般的用户没有用,仅自己记笔记了。

[ 本帖最后由 lsstarboy 于 2009-6-24 23:13 编辑 ]
作者: lsstarboy    时间: 2009-06-26 09:53
二十六:Claroline与ucenter整合:

http://wuxc.ntzx.cn/cLUC/claroline_UC.html

claroline与Ucenter整合

http://wuxc.ntzx.cn 江苏省南通中学 吴晓春

一、UC整合的基本原理: (摘自互联网,稍作修改。)

以用户登录为例介绍,其它注销,改密码,注册等均类似。

1、当用户xxx在某一应用程序的login.php,输入用户名,密码。可以login.php适当之处,调用UC_CLIENT目录下的 clint.php中的uc_user_login函数到UC_CENTER验证此用户和密码,如正确,则写入session,写入cookies,并更新应用程序会员表中的登录ip,登录时间。
2、 然后调用uc_user_synlogin通知UC_CENTER 用户xxx登录成功。
3、 UC_CENTER收到登录成功消息后,把xxx登录的消息,发给所有愿意接收(在UC_CENTER 中开启同步登录的其它应用)这个消息的其它应用程序。其实就是带参数访问一下各应用程序的api目录下的uc.php,用户感觉不到这个过程。
4、 各应用程序靠api目录的下的uc.php来接收UC_CENTER发来的消息,并对UC_CENTER言听计从,让干什么就干什么。现在,收到让xxx用户登录命令,马上执行。一般通过写本应用程序的session来实现登录,这需要掌握该应用程序的源码并修改。
5、最后所有与uc整合的程序,xxx均登录成功。用户从一个应用 跳到另一应用,同样显示登录。因为它们在后台均已登录。
6、应用程序与UC_CENTER的会话结束。

二、UC、Claroline、Uchome安装

此处以上Claroline 1.9rc5 与UCenter1.5、uchome1.5整合为例,说明整合的具体代码改写。运行环境为XAMPP for Windows 1.7.1。安装配置、及在UCenter中添加应用等不再赘述,请参见下图。请注意这几个软件统一使用UTF8或GB2312版本。











安装后的目录结构:

在Ucenter中加入应用后,该应用根目录下会有config.ini.php,可以打开仔细观察,看看有没有参数需要手工修改的。

三、代码修改

在 htdocs/claroline/下创建api、uc_client目录及相关文件,亦可从UC给的示例中或uchome目录下复制过来再修改相应文件。在api下创建uc.php文件,它的作用是接收Uenter发过来的消息,并通知claroline完成相应操作。uc_client目录下主要有 clinet.php文件,其作用把向Ucenter发送消息 。

1、从最简单的开始------退出登录

A 前台退出登录:在 htdocs/claroline/index.php的第42行插入三行。


B 后台同步退出:


Claroline接到退出通知,执行 htdocs/claroline/api/uc.php文件中第244~247行的内容,即后台登出。


2、登录:

A 前台登录:

①激活用户:ucenter已有用户账号,而claroline中没有,当前用户第一次登录Claroline,称为激活用户账号。过程是当用户在 claroline界面上输入用户名、密码后,先要能过uc_user_login($login, $password)到Ucenter中验证,若Ucenter验证通过,则认为在登录成功,并把该账号加入到claroline的数据库中完成激活。代码如下:


②通知ucetner及其它应用同步登录:修改 htdocs/claroline/claroline/auth/login.php如下


上述文件中,267行以后代码会调用 claro_redirect()函数,请在htdocs/claroline/claroline/inc/lib/claro_main.lib.php的第1507行修改如下,以便顺利跳转。


B 后台同步登录:接到ucenter通知,执行uc.php中相应代码实现登录。


3、用户注册(同时登录)与激活

A 用户注册,①修改\claroline\auth\imscription.php如下:


这里要注意,默认情况下Ucenter中Email是必填的、而Claroline是可以不填。所以,请以管理员登录到Claroline中“本平台的配置->个人资料”的界面下修改Emai在注册时为必填信息。

请把claroline/inc/lib/user.lib.php的第126行,修改为第127行如下所示:
126 //$sql = "INSERT INTO `" . $tbl['user'] . "`
127 $sql = "REPLACE INTO `" . $tbl['user'] . "`

修改这个语句的作用是确保用户的“userid”在不同的ucenter、claroline中是一样的。

此时,其它应用中如uchome中还不知道有了新用户,当这个新用户第一次登录uchome就激活。

②用户完成注册后,应该同时完成同步登录。请修改imscription.php中的第210到217行,如下。

B 激活

当用户在Ucenter中注册或uchome中注册了,在第一次登录到Claroline时激活(用户账号会加入到Claroline的用户表中)。

4、管理员添加用户

管理员添加用户,与用户注册相类似。请修改claroline\claroline\admin\adminaddnewuser.php的第77行到103行,如下

同样,其它应用通过激活来完成这个新用户的添加。



5、用户信息修改

A Claroline->Ucenter :管理员或用户自己都可修改个人信息,分别在文件claroline\claroline\admin\adminprofile.php的 167~184行及claroline\claroline\auth\profile.php的199~215行。内容相近,如下:

B Ucenter->Claroline:在Ucenter端修改用户名或密码,通知Claroline作相应修改。在uc.php中,如下:

注意,默认情况下,Ucenter系统(ucenter、uchome、discuz等)中密码是保存在Ucenter中的,登录验证仅在 ucenter中进行。修改密码后也不通知其它应用(如uchome等),如下所示,上半段是ucenter\control\admin \user.php的代码;下半段是uchome\api\uc.php的代码。

上半段修后的291行,完成了ucenter向uchome、claroline等应用传递新的密码明文。claroline就可接收并修改,而uchome忽略。

同时,Ucenter\control\user.php的第99~101行作同样修改。

6、删除用户

A Claroline->Ucenter :在Claroline删除用户,并通知Ucenter,如下修改两个文件。

B Ucenter->Claroline :仅有思路:先用代码模拟管理员登录Claroline,再用@fsockopen()函数调用 claroline/claroline/admin/adminuser.php?cmd=delete&user_id=$_uid& amp;offset=0来实现,未最后成功。代码如下:

} elseif($action == 'deleteuser') {

!API_DELETEUSER && exit(API_RETURN_FORBIDDEN);

$_uid = 1;
$_username='admin';
$_password='mzdmzd';
//模拟登录的代码,请参见uc.php的第110行。

$_uid = $get['uid'];
echo get_page_content_get("http://192.168.8.20/claroline/claroline/admin/adminuser.php?cmd=delete&user_id=“.$_uid.”&offset=0";

function get_page_content_get($url){
$url = eregi_replace('^http://', '', $url);
$temp = explode('/', $url);
$host = array_shift($temp);
$path = '/'.implode('/', $temp);
$temp = explode(':', $host);
$host = $temp[0];
$port = isset($temp[1]) ? $temp[1] : 80;
$fp = @fsockopen($host, $port, &$errno, &$errstr, 30);
if ($fp){

@fputs($fp, "GET $path HTTP/1.1\r\nHost: $host\r\nAccept: */*\r\nRefererurl\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\nConnection: Keep-Alive\r\n\r\n";
}
$Content = "";
while ($str = @fread($fp, 4096)){
$Content .= $str;
}
@fclose($fp);
return $Content;
}

exit(API_RETURN_SUCCEED);

}

好了,就完成了这些。请高手指导。

[ 本帖最后由 lsstarboy 于 2009-6-26 10:04 编辑 ]
作者: lsstarboy    时间: 2009-06-30 10:48
二十七、1.9.1版中图片显示的两个BUG

表现:

1、在“课程讲义”里浏览图片时,图片导航的“上一幅图片”和“下一幅图片”被放到页面的顶端。

2、遇到某些中文的图片和路径时,会出现找不到或者是乱码的错误。

原因:

1、document.php中,相关的语句,从1658-1677行:

$out .= '<tr class="toolbar" valign="top">' . "\n";

// --------------------- display link to previous image ------------------

display_link_to_previous_image($imageList, $fileList, $current);

// --------------------- display title of current image ------------------

$out .= '<th class="' . $titleStyle . '">' ."\n"
.    $imgTitle
.    '</th>' . "\n"
;

// --------------------- display link to previous image ------------------

display_link_to_next_image($imageList, $fileList, $current);

$out .= '</tr>' . "\n"
.    '</table>' . "\n"
;

display_link_to_previous_image和display_link_to_next_image都在inc/lib /image.lib.php里定义,两个函数都直接使用echo,而不是采用return $html的形式,所以造成这两个提前显示。

解决办法:把这两个函数改为$html返回的形式,再把值赋给$out就可以了。



2、Claroline1.9.1版重新写了编码部分,为了防止某些恶意程序的侵入,把请求的url编码不再使用urlencode,而是使用base64_encode,然后在document.php里再还原文件名。

编码语句,inc/lib/image.lib.php,338行左右:
echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?docView=image&file="
. base64_encode($prevName) . "&cwd=" . $curDirPath
. $searchCmdUrl . "\">", "&lt;&lt; " . basename($prevName) . "</a>\n"
;


这句直接把“上一个图片名”用base64编码,输出到网页。

解码语句:documents.php,185行:

if ( isset($_REQUEST['file']) /*&& is_download_url_encoded($_REQUEST['file']) */ )
{
$_REQUEST['file'] = download_url_decode( $_REQUEST['file'] );
}

其中download_url_decode在inc/lib/file.lib.php406行定义:

function download_url_decode( $str )
{
if ( $GLOBALS['is_Apache'] && get_conf('usePrettyUrl', false) )
{
$str = ltrim($str, '/');
return '/' . ltrim( base64_decode( $str ), '/' );
}
else
{
return base64_decode( $str );
}
}


我用的nginx,所以直接就被用base64反编码了。

但注意有个错误:

base64编码是除了大小写、数字外,还有两个特殊字符:“+”和“\”,这两个字符不能在url中使用,只要是使用这两个字符的网址都会被换成空格。

所以,如果图片文件名的base64编码中包含了这两个字符,那么传递到document.php中的file参数就会变形,导致文件找不到。

解决办法:

在base64编码后,把“+”和“\”换成url的“%2B”和“%5C”。
作者: lsstarboy    时间: 2009-07-26 21:49
二十八:1.9.0-1.9.1版中,在编辑器里的“插入图片”中,如果是中文的图片名或者是目录名,刚会导致乱码,原因:
1、\editor\tiny_mce\tiny_mce\plugins\claroimage\backend.php,第83行:
    header('Content-Type: text/html; charset=UTF-8'); // Charset
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past

莫名奇妙地出现了几个header,并且是用UTF-8编码,我以前一直用utf-8,所以没发现错误。用在GB2312的场合,肯定要出错,并且还有个过期时间。
   如果用GB2312编码,把“UTF-8"改为“GB2312”就行了。
2、上文最后:
echo claro_utf8_encode($out);
这一个也是指定用UTF-8,最好注释掉。
作者: lsstarboy    时间: 2009-07-28 18:19
二十九:TinyMCE的改进(1.8版)
转自:http://www.cnblogs.com/littlebam ... /10/13/1310162.html

近来在研究开源的在线学习系统Claroline,一个非常简单和实用的一个e-learning系统。
可以很容易的创建课程讲义和课程。通过“学习路径”可以创建进度跟踪的学习方式。
其中,遇到的问题是:创建一个media为主的课程讲义的时候,插入的流媒体文件路径会被系统替换掉。

问题描述:
1、claroline中使用了JS的在线编辑器tinyMCE作为讲义的编辑工具。
2、在tinyMCE中点击“insert/edit embedded media”后打开了一个插入流媒体文件的页面,页面上有一个输入文件名的地方和一个预览的地方。
3、插入media文件的页面时tinyMCE的htm文件,在tinyMCE目录下面,而课程中的视频文件是放在各个客户目录下面的,两个目录一点关系都没有。
4、选择文件的方式非常简单,只要把文件名输入在file文本输入框中即可。
5、问题出现:
   当我保存这个讲义时,自动生成一个htm文件,这个文件中带有一个media player的播放器,找到文件就可以播放。
   但是,在我提交了选择的文件的时候,发现编辑器中的html如下:
   <object classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" width="400" height="400">
<param name="src" value="/Claroline/claroline/document/10.wmv" />
<param name="width" value="400" />
<param name="height" value="400" />
<embed type="application/x-mplayer2" src="/Claroline/claroline/document/10.wmv" width="400" height="400"></embed>
</object>

   问题出来了
   第一:参数只有<param name="src",不能播放,需要参数<param name="url"
   第二:文件路径错误,保存的路径是tinyMCE编辑器文件所在的目录,而需要的是课程的目录。


   那么解决的方法:
   第一个:在写html的时候把"src"修改为"url";
   第二个:修改那个预览和保存时候的路径,找到课程的目录;


第一个问题的解决:
1、在编辑器的目录下有一个editor_plugin.js文件,还有一个editor_plug_src.js两个文件
  文件中的内容基本一样,只是editor_plug_src.js文件中的内容很规整,但是editor_plug.js文件内容没有排版,无法读懂。
2、在两个文件中都有一个方法_getEmbed(),实在提交讲义的时候生成html文件的方法
   方法的参数P就是各个param的参数名和数值。
   在这个_getEmbed()方法中整合完整的<object>...</object>
   于是我打算在其中加入<param name='url',它的value和'src'的value一致。
3、到底修改那个js
   一开始我始终修改editor_plugin_src.js因为我觉得这个很工整,应该修改这个。
   但是同学的话给了我提示:“编辑器都有俩到三种编辑模式,每种编辑模式都会有自己的js”。
   于是我想:是不是带有_src的js是在html模式下使用的js呢?于是我对照editor_plugin_src.js在editor_plugin.js中找到修改的地方,增加url的param。
4、问题解决。
5、看来对于在线编辑器的实现还有待进一步的学习和了解阿。


第二个问题:
1、为什么保存的时候会加上编辑器所在目录的路径呢?
   依然是对tinyMCE的解读。
2、在editor.class.php中有一个tinyMCE.Init方法,设定了很多的参数
   其中有参数convert_urls 和relative_urls。这两个参数默认是false,即默认使用绝对路径。
3、修改上面两个参数为true,则修改使用相对路径
4、这个时候再增加视频文件,发现路径中的/Claroline/claroline/document/自动消失了,不会自动加入代码中。有进展。
5、那么在课程中播放是可以了,但是预览会有问题
6、读取media.htm文件,发现预览调用了media.js中的generatePreview()方法。
7、generatePreview()方法中,调用了一个转换路径的方法
   pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);
   pl.src就是制定了预览的时候视频的位置
8、其中tinyMCE.settings['base_href']不知道base_href参数不知道如何设置的,也许默认就是编辑器所在路径。
9、第三点中提到使用了相对路径后,tinyMCE可是设定一个参数document_base_url
   当我设定了这个参数后,可以用tinyMCE.settings['document_base_url'] 在js中获取设定的值
10、那么我就把课程文件的路径放入其中就可以了
11、问题又出现了,每个课程的名字是不定的,如何把课程名字传到这个路径中呢?
12、联想到进入一个课程后,在课程的各个栏目中切换,系统都会知道进入的是那个课程,那么一定有地方保存了课程的信息。
13、发现系统中有这么一个语句
    $_course = claro_get_current_course_data();
    从语句看来就是得到当前课程的数据
    用php的echo $_course发现$_course是一个array
    那么一定有一个数组值是课程名字的
14、在文件夹中查找有$_course["name"]存放了课程的名字
15、于是在editor.class.php的tinyMCE.init中设置
     $_course = claro_get_current_course_data();
     $_courseName=$_course['name'];
     document_base_url : "/Claroline/courses/"+ "'.$_courseName.'"+"/document", '."\n"
16、修改media.js中generatePreview()方法中的语句
   pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);
   为
   pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['document_base_url'], pl.src);
17、预览搞定
18、保存的时候是相对路径,那么讲义的制作也搞定了。

发现几个需要注意的问题:
1、讲义的文件名不能以数字开头
2、讲义的文件名不要写成中文
作者: lsstarboy    时间: 2009-07-28 18:50
三十、tinyMCE修改不能即时显示

      修改完tinyMCE的语言后,IE有时可以马上反映出来,但是火狐要过很长时间(有时甚至要等一天)才能显示出来。

      原因:火狐有自己的缓冲,“清除隐私数据”就可以了。
作者: nitar    时间: 2009-07-31 01:27
学习了,谢谢楼主
作者: lsstarboy    时间: 2009-08-22 17:40
三十一、批量上传显示:“CSV文件的格式/类型不正确”。

      原因:\claroline\user\AddCSVusers.php304行:
      elseif( !in_array( $_FILES['CSVfile']['type'], $mimetypes) )
        {
            $dialogBox->error(get_lang('CSV file is in the bad format'));
            
            $content .= $content_default;
        }

       在前面有mimetypes的定义:
        $mimetypes[] = 'text/comma-separated-values';
        $mimetypes[] = 'text/csv';
        $mimetypes[] = 'text/plain';
        $mimetypes[] = 'application/csv';
        $mimetypes[] = 'application/excel';
        $mimetypes[] = 'application/vnd.ms-excel';
        $mimetypes[] = 'application/vnd.msexcel';
        $mimetypes[] = 'text/anytext';


       $_FILE[userfile][type]只是浏览器返回的结果,而不是php的检测结果。而IE6和firefox返回值为
application/octet-stream

所以造成不匹配。

解决:1、在296行后加一行:
$mimetypes[] = 'application/octet-stream';


         2、把csv文件扩展名改为:txt。

[ 本帖最后由 lsstarboy 于 2009-8-22 17:42 编辑 ]
作者: lsstarboy    时间: 2009-08-23 12:15
三十二、批量导入时默认没有密码,导致无法登录:

[等有时间再补上]
作者: lsstarboy    时间: 2009-08-23 12:19
三十三、课程列表中有乱码:
  
    如图:


原因:\claroline\inc\lib\faculty.lib.inc.php第65行:

  1.   $out .= '&nbsp;?&nbsp;&nbsp;&nbsp;';
复制代码


那个?本来的原意是“扩展ASCII”中的B0,也就是一个摄氏度的符号,但是在双字节系统中就成了乱码。

解决:改为“!”是一个比较不错的主意。
作者: jasonljj    时间: 2009-09-04 17:39
收藏~~

和 Sakai来比较,功能和本土化的情况如何?
作者: lsstarboy    时间: 2010-03-28 14:51
本帖最后由 lsstarboy 于 2010-03-28 15:00 编辑

三十四:IE类浏览器在tiny_mce编辑器用调用图片浏览时会出现空白页面:

     原因:claroimage中的image.php中输出该页面,但是没有加页面的字符编码,对于IE类浏览器造成了“误解”,导致空白页面,但是查看源代码中一切正常。

    解决:
    1、临时性解决:这种用在无法修改网站源代码的情况。在浏览器中右击,在快捷菜单中选择“编码”,然后选择相对应的编码,如utf-8或gb2312等。

    2、修改网站源代码:
在claroline/editor/tiny_mce/tiny_mce/plugins/claroimage/image.php中,大约146-155行之间(1.9.4版在146行,1.9.1版在153行),有下面两行:
<head>
        <title><?php echo get_lang('Image manager'); ?></title>
在这两行中间,也就是<head>后面插上一句就可以了:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
当然如果是编码没用utf-8,最后改为相应的编码即可,如gb2312

     感谢“金志泉”(QQ:1282507214)网友提出该错误。
作者: lsstarboy    时间: 2010-03-28 20:48
本帖最后由 lsstarboy 于 2010-03-28 23:13 编辑

三十五: Not Allowed 错误

    1.9.0~  版本,用php5.3以上版本,进入课程会出现not allowed错误,但是可以通过右上角的下拉列表进入。

     原因:在地址栏多了一个amp;,导致访问时出错。这个&amp;是由于php5.3默认把arg_separator.output改为了“&amp;”,而不是以前的“&”,所以导致解析错误。
allow_call_time_pass_reference        On        On
allow_url_fopen        On        On
allow_url_include        Off        Off
always_populate_raw_post_data        Off        Off
arg_separator.input        &        &
arg_separator.output        &amp;        &amp;


    解决:1、添加.htaccess文件,写入php_value arg_separator.output "&"
             2、修改php.ini,把上面参数改为一致。
             3、在claroline的global.php中使用php_ini,设置上面的参数。
             4、修改inc/lib/core/url.lib.php,1.9.4版,第233行为:
$url .= '?' . http_build_query( $this->url['query'], '','&' );
  

感谢“深然之Zzz”(QQ:917513632),他找到了官网上的解决方法:
http://forum.claroline.net/viewt ... not+allowed+#p44928


另:这个原因由http_build_query引起,claroline使用的另一个地方是\inc\lib\claro_main.lib.php中的claro_url_relay_context,影响的只有 get_sort_url_list函数,这一个用在用户管理和课程管理的列表中,目前还没有找到影响。
作者: wenheping    时间: 2010-05-03 12:05
收藏~~

和 Sakai来比较,功能和本土化的情况如何?
jasonljj 发表于 2009-09-04 17:39


Claroline与Sakai很大不同。一个PHP一个Java

本土化都靠自己吧。
作者: czjin    时间: 2010-05-18 10:20
版主看一下我的帖子及图我的安装总是失败啊,请版主指教。
http://bbs.chinaunix.net/thread-1673866-1-1.html
作者: lsstarboy    时间: 2010-07-10 00:00
本帖最后由 lsstarboy 于 2010-07-12 21:19 编辑

三十六:claroline 1.10 alpha 版,“课程设置”和“工具调整”都会到login的页面,让用户选择一个课程。

原因:(1)SESSION中的_cid丢失。
          (2)claro_init_local.inc.php,第500行左右,比较SESSION和_REQUEST中的cid,导致结果不一:$cidReq != $_SESSION['_cid']

          (3)250行左右,发现$_REQUEST['_cid']为空
          (4)继续追踪,发现网址:<a class="claroCmd" href="/claroline/course/tools.php?cidReset=true&amp;amp;cidReq=YIZHANG">
           (5)出处:course/index.php,大约170行:
  1. $courseManageToolLinkList[] = '<a class="claroCmd" href="' . htmlspecialchars(Url::Contextualize( get_path('clarolineRepositoryWeb')  . 'course/tools.php' )) . '">'
  2. .                             '<img src="' . get_icon_url('edit') . '" alt="" /> '
  3. .                             get_lang('Edit Tool list')
  4. .                             '</a>'
复制代码
URL输出的已经把&换成&amp;,结果又用htmlspecialchars转换了一次,导致转换了两次amp;

注:请参照三十五的解决方法。
作者: lsstarboy    时间: 2010-08-23 12:32
claroline1.9.4的修改diff,1.9.5版除cvs文件外都适用:

diff -r claroline194/claroline/admin/upgrade/upgrade_init_global.inc.php claroline194_orig/claroline/admin/upgrade/upgrade_init_global.inc.php
145c145
< mysql_query("SET NAMES UTF8");//***
---
>
diff -r claroline194/claroline/editor/tiny_mce/tiny_mce/themes/advanced/skins/default/content.css claroline194_orig/claroline/editor/tiny_mce/tiny_mce/themes/advanced/skins/default/content.css
1c1
< body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:8px;}
---
> body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
diff -r claroline194/claroline/editor/tiny_mce/tiny_mce/themes/advanced/skins/o2k7/content.css claroline194_orig/claroline/editor/tiny_mce/tiny_mce/themes/advanced/skins/o2k7/content.css
1c1
< body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:8px;}
---
> body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
diff -r claroline194/claroline/editor/tiny_mce/tiny_mce/themes/simple/skins/default/content.css claroline194_orig/claroline/editor/tiny_mce/tiny_mce/themes/simple/skins/default/content.css
3c3
<         font-size: 12px;
---
>         font-size: 10px;
diff -r claroline194/claroline/editor/tiny_mce/tiny_mce/themes/simple/skins/o2k7/content.css claroline194_orig/claroline/editor/tiny_mce/tiny_mce/themes/simple/skins/o2k7/content.css
1c1
< body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px;}
---
> body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
diff -r claroline194/claroline/exercise/lib/answer_multiplechoice.class.php claroline194_orig/claroline/exercise/lib/answer_multiplechoice.class.php
75,77c75
<         $this->addAnswer(); //added by lsstarboy : sdcangyuan@gmail.com
<         $this->addAnswer();
<         
---
>
539c537
<             .      claro_html_textarea_editor('answer_'.$i,$answer['answer'],2,25,'','simple')  //modified by lsstarboy : sdcangyuan@gmail.com
---
>             .      claro_html_textarea_editor('answer_'.$i,$answer['answer'],10,25,'','simple')
542c540
<             .      claro_html_textarea_editor('comment_'.$i,$answer['comment'],2,25,'','simple')
---
>             .      claro_html_textarea_editor('comment_'.$i,$answer['comment'],10,25,'','simple')
diff -r claroline194/claroline/inc/lib/core/claroline.lib.php claroline194_orig/claroline/inc/lib/core/claroline.lib.php
222,223c222
<     //Added by lsstarboy:sdcangyuan@gmail.com
<         mysql_query("SET NAMES UTF8");        
---
>         
diff -r claroline194/claroline/inc/lib/database/database.lib.php claroline194_orig/claroline/inc/lib/database/database.lib.php
162d161
<             mysql_query("SET NAMES UTF8"); //added by lsstarboy:sdcangyuan@gmail.com
diff -r claroline194/claroline/inc/lib/display/banner.lib.php claroline194_orig/claroline/inc/lib/display/banner.lib.php
251c251
<                 . 'messaging/index.php" target="_top">'
---
>                 . 'messaging" target="_top">'
253c253
<                 ;    //Modified by lsstarboy:sdcangyuan@gmail.com
---
>                 ;   
diff -r claroline194/claroline/inc/lib/display/footer.lib.php claroline194_orig/claroline/inc/lib/display/footer.lib.php
115c115
<                 . ' <a href="http://www.claroline.net.cn" target="_blank">Claroline</a> '
---
>                 . ' <a href="http://www.claroline.net" target="_blank">Claroline</a> '
117d116
<                 . '&nbsp;&nbsp;&nbsp;Modified By <a href="mailto:sdcangyuan@gmail.com">lsstarboy</a> '
diff -r claroline194/claroline/inc/lib/faculty.lib.inc.php claroline194_orig/claroline/inc/lib/faculty.lib.inc.php
65c65
<                     $out .= '&nbsp;!&nbsp;&nbsp;&nbsp;'; //Modified by lsstarboy : sdcangyuan@gmail.com
---
>                     $out .= '&nbsp;?&nbsp;&nbsp;&nbsp;';
diff -r claroline194/claroline/inc/lib/file.lib.php claroline194_orig/claroline/inc/lib/file.lib.php
477,478c477
< //    $search[] = '?;  $replace[] = 'o';  
< // Modified by lsstarboy:sdcangyuan@gmail.com
---
>     $search[] = '?;  $replace[] = 'o';
diff -r claroline194/claroline/inc/lib/fileDisplay.lib.php claroline194_orig/claroline/inc/lib/fileDisplay.lib.php
378,379c378
<                 htmlspecialchars( Url::Contextualize( get_module_entry_url('CLDOC') . '?cmd=exChDir&amp;file='.urlencode(base64_encode($urlTrail) ) ) ) )); // Modified by lsstarboy : sdcangyuan@gmail.com
< //              htmlspecialchars( Url::Contextualize( get_module_entry_url('CLDOC') . '?cmd=exChDir&amp;file='.base64_encode($urlTrail) ) ) ));
---
>                 htmlspecialchars( Url::Contextualize( get_module_entry_url('CLDOC') . '?cmd=exChDir&amp;file='.base64_encode($urlTrail) ) ) ));
diff -r claroline194/claroline/inc/lib/fileUpload.lib.php claroline194_orig/claroline/inc/lib/fileUpload.lib.php
125c125
<         if ( $element == '.' || $element == '..'|| is_link($element) ) //modified by lsstarboy : sdcangyuan@gmail.com
---
>         if ( $element == '.' || $element == '..')
diff -r claroline194/claroline/inc/lib/forum.lib.php claroline194_orig/claroline/inc/lib/forum.lib.php
1121c1121
<         get_lang('Forum Index'), // Modified by lsstarboy : sdcangyuan@gmail.com
---
>         'Forum Index',
diff -r claroline194/claroline/inc/templates/banner.tpl.php claroline194_orig/claroline/inc/templates/banner.tpl.php
45,46c45,46
<             , array(  '%firstName' => $this->user['lastName']
<                     , '%lastName' => $this->user['firstName'] ) ) ?> :
---
>             , array(  '%firstName' => $this->user['firstName']
>                     , '%lastName' => $this->user['lastName'] ) ) ?> :
diff -r claroline194/claroline/install/index.php claroline194_orig/claroline/install/index.php
413d412
<         mysql_query("SET NAMES UTF8"); //added by lsstarboy@gmail.com
diff -r claroline194/claroline/messaging/lib/notification/notifier/mail.notifier.lib.php claroline194_orig/claroline/messaging/lib/notification/notifier/mail.notifier.lib.php
130,131c130
<         if ( get_conf('smtp_host') =='' ) return 0;  //added by lsstarboy : sdcangyuan@gmail.com
<            
---
>     
diff -r claroline194/claroline/user/AddCSVusers.php claroline194_orig/claroline/user/AddCSVusers.php
301d300
<                                 $mimetypes[] = 'application/octet-stream';  //Added by lsstarboy:sdcangyuan@gmail.com
diff -r claroline194/claroline/wiki/lib/class.dbconnection.php claroline194_orig/claroline/wiki/lib/class.dbconnection.php
179c179
<                                                 mysql_query("SET NAMES UTF8"); //added by lsstarboy:sdcangyuan@gmail.com
---
>
diff -r claroline194/claroline/wiki/lib/wiki2xhtml/class.wiki2xhtml.php claroline194_orig/claroline/wiki/lib/wiki2xhtml/class.wiki2xhtml.php
142c142
<         $this->setOpt('active_fix_word_entities',0); # Fixe les caract鑢es MS
---
>         $this->setOpt('active_fix_word_entities',1); # Fixe les caract鑢es MS

作者: jolinok    时间: 2010-08-31 15:15
mark
作者: lsstarboy    时间: 2010-10-13 21:50
三十七:修改“播放图片”对话框的大小:其实在opera下没有必要改,因为可以滚动。

学生用800x600的分辨率,插入图片对话框显示不全,确认和取消被任务栏档住,应该把那个对话框调小一点。

1)\claroline\editor\tiny_mce\tiny_mce\themes\advanced\skins\default\dialog.css

.panel_wrapper div.current中的height设置为220

这个修改是上部分框的大小


2)\claroline\editor\tiny_mce\tiny_mce\plugins\claroimage\css\advimage.css

#image_list { height: 223px;,改为120

这个修改是图片列表的高度

3)\claroline\editor\tiny_mce\tiny_mce\plugins\claroimage\editor_plugin.js

height:560+parseInt(ed.getLang('advimage.delta_height',0))

这个修改的是整个窗口的高度,如果不修改此项,刚确认和取消在整个窗口的中间附近。
作者: zhmzhang    时间: 2010-10-28 00:50
版主的精神太让我佩服了,值得我们学习。
作者: ywb38324    时间: 2011-02-28 11:31
为什么在整合ucenter的时候通信不能成功了,需要做什么准备吗。
作者: czjin    时间: 2011-03-04 08:39
我换了个地方,网络信息和使用密码都要更换,可claroline的配置文件在哪儿我找了半天没找到哦,好像没有config.inc.php或config.php类似的文件啊。请版主指教
作者: lsstarboy    时间: 2011-03-04 10:56
在platform/conf目录中,有很多配置文件夹,主配置是claro_main.conf.php。不过最好直接在后台修改,后台用Ip可以进入。
作者: lsstarboy    时间: 2011-03-04 10:57
回复 46# ywb38324


    ucenter应该是换了版本,需要修改的东西很多,我也没改过。
作者: lsstarboy    时间: 2011-03-27 19:24
本帖最后由 lsstarboy 于 2011-03-31 10:14 编辑

三十八、练习题的导入、导出乱码:

inc/lib/xml.lib.php

   1. function xmlentities( $string, $quote_style = ENT_QUOTES )
   2.   {
   3.       static $trans;
   4.   
   5.       // remove all html entities before xml encoding
   6.       // must convert all quotes to avoid remaining html entity in code
   7.       $string = html_entity_decode($string, ENT_QUOTES);
   8.   
   9.       // xml encoding
  10.       if ( ! isset( $trans ) )
  11.       {
  12.           $trans = get_html_translation_table( HTML_ENTITIES, $quote_style );
  13.           foreach ( array_keys($trans) as $key )
  14.           {
  15.               $trans[$key] = '&#'.ord( $key ).';';
  16.           }
  17.           // dont translate the '&' in case it is part of &xxx;
  18.           $trans[chr(3] = '&';
  19.       }
  20.   
  21.       // after the initial translation, _do_ map standalone '&' into '&#38;'
  22.       $str_temp = preg_replace( "/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3}/u"
  23.           , "&#38;"
  24.           , strtr( $string, $trans )
  25.           );
  26.       return $str_temp;
  27.   }

红色部分改为:
$trans = get_html_translation_table(HTML_SPECIALCHARS, $quote_style );
作者: lsstarboy    时间: 2011-03-31 10:42
三十九:Claroline1.10.2在选择课程分类时无效:

现象:(1)启用js压缩
         (2)创建课程时,选择好右边框中的分类后,点击两个框中的“添加”箭头,系统无反应,没有js运行错误记录,也没ajax调用请求。

原因:启用js压缩后,直接调用/web/js/min目录下的脚本,但是该目录下的claroline.js里没有msadd和msremove的脚本(对应于两个箭头),导致不运行js,需要在/web/js/min/claroline.js的第1224列后,添加以下内容:


  1. $('.msadd').click(function(){return !$('#mslist1 option:selected').remove().appendTo('#mslist2');});$('.msremove').click(function(){return !$('#mslist2 option:selected').remove().appendTo('#mslist1');});$('.msform').submit(function(){$('#mslist1 option').each(function(i) {$(this).attr("selected", "selected");});});});
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2