Как программно добавить ссылки в переменную links

8

Я использую Drupal 6 и хотел бы изменить $linksпеременную для включения других ссылок программно. Я искал высоко и низко в Google, как это сделать безрезультатно. Кто-нибудь знает, как это сделать?

user5013
источник

Ответы:

22

Drupal 6

В Drupal 6 вы не можете использовать хуки или изменять хуки внутри тем, поэтому вам нужно создать собственный модуль для изменения ссылок. После этого вы захотите реализовать hook_link()(если вы создаете новую ссылку) или hook_link_alter()(если вы хотите изменить существующую ссылку).

Добавление новой ссылки:

example_link($type, $object, $teaser = FALSE) {
  $links = array();
  // Add a custom link to nodes
  if ($type == 'node') {
    $links['example_mylink'] = array(
      'title' => t('Test link'),
      'href' => 'foo',
      'attributes' => array(
        'title' => 'Test link',
      ),
    );
  }
  return $links;
}

Изменение существующих ссылок:

example_link_alter(&$links, $node, $comment = NULL) {
  // Remove the read more link
  unset($links['node']['node_read_more']);

  // Change the title of the read more link
  $links['node']['node_read_more']['title'] = t('More information');

  // Move read more link to first slot
  $link_read_more = $links['node']['node_read_more'];
  unset($links['node']['node_read_more']);
  $links = $links['node'];
  $links['node'] = array(
    'node_read_more' => $link_read_more,
  ) + $links;

  // Move link to the last slot
  $link_read_more = $links['node']['node_read_more'];
  unset($links['node']['node_read_more']);
  $links['node']['node_read_more'] = $link_read_more;
}

Drupal 7

В Drupal 7 это немного проще, поскольку темы могут реализовывать альтернативные хуки. Крюк alter, который вы ищете hook_node_view_alter():

function example_node_view_alter(&$build) {
  // Remove the read more link
  unset($build['links']['node']['#links']['node-readmore']);

  // Add your own custom link
  $build['links']['node']['#links']['example-mylink'] = array(
    'title' => t('Test link'), 
    'href' => 'foo', 
    'html' => TRUE, 
    'attributes' => array(
      'title' => 'Test link',
    ),
  );

  // Move read more link to first slot
  $link_read_more = $build['links']['node']['#links']['node_read_more'];
  unset($build['links']['node']['#links']['node_read_more']);
  $links = $build['links']['node']['#links'];
  $build['links']['node']['#links'] = array(
    'node_read_more' => $link_read_more,
  ) + $links;

  // Move link to the last slot
  $link_read_more = $build['links']['node']['#links']['node_read_more'];
  unset($build['links']['node']['#links']['node_read_more']);
  $build['links']['node']['#links']['node_read_more'] = $link_read_more;
}

Вы можете разместить это прямо в вашем template.phpфайле.


источник
Спасибо, это именно то, что я искал! Вы избавили меня от реализации интересного обходного пути, используя файл template.php для Drupal 6. Будет ли это решение работать с контентом, сгенерированным представлениями?
user5013
@ user5013 Если вы думаете о полном отображении узла или тизера в представлении, оно должно работать из коробки. Если вы хотите добавить ссылку на представление, вы можете сделать это тоже: просто измените значение 'href'на то, что вы хотите.
Нет, я думал о том, будет ли это решение работать с полями, отображаемыми в представлении.
user5013
@ user5013 Ах, тогда в этом случае нет: ссылки добавляются только тогда, когда узел полностью построен. Однако многие ссылки, которые обычно отображаются на панели ссылок, доступны в виде отдельных полей в представлениях.
1
Ссылки @MotoTribe отображаются в том же порядке, в котором они появляются в массиве, так что это просто прямая манипуляция с массивом для изменения порядка. Добавлены примеры.
1

Предполагая, что вы говорите о ссылках, которые отображаются на node.tpl.php, вам нужно реализовать hook_link, например, посмотреть на node_link . И если вы новичок в ловушках drupal, то это должно произойти в пользовательском модуле, поэтому предположим, что имя вашего пользовательского модуля - "foo", вам нужно написать функцию с именем, foo_linkкоторая должна иметь те же аргументы, что и hook_link.

Dipen
источник