2

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

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

文件中的代码控制附件在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?
或者,我是不是走错了路?

4

2 回答 2

5

您需要一个模块来执行此操作,而不仅仅是一个主题。模块可以实现 hook_nodeapi(),这将使它有机会在呈现之前更改 $node->content 数组的内容。例如,如果您的模块名为“upload_tweaker”,您将使用以下函数:

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

在此“nodeapi”事件期间,每个模块都可以更改节点;如果你想改变一个模块添加的东西,你需要确保你的模块在它之后加载。这可以通过将其命名为“zzz”之类的名称来完成,或者通过更改站点数据库系统表中的“权重”字段来完成。模块可以像表单元素一样被加权。

api.drupal.org有更多信息。

于 2009-01-22T15:48:24.897 回答
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.
  }
}
于 2013-02-12T11:10:48.813 回答