石锅拌饭

Tag: plugin

动态组合named_scope

by on Apr.22, 2009, under Uncategorized

named_scope是Ruby On Rails 2.x后一个非常好用的功能,介绍的地方已经很多,在这里不再多说。

named_scope有一个很好的地方,是数个scope和scope可以组合,本来很难看的代码可以变成这样优美可读的形式:

Post.published.by_author(user).within_a_week.in_forum(forum)

但有时候,到底需要将哪些scopes组合在一起,在运行时才能决定,没法在程序中写死。找了一下,似乎没有现成的解决方案,就写了一个叫ScopeGroup的plugin。

使用这个plugin,可以在运行时动态组合named scope,然后可以针对这个组合来调用find, count, average等等函数。
比如,如下代码:

# 为model Post创建一个ScopeGroup
scope_group = ScopeGroup.new(Post)
# 将scope分别加入组合
scope_group.published
scope_group.by_author(user)
scope_group.within_a_week

再调用

scope_group.find(:all)

就等同于:

Post.published.by_author(user).within_a_week

我们碰到的一个用户场景是需要根据地区、类别、状态等各种条件分层次组合生成报表,使用了动态组合named scope的方式,大大简化了代码。

我把这个插件放在了github: ScopeGroup项目主页链接

安装方式:

script/plugin install git://github.com/robin/scopegroup.git
3 Comments :, more...

FBO wordpress plugin 0.3

by on Apr.09, 2006, under Uncategorized

因为本职工作太忙,搁置了一端时间,最近抽空把它搞出来了。
花了一些时间重构,把opml的解析和生成彻底分成独立模块,把view的部分也独立出来,从目前结构上讲,不但可以很容易加入新的provider,新的view也可以以插件形式加入了。目前支持的view有两个,一个是可以放在sidebar里的fbo_list_show(),我的sidebar就是一个例子,还有就是可以放在page template里的fbo_show(),就象这里
这次最大的改变是采用了异步触发FBO的生成和搜集过程。在无需后台cron的支持下,FBO的生成和搜集仍然由用户浏览页面触发,但触发通过XMLHttpRequest转化成一个不阻塞的后台异步过程,用户不会感到任何的延迟。也因为这个原因,在刚安装完这个版本后,最好在Option中先强制搜集一次朋友的FBO信息。
另外就是改善了缓存机制。
下载在这里:
fbo.0.3.tar.gz
安装方式仍然是在wp-content/plugins下解开,在plugin页面中enable,然后在Option下的FBO里配制。

18 Comments :, , , more...

Friends By Outline – 一个开放式社会化网络的尝试

by on Jan.14, 2006, under Uncategorized

english

开放式社会化网络的尝试有不少,比如XFN和FOAF,这两种技术都着眼于建立网络,我以前分析过,一个社会化网络应用,只有网络是不够的,至少不够有趣。
blog天然具备一些社会化网络的要素,个人提供内容,blogroll提供网络框架。个人作为互联网中的节点,除了blog,大多还会提供图片、网摘等等内容。为什么不能将这些元素组合起来,建立一个完整的开放式社会化网络呢?
第一个能想到的是把RSS作为切入点。但RSS倾向于“内容”,缺乏把节点连接成网络所需的信息。另一方面,RSS提供的语义也不够丰富。RDF也是一个 可能的选择,很容易提供资源到url的联系,语义也非常丰富,唯一的问题是结构相对复杂,当年在xml sync这一功能上RDF远早于RSS,最后RSS胜出,就败在复杂上。
再来看一下OPML。目前OPML在互联网上被广泛应用于表示RSS聚合集。其实OPML定义了语法,但并没有限制语义,用它来outline的东西几乎可以是无限的。mac上的OmniOutline就可以以opml作为文件格式之一。
以outline的方式来组织互联网中的个人节点是一个很自然的过程:

写成OPML就是这样:

<outline title=”me”>
<outline title=”blog” type=”blog”>
<outline title=”test” type=”link” htmlURL=”http://…” dateCreate=”2005-12-29 13:51″/>
<outline title=”Hello world!” type=”link” htmlURL=”http://…” dateCreate=”2005-12-29 13:48″/>

