我正在研究一个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;
}
}
它似乎应该有效,但事实并非如此。我到处寻找解决方案而没有任何运气。
如果有人可以帮助我,我会非常感激。
非常感谢。
答案 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的博文。