如何通过模块修改CCK字段显示?

时间:2010-08-16 18:26:49

标签: drupal module hook cck

我正在研究一个drupal模块,它需要做的一件事是自动修改cck文件字段的显示(使用模板文件不是一个选项)。例如,这个数组:

$node->field_images[0]['view'];

这就是我想要了解的内容。 “视图”部分将根据内容类型的显示设置输出图像。在将节点显示给用户之前,我想在每个图像上附加一个链接。

我尝试过的一件事:

function mymodule_nodeapi(&$node, $op, $teaser, $page) {
      switch ($op) {
          case 'view':
            $node->content['field_images']['view'] = array(
              '#value' => "hello",
              '#weight' => 10
            );
          break;
      }
 }

这会在最后一张图像后插入一次文本。我尝试使用foreach循环遍历所有这些并且根本没有产生任何结果。

我也试过这个:

function mymodule_nodeapi(&$node, $op, $teaser, $page) {
      switch ($op) {
          case 'view':
              // Attach link           
              foreach($node->field_images as $media) {
                  $media['view'] .= generate_link($node->nid, $media);
              }           
          break;
      }
    }

它似乎应该有效,但事实并非如此。我到处寻找解决方案而没有任何运气。

如果有人可以帮助我,我会非常感激。

非常感谢。

1 个答案:

答案 0 :(得分:1)

修改

要在页面加载模板系统之前修改CCK值,请使用alter中的hook_nodeapi操作。在呈现节点之前调用view,之后调用alter


正如您所注意到的,CCK字段未及时填充您尝试放置代码的地方。相反,您需要使用预处理函数 - template_preprocess_node() - 这将允许您在显示渲染输出之前修改值。

function mymodule_preprocess_node(&$variables) {
  // $variables['field_name'] contains the CCK array for field_name
}

这不会更改节点模板中$content的呈现输出(除非您真的想重置$variables['content'],但它允许您在您的节点中使用$field_name带有预处理值的模板。

或者,您可以为该字段创建自己的自定义格式化程序,影响$content的呈现输出。在googletorp上查看Creating a field formatter for CCK的博文。