Pligg 1.03 没有找到 RSS importer 插件
很迷惑。
但是 Pligg 1.03 似乎解决了中文化、汉字乱码…等一系列以前版本的问题。
RSS importer 是一定要的,先攒些文章在这里。
———-
Pligg插件RSS importer使用笔记
原文:http://hi.baidu.com/ayifa/blog/item/10abdf62573bb3d4e7113ae5.html
RSS importer几乎可说是安装Pligg后必用插件,我们可以用它来从指定的Feed定时抓取更新。在安装了Pligg Beta 9.9.5之后,可以使用管理员账号从管理面板进入Module Management,找到RSS importer安装并启用。
抓取中文内容标题与内容为空的问题
如果抓取的目标文章title是中文的话,极有可能写入后title、content均为空——事实上,直接submit一个中文标题的story也会出现这种情况。
检查/libs/link.php发现,Pligg插入Link的流程是
- 先插入一条含作者、创建时间、分类等关联内容的条目,这些列的类型多为int或timestamp。
- 然后再通过update来为刚插入的行写入title、content、title_url、tags以及extend fields等文本内容,这些列的内容多为varchar或text。
在update这个流程,它会先给这些数据分别做db-escape,如果title_url为空的话,它还将使用一个makeUrlFriendly函数处理title,赋予title_url。
这个函数在处理中文时返回的结果多数情况下会导致包含该字串的sql不能被顺利执行,以致link更新失败,从而出现link写入成功但是标题和内容均为空的问题。
比较理想的做法是如同wordpress插件cos_translator那样,利用google translate取回一个英文翻译结果赋予title_url。不想费这个劲的话,直接把titile赋给title_url也行。
修改/libs/link.php 把139行注释替换为
//if($link_title_url == ""){$link_title_url = makeUrlFriendly($this->title);}
if($link_title_url == ""){$link_title_url = $link_title;}
这样修改解决了未设置title_url时的问题,但使用RSS importer抓取的时候,插件已经先行一步使用makeUrlFriendly给title_url赋值了,这也需要取消掉。
修改/modules/rss_import/templates/import_fields_center.tpl 把78行注释替换为
//$linkres->title_url = makeUrlFriendly($linkres->title);
$linkres->title_url = $linkres->title;
抓取时重复更新计数的问题
在RSS importer里可以给一个Feed设置Random Votes,以后从该Feed抓取回来的链接,每一条都会被先预置Votes。比如我们给一个Feed预置5-10的votes,那么取回来的文章会随机的得到在这之间的一个votes。
问题就在这里设置votes的流程是
- 先往votes表里插入一条vote,计算该link的votes数并更新..
- 再往votes表里插入一条vote,计算该link的votes数并更新…
- 如此往复….
如果votes为200的话,那就重复200次。
我们可以把计算votes数并更新这个流程移出来,做一次就可以了。
具体是修改/modules/rss_import/templates/import_fields_center.tpl 147行,把这行起看到的第一个}移到这行之前。
———-
搭建pligg的几个问题
原文:http://www.cssass.com/blog/index.php/2009/274.html
1,我安装在服务器上之后(本人服务器之过,应属个别问题),_modules表中无法写入数据,即后台无法启用modules(类似wordpress中的plugins)。其他的modules也就算了,其中却有一个Rss Importer。可以导入RSS数据,我觉得是必不可少的。
既然,无法通过后台PHP程序插入数据库,那在MYSQL中直接使用SQL语句插入总没问题吧。果然,可以启用。
SQL语句,以启用Rss Importer为例:
- INSERT INTO `pligg_modules` (`id`, `name`, `version`, `latest_version`, `folder`, `enabled`) VALUES
- (2, ‘RSS Importer’, 0.9, 0, ‘rss_import’, 1);
2, 我在本地安装的时候,发现中文数据是乱码(有众多???号)。在服务器上安装没问题。其实这是因为我本地创建数据库的时候选择的charset等有问题,我选择的是默认default(我本地的SQL工具为SQLyog)。
正确的设置是charset:utf8;collation:utf8_general_ci;
3,RSS Importer的用法。虽然启用了这个module。但用的时候,刚开始却没摸到门路。其实我很质疑rss importer的界面设计。rss importer参数设置有三步。
第一步:填Feed Name和URL。
第二步:点edit进入,按需要修改一些参数。
第三步:(我所忽略的就是这一点)点Add a new field link 。对应XML数据标记和pligg的变量,可以点击Examine this feed 做参考。一般是title——link_title;link——link_url;description——link_content
4,如何将本地和主机上的数据互搬。本来也只需把导出的SQL,搜索替换一下域名就可以了。但如果本地或主机上有一个安装目录,就需要多做一步了。
- Location Installed’, ‘$my_pligg_base’, ‘/digg’, ”, ‘/(folder name)’, ‘Pligg Base Folder’,
其中的digg就是安装目录了。如果是根目录,则留空。
这个设置的在settings.php中$my_pligg_base = ”;但如果修改这里,却是无效的,反而会被SQl数据所重置。
另外补充一个,数据库连接的设置在/libs/dbconnect.php中。
如果,要将本地或空间的文件覆盖对方,这个文件是不能拿去覆盖的。settings.php也不要拿去覆盖。
一个仍无头绪,但绕道解决的问题——汉化问题。
本来这个汉化,只需修改language.conf文件就可以的,但我修改后,中文却是显示乱码。而在后台language选项下修改也不行。修改后中文显示的是Hex码。。。
最后,我无奈直接在tpl文件中修改,工作量大了很多。
几个程序上的修改。
1,于中文信息的输入,往往出现link_title_url too long的问题。
我们找到link.php中。
- $link_title = $db->escape($this->title);
- $link_title_url = $db->escape($this->title_url);
- if($link_title_url == ""){$link_title_url = makeUrlFriendly($this->title);}
再搜索makeUrlFriendly这个函数,找到utils.php。
在makeUrlFriendly这个函数下第二行,
- $output = utf8_substr($input, 0, 240);
这个数值改大一点就可以了。
然后可能还需修改sql数据库的结构,将_inks表下link_url_title数据项的Len值留空或改大。
2,虽然可以在后台设置文章允许的html tags。但通过rss importer导入的文章显示的缩略文却是屏蔽标签的。所以如果要让首页显示的缩略文也支持html tags。可以在modules/rss_import/templates/import_fields_center.tpl中去除strip_tags函数。
- $linkres->link_summary = close_tags(utf8_substr(strip_tags($linkres->content), 0, StorySummary_ContentTruncate – 1));
去除后:
- $linkres->link_summary = close_tags(utf8_substr($linkres->content, 0, StorySummary_ContentTruncate – 1));
3,缩略文允许html tags之后,就有了一个问题:缩略文是截取原文中前400个字符的(默认),假如截取的末尾是
<a href=”abcde
这半个”号就会引发html闭合问题。
解决方法就是搜索文中的”和’号,替换为空。我们将这个代码加在close_tags的函数定义中。
找到html1.php 中的close_tags函数。
在第一行,加上
- $html=preg_replace ("/\’|\"/","", $html);
除此之外,colse_tags函数虽然可以闭合有开始没结束的标签(事后发现,对于复杂的html结构,这个闭合并不能生效,函数需要大改进…)。对于
<p class=”begin”
这样的半个开始标签,函数却没有解决闭合问题。
修改:
- if (preg_match_all(’/<([a-z]+)(?: .*)?(?<![\/|\/ ])>/iU’, $html, $m))
- $opened_tags = $m[1];
改为:
- if (preg_match_all(’/<([a-z]+)(?: .*)?(?<![\/|\/ ])>/iU’, $html, $m))
- {
- $opened_tags = $m[1];
- preg_match_all(’/<([a-z]+)(?: .*)?(?<![\/|\/ ])>/iU’, $html, $m);
- $opened_tags2=$m[1];
- if(count($opened_tags2)!=count($opened_tags))
- $html .= ‘>’;
- }
整个函数变为:
- function close_tags($html)
- { $html=preg_replace ("/\’|\"/","", $html);
- $single_tags = array(’meta’,'img’,'br’,'link’,'area’);
- if (preg_match_all(’/<([a-z]+)(?: .*)?(?<![\/|\/ ])>/iU’, $html, $m))
- {
- $opened_tags = $m[1];
- preg_match_all(’/<([a-z]+)(?: .*)?(?<![\/|\/ ])>/iU’, $html, $m);
- $opened_tags2=$m[1];
- if(count($opened_tags2)!=count($opened_tags))
- $html .= ‘>’;
- }
- else
- return $html;
- if (preg_match_all(’/<\/([a-z]+)>/iU’, $html, $m))
- $closed_tags = $m[1];
- else
- $closed_tags = array();
- if (count($closed_tags) == count($opened_tags))
- return $html;
- for ($i=count($opened_tags)-1; $i>=0; $i–)
- {
- if (!in_array($opened_tags[$i],$single_tags))
- {
- if (!in_array($opened_tags[$i], $closed_tags))
- $html .= ‘</’.$opened_tags[$i].’>’;
- }
- }
- return $html;
- }
整个函数对于
- $html = " <p><b>bold text</b>sdasd<a href=’howdy.html";
可以完好闭合,
但复杂点的,如
- $html = "<p>s<a href=’as’ >asd</a>adasd</p><p><b>bold text</b>sdasd<a href=’howdy.html";
就不能完好闭合了。
待续改进。
———-