</outline>
<outline title=”bookmark” type=”bookmark”>
<outline title=”Max Design” type=”link” dateCreate=”2006-01-14 03:15″ subject=”css reference webdesign” htmlURL=”http://www….”/>

</outline>
<outline title=”photo” type=”photo”>

每个互联网上的个人节点都可以生成这样一个outline文件,在网页的head里加入一个rel是outline的<link>:

通过这个outline文件,很容易得到关于这个个人节点的内容信息,更重要的是,outline中提供了延伸的可能性,通过friend部分的链接,可 以探测朋友的outline文件,再到朋友的朋友。保证了可延伸,可被探知,并提供内容,一个Friends By Outline的开放式社会化网络就自然形成了。
outline中的内容可以不限于blog、图片和网摘。加入图书、电影和唱片,就可能产生一个开放式的豆瓣。加入To Do List,就可能产生一个开放式的43things。加入你要卖的二手货,就可能产生一个开放式的ebay。
为了实践这个这个想法,我做了一个wordpress插件,这个插件可以帮我做下面几件事:

  • 根据我提供的内容生成一个outline文件。
  • 在页面的head里加入outline文件的link。
  • 探测我的朋友的outline文件。

安装了这个插件以后,在Option中可以做如下设置:

插件可以通过这些信息和blog的内容生成一个fbo.opml文件,我的fbo.opml在这里。通常情况下,这个文件是自动生成的,不需要Force rebuild。
如果你的朋友也有这样的outline文件,你可以去Dashboard下的Friends里查看插件自动帮你搜集来的内容:

也可以通过template做一个这样的页面。这些页面也都是自动更新的。
如果你也想加入实践Friends By Outline的行列,并且在使用wordpress1.5.2以上的版本,可以在这里下载这个插件。 在plugin目录下展开。这个插件会在blog根目录下写outline文件,在plugin/fbo目录下写入搜集来的outline文件,所以你需 要赋予这两个目录的写权限。通常不需要做额外设置。同时,如果你愿意,可以要我把你加入我的Friends By Outline的Link List中,你的outline就会被包含在我的Friends页面中了。

Update: Friends By Outline wordpress v0.2

20 Comments :, , , , , , more...

How to make ecto work with Ultimate Tag Warrior

by on Dec.29, 2005, under Uncategorized

I once wrote about “How to make ecto work with Jerome’s Keywords“. Unfortunately, Jerome’s Keywords does not work well with WordPress 2.0. With suggestion from Meng Yan, I switched to Ultimate Tag Warrior. Again, I met the problem of how to make ecto work with it. Here’s the solution.

  1. make sure Ecto is using Movable Type API to contact with your wordpress. You can check it out in the Account settings.
  2. set up the template of tags in Ecto. Set the “Tag separator” as “,” which is the default setting and “Put tags in” as “keywords” which is NOT the default setting.
  3. update the xmlrpc.php in the directory of your blog system. add the following line into the function mw_newPost and mw_editPost after where $content_struct is initialized:

$_POST[‘tagset’] = $content_struct[‘mt_keywords’];

Here’s the sample code to show where to make the modification (below the comments “ROBINLU HACK”):

/* metaweblog.newPost creates a post */
function mw_newPost($args) {
global $wpdb, $post_default_category;
... ...
$post_excerpt = $content_struct['mt_excerpt'];
$post_more = $content_struct['mt_text_more'];
// ROBIN LU HACK
$_POST['tagset'] = $content_struct['mt_keywords'];
$comment_status = (empty($content_struct['mt_allow_comments'])) ?
... ...
}
... ...
/* metaweblog.editPost ...edits a post */
function mw_editPost($args) {
global $wpdb, $post_default_category;
$this->escape($args);
$post_ID     = $args[0];
... ...
$post_title = $content_struct['title'];
$post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
$catnames = $content_struct['categories'];
// ROBINLU HACK
$_POST['tagset'] = $content_struct['mt_keywords'];
$post_category = array();
... ...
}

Update: See Part II to get ecto fully functional with UTW.

42 Comments :, , , , , , more...

Search

Archives

Browse by tags

agile apple blog book design ecto extension firefox git google hack ichm iphone keyword life mac madfox movie nonsense opensource plugin pm ruby rubyonrails sns software startup wordpress work 财帮子