You are here

怎样实现这种功能?

machinex 的头像
Submitted by machinex on 星期三, 2008-11-19 04:42

之前在其他地方问过但是都没有得到答复,于是过来问一下:
我使用了feedapi,它自带两个节点内容类型,一是feed,用于输入feed来源,二是feed item,feed下载回来的文章都被储存成该类型。
而且feed和feed item有内在联系,新建一个feed并且让其刷新之后,其创建了n个feed item,然后可以通过该feed的footer中的一个"feed item"的连接查看到其所有的feed item。feed的nid是11的话,feeditem/11就可以显示其附属的feeditem.
但是,我想要做到的是将feed的最新的几个feeditem的title直接显示在feed的内容中,而不需去点那个连接。我试着用view来完成,加了一个filter过滤feed的nid,然后作为一个view reference负在feed的里面,但是不知道怎么把feed的nid传递到这个view的filter中。
现在我就只能够做到这一步……

论坛:

使用views_embed_view(),直接在模板中调用这个函数,把view的内部名称,还有$nid,传递给这个函数,就可以了。
你看看views2的说明,不知道你是不是用的views2
 
 

http://www.developmentseed.org/sites/default/files/feed_element_mapper_1.swf
上面看到一个feed element mapper的教程,里面可以看到当他新增完一个feed并且refresh之后,就可以在feed里面看到其中三个feed item的title。
最终效果如下:
http://drupal.org/files/issues/2008-11-09_141823.jpg
不知道是否有现成的模块来完成,我也向这个视频的作者请教过,但是还没有回复。
views_embed_view这个函数应该插在node.tpl.php里面么?抱歉的是我接触drupal的时间比较短,模板制作修改这一块至今还不懂。

大概是这样的,根据feed,你可以创建一个views,在这个view中,设置一个参数,为feed的id。功能就是列出feed下面的3个item。然后,当你访问feed页面时,对应这个页面,肯定存在一个模板,找到这个模板,在中间插入一条语句<?php views_embed_view?>,其中把views的名称,还有feed的id传递过来就可以了。

另外,你可以自己写个函数,放到template.php文件中,然后在feed的文件中调用这个函数。

feed我很少用过,所以它的模板我也不大清楚,但是原理就是这样的。使用views也好,自定义函数也好,都需要在里面插入数据的。我不知道我理解的对不对。就是你想在显示feed的页面同时显示3条最新的item?

views_embed_view函数确实很强大,但是我还是不太想修改模块和模版……
现在就只差一步
我建立的view是一个attachment,现在我取消了原来的parent feed的filter,增加了一个parent feed的arguments,然后在新建完feed之后再编辑这个feed,把feed的nid填到arguments里就可以了。
然后我在编辑内容类型的view reference filed,里面有'default value' ,然后还可以编写一小段php code来对arguments进行return和赋值(我想应该是这样的吧?)。它有个例子:
return array(  0 => array('view_id' => value for view_id, 'arguments' => value for arguments),  // You'll usually want to stop here. Provide more values  // if you want your 'default value' to be multi-valued:  1 => array('view_id' => value for view_id, 'arguments' => value for arguments),  2 => ...);
然后我试着写:
return array(
  0 => array('28'=>'view_id','$nid'=>'arguments'),
);
但是没反应。这样写对么?

还是自己回复一下;
现在我在argument中给了个固定的语句:
<?php if (arg(0) == 'node' && is_numeric(arg(1))) { print arg(1);}?>
然后在最下面argument中选择允许php code,就可以了。
但是不完美,当打开单独的一个node的时候,显示正常,但是当在首页显示的时候,全部的view reference都是一样,显示的是最老的node的内容。
有没有办法可以每个都显示自己的view reference?

仍旧是自问自答时间:
已经完全得到了自己想要的功能了,换了一个模块,先前是view reference,现在用viewfield。
相比之下,viewfield要获取所在节点的nid要比view reference来的要轻松得多, 直接在argument中输入%nid就可以了。
具体做法:
前面的就省略了;
1. 安装viewfield模块,最新的终于支持6.x了;
2. 在feed中新建viewfield的field;
3. 选中要插入的view,先保存,然后再编辑,在argument中输入%nid;
4. 大功告成,吃方便面庆祝。

drupal对于开发人员来说,并不是非常非常的难,只是有些地方做过了才知道,如果大家都能把自己的经验介绍一点出来,那么很多新手就会很快的成长起来(我认识好几个Drupal的新手其实都是多年的老程序员,呵呵),用的人多了,大家共享的东西就会越来越多。
在这个问题上,可能无法直接找到等价关系,任何人的付出在=(等号)后面可能没有直接的答案。但是,网络这种东西其实就是一种信念。最终是利人利己的。
 
也建议 machinex 大侠,如果方便,能够整理一下思路放在这里,可能会激发更多人参与讨论。

楼上所言确实,其实就是知道和不知道的区别。
昨天不是太方便,于是今天才补上。
=============重新整理分割线===============
1. 先介绍下feedAPI:
feedapi最主要的功能是将别人网站的feed整理入自己的网站中,将别人的一篇篇文章变成自己的一个个节点内容。
启动好feedapi之后其自带一个叫做feed的内容类型,同时,你还可以将其他内容类型设定为feed。有了这个feed类型之后,还要为他准备它对应的一个feeditem的内容类型。在feed输入好别人的feed地址(如rss,rdf等),刷新之后就就可把该网站的内容转化为一个个feed item。并且他们之间有“父子关系”,所有feed item有其对应的parent feed,这在views中可以表现出来,这是feedapi与其他诸如aggeration模块不同的地方,我所要做的东西很大程度上也是建立于此。
于是,我便新建了feed A和feeditem B两个内容类型,然后先随便新建几个feed,刷新后用来做测试。
2. views
然后再views这边新建一个view,在default中建立一个field,选取“节点:标题”,并且在Link this field to its node 中打勾。然后再filter中选取“节点:类型”,限定只显示B这种节点类型。
新建一个attachment的display(在选择page,block那里选择),然后在里面新增arguments,选取“feedAPI item:parent feed”,Validator:选择node,再选择A节点类型。
3.viewfield
原来一直想用view reference来实现,结果真的不会怎么用,后来viewfield出了6.x版本,一用上就好了。首先是启动好viewfield。
在节点类型A中新建一个viewfield,选中刚刚新建好的那个view,先保存一下,然后再进去编辑,在default value的argument中输入%nid,然后再在上面打上force default的选项,保存,然后再跑到原来建好的feed中重新设定一下,估计就ok的了。
============再说几句分割线============
cck+views+viewfield真的很好用!
比如你想做某篇文章的相关文章的话,估计也可以用这种方法来实现。还可以用来在个人介绍中显示某个人最近发表的文章……
feedapi用来做垃圾网站十分一流,完全从其他网站下载新闻,搞个baidu新闻那样子的首页是非常简单的;
drupal要研究的话,一定要多到drupal上找相关信息,注意view all issue;
不一定死扣一个模块,试试相类似的模块,或者会有意想不到的收获。