代码之家  ›  专栏  ›  技术社区  ›  Bevan

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

  •  2
  • Bevan  · 技术社区  · 15 年前

    <div>

    在我的主题中,我超越了 theme_upload_attachments() 函数生成一个 <部门> 宽度为40%,但这会显示在页面底部。

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

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

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

    如何/在何处修改 content['files'] 在我的主题代码中?
    或者,我是不是走错了路?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Eaton    15 年前

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

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

    在“nodeapi”事件期间,每个模块在更改节点时都会出现裂缝;如果您想更改由一个模块添加的内容,您需要确保模块在此之后加载。这可以通过将其命名为类似“zzz”的名称来实现,或者通过在站点数据库的系统表中更改其“权重”字段来实现。模块可以像表单元素一样进行加权。

    api.drupal.org 有更多的信息。

        2
  •  0
  •   Jekis    11 年前

    CCK模块使用预渲染功能

    /**
     * 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.
      }
    }