如何更改upload.module生成的内容的#weight?

时间:2009-01-22 06:07:18

标签: drupal drupal-6 themes

在我的Drupal网站上,我想列出节点页面顶部的可用下载(在一个狭窄的浮动内:右<div>),而不是它们通常出现的底部。

在我的主题中,我已覆盖theme_upload_attachments()函数以生成宽度为40%的<div>,但这显示在页面底部。

upload.module文件中是控制页面上列出附件的位置的代码:

// function upload_nodeapi(), line #284 of upload.module
$node->content['files'] = array(
    '#value' => theme('upload_attachments', $node->files),
    '#weight' => 50,
);

如果我手动将此#weight修改为-1,我的自定义附件列表会显示我想要的位置,浮动在内容区域顶部的右侧。

但是,我不想手动破解核心文件upload.module,因为我的更改将在下次应用升级时丢失(例如,对于安全补丁)。

我如何/在哪里修改主题代码中content['files']的#weight? 或者,我是否采取了错误的方式?

2 个答案:

答案 0 :(得分:5)

你需要一个模块才能做到这一点,而不仅仅是一个主题。模块可以实现hook_nodeapi(),这将使它有机会在呈现之前更改该$ node-&gt;内容数组的内容。例如,如果您的模块名为“upload_tweaker”,则您将使用以下函数:

function upload_tweaker_nodeapi(&$node, $op) {
  if ($op == 'view') {
    $node->content['files']['#weight'] = -1;
  }
}

在此“nodeapi”事件期间,每个模块都会在更改节点时遇到问题。如果要更改由一个模块添加的内容,则需要确保模块在其后加载。这可以通过命名类似'zzz',或通过更改站点数据库的系统表中的“权重”字段来完成。模块可以像表单元素一样加权。

api.drupal.org有更多信息。

答案 1 :(得分:0)

对于那些使用CCK并想改变体重的人:

CCK模块使用pre_render功能

/**
 * Pre-render callback to adjust weights of non-CCK fields.
 */
function content_alter_extra_weights($elements) {
  if (isset($elements['#content_extra_fields'])) {
    foreach ($elements['#content_extra_fields'] as $key => $value) {
      // Some core 'fields' use a different key in node forms and in 'view'
      // render arrays. Check we're not on a form first.
      if (!isset($elements['#build_id']) && isset($value['view']) && isset($elements[$value['view']])) {
        $elements[$value['view']]['#weight'] = $value['weight'];
      }
      elseif (isset($elements[$key])) {
        $elements[$key]['#weight'] = $value['weight'];
      }
    }
  }
  return $elements;
}

因此,由于此回调,您无法使用正常行为改变体重。

你应该这样做:

function YOUR_MODULE_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  // Only for node pages.
  if ($op == 'view' && $a4) {
    $body_weight = 15 // Any weight.
    $node->content['#content_extra_fields']['body']['weight'] = $body_weight; // This value CCK module will use to alter body weight in the callback from above.
  }
}