moodle wiki 中文链接失效问题的解决
moodle 版本: 1.8.3 / 1.9-beta
使用中文作为 wiki 页面名称时,有时候访问该页面内容为空,无法显示,但有时候又能够正常显示,原来以为添加 view 动作就可以了,没想到今天问题再次出现,看来不是原来所猜想的那个原因,只好跟踪调试,在代码中加入一堆 echo 以后,终于发现,问题可能出现在这个地方,在 ewiki.php 中:
$id 应该是页面的名称,这里将页面名称加入到 css 中,但对其中的非法 css 名称字符进行了替换,这对于使用中文(或者包括UTF8扩展字符)作为名称的页面显然会导致问题的。替换后的字符串似乎存在半个中文,因此导致将这段文本作为 cache 插入数据库时不能完全插入进去,这应该也是这个问题时有时无的原因——不从cache 中读取内容时可以正常显示,从cache中读取时,因为cache数据库中对应的内容是空白,就无法正常显示了。
简单的注释掉这一句,应也没有什么关系,页面名称本来不出现在 css 中,问题也不大。不知道为什么要这么设计,去 moodle 主页上看看。
现在问题似乎是解决了。
在解决这个问题的过程中想到的:
源代码中没有单元测试代码,要定位问题确实比较麻烦,必须访问网页,添加很多 echo 输出变量来观察,dotnet 程序员们真是幸福啊,可以调试代码。上网搜索一下,PHP 也有单元测试框架,不过好像都还不够单元,很多还是需要通过浏览器访问解析。
就算不用单元测试吧,也有 Log4Php可用,这样至少所添加到那些调试代码可以不用使用 echo,使用 log4net 输出到日志文件,不影响页面,调试完成以后也不需要将这些代码删除,对性能也没什么太大的影响,这个应该是非常好的。可惜 moodle 中似乎也没有用到这个,看来 php 还需要向 java python 等领域的多多学习,更加正规化一些。
使用中文作为 wiki 页面名称时,有时候访问该页面内容为空,无法显示,但有时候又能够正常显示,原来以为添加 view 动作就可以了,没想到今天问题再次出现,看来不是原来所猜想的那个原因,只好跟踪调试,在代码中加入一堆 echo 以后,终于发现,问题可能出现在这个地方,在 ewiki.php 中:
#-- encloses whole page output with a descriptive <div>
function ewiki_page_css_container(&$o, &$id, &$data, &$action) {
$o = "<div class=\"wiki $action"
. strtr($id, ' ./ --_!"�$%&()=?��{[]}`+#*;:,<>| @�������ߤ^���\'\\',
'- -----------------------------------------------')
. "\">\n"
. $o . "\n</div>\n";
}
function ewiki_page_css_container(&$o, &$id, &$data, &$action) {
$o = "<div class=\"wiki $action"
. strtr($id, ' ./ --_!"�$%&()=?��{[]}`+#*;:,<>| @�������ߤ^���\'\\',
'- -----------------------------------------------')
. "\">\n"
. $o . "\n</div>\n";
}
$id 应该是页面的名称,这里将页面名称加入到 css 中,但对其中的非法 css 名称字符进行了替换,这对于使用中文(或者包括UTF8扩展字符)作为名称的页面显然会导致问题的。替换后的字符串似乎存在半个中文,因此导致将这段文本作为 cache 插入数据库时不能完全插入进去,这应该也是这个问题时有时无的原因——不从cache 中读取内容时可以正常显示,从cache中读取时,因为cache数据库中对应的内容是空白,就无法正常显示了。
简单的注释掉这一句,应也没有什么关系,页面名称本来不出现在 css 中,问题也不大。不知道为什么要这么设计,去 moodle 主页上看看。
#-- encloses whole page output with a descriptive <div>
function ewiki_page_css_container(&$o, &$id, &$data, &$action) {
$o = "<div class=\"wiki $action"
// . strtr($id, ' ./ --_!"�$%&()=?��{[]}`+#*;:,<>| @�������ߤ^���\'\\',
// '- -----------------------------------------------')
. "\">\n"
. $o . "\n</div>\n";
}
function ewiki_page_css_container(&$o, &$id, &$data, &$action) {
$o = "<div class=\"wiki $action"
// . strtr($id, ' ./ --_!"�$%&()=?��{[]}`+#*;:,<>| @�������ߤ^���\'\\',
// '- -----------------------------------------------')
. "\">\n"
. $o . "\n</div>\n";
}
现在问题似乎是解决了。
在解决这个问题的过程中想到的:
源代码中没有单元测试代码,要定位问题确实比较麻烦,必须访问网页,添加很多 echo 输出变量来观察,dotnet 程序员们真是幸福啊,可以调试代码。上网搜索一下,PHP 也有单元测试框架,不过好像都还不够单元,很多还是需要通过浏览器访问解析。
就算不用单元测试吧,也有 Log4Php可用,这样至少所添加到那些调试代码可以不用使用 echo,使用 log4net 输出到日志文件,不影响页面,调试完成以后也不需要将这些代码删除,对性能也没什么太大的影响,这个应该是非常好的。可惜 moodle 中似乎也没有用到这个,看来 php 还需要向 java python 等领域的多多学习,更加正规化一些。
浙公网安备 33010602011771号