Jak programowo dodawać linki do zmiennej links

8

Korzystam z Drupala 6 i chciałbym zmodyfikować $linkszmienną tak, aby zawierała inne linki programowo. Szukałem wysoko i nisko w Google, jak to zrobić bezskutecznie. Czy ktoś wie jak to zrobić?

użytkownik5013
źródło

Odpowiedzi:

22

Drupal 6

W Drupal 6 nie można używać zaczepów ani modyfikować zaczepów wewnątrz motywów, dlatego musisz utworzyć niestandardowy moduł, aby zmodyfikować łącza. Po zakończeniu będziesz chciał zaimplementować hook_link()(jeśli tworzysz nowy link) lub hook_link_alter()(jeśli chcesz zmodyfikować istniejący link).

Dodanie nowego linku:

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;
}

Modyfikowanie istniejących linków:

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

W Drupal 7 jest to nieco prostsze, ponieważ motywy mogą implementować alter hook. Hak do zamiany którego szukasz to 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;
}

Możesz umieścić to bezpośrednio w swoim template.phppliku.


źródło
Dzięki, właśnie tego szukałem! Uratowałeś mnie przed wdrożeniem interesującego obejścia przy użyciu pliku template.php dla Drupala 6. Czy to rozwiązanie działałoby z treścią generowaną przez widoki?
user5013
@ user5013 Jeśli myślisz o widoku pełnego węzła lub zwiastuna w widoku, powinien on działać od razu po wyjęciu z pudełka. Jeśli chcesz dodać link do widoku, możesz to zrobić: po prostu zmień wartość 'href'na dowolną.
Nie Myślałem o tym, czy to rozwiązanie będzie działać z widokiem pól w widoku.
user5013,
@ user5013 Ach, w takim razie nie: łącza są dodawane tylko wtedy, gdy węzeł jest w pełni zbudowany. Wiele linków, które zwykle pojawiają się na pasku łączy, jest jednak dostępnych jako osobne pola w widokach.
1
Łącza @MotoTribe są renderowane w tej samej kolejności, w jakiej pojawiają się w tablicy, więc zmiana kolejności jest prosta. Dodano przykłady.
1

Zakładając, że mówisz o linkach renderowanych w node.tpl.php, musisz zaimplementować hook_link, na przykład spójrz na node_link . A jeśli foo_linkdopiero zaczynasz korzystać z haków Drupal, to musi się to zdarzyć w module niestandardowym, więc powiedzmy, że nazwa niestandardowego modułu to „foo”, będziesz musiał napisać funkcję o takiej samej argumentacji jak hook_link.

Dipen
źródło