Как мне изменить # вес содержимого, генерируемого upload.module? - PullRequest
2 голосов
/ 22 января 2009

На моем веб-сайте, работающем на Drupal, я хочу перечислить доступные загрузки в верхней части страницы узла (в узком диапазоне: справа <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, так как мои изменения будут потеряны в следующий раз, когда я применю обновление (скажем, для исправления безопасности).

Как / Где я могу изменить #weight content['files'] в коде моей темы?
Или я поступаю неправильно?

Ответы [ 2 ]

5 голосов
/ 22 января 2009

Для этого вам понадобится модуль, а не просто тема. Модуль может реализовать 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 имеет больше информации.

0 голосов
/ 12 февраля 2013

Для тех, кто использует 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.
  }
}
...