drupal函数hook_nodeapi的一次深入的分析

当前有一个需求,就是在每个node的下面添加一个“最近流行”的一个内容。
如下图1:

hook_nodeapi

这个肯定就是涉及drupal函数hook_nodeapi的应用了。
我第一开始想的比较简单了,就是节点load的时候直接在$node->body下面添加内容

第一次代码如下:
function popularterms_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
  switch ($op) {
   case 'load':
 
    $node->body =  $node->body.popularterms_html_content();
    //popularterms_html_content()函数就是“最近流行”里面显示的内容
    break;
  }

}
这样加上以后,每个节点显示的时候的确也是在节点下面显示了“最近流行”的内容

但是,当编辑这个节点的时候,这个“最近流行”的内容也出现在了内容添加的编辑器里。

图2如下:

hook_nodeapi

这样的话只使用$op为load肯定是不行了,那就用$op为view试试。

于是换成如下代码。

function popularterms_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
  switch ($op) {
   case 'load':
      $node->popularterms_html_content = popularterms_html_content();
      ////popularterms_html_content()函数就是“最近流行”里面显示的内容
    break;

    case 'view':
      $node->content['body']['#value'] = $node->content['body']['#value'].$node->popularterms_html_content;
     break;
  }

}
这样“最近流行”的内容就正常显示到了node节点的最下面了。并且在编辑节点的时候不会出现“最近流行”的内容。

从上面的实例中可以得到如下几个结论

1、drupal函数hook_nodeapi的$op为load的时候,是可以向node节点添加内容的时候,比如$node->popularterms_html_content = popularterms_html_content();,就是在node节点上添加了
$node->popularterms_html_content 。

2、节点显示的内容是$node->content['body']['#value']里面的内容,而不是$node->body里面的内容。

3、drupal函数hook_nodeapi的$op为load的时候,你可以添加新的节点属性,也可以操纵原来的节点属性。

但是当$op为view,就只是节点的显示了。

 

评论

不错,有深度了

不错,有深度了

谢谢夸奖,以后会陆续有好的经验给大家发出来

以后会陆续有好的经验给大家发出来呵呵