Community & Support

Re-order links at bottom of stories?

I would like to re-order the links that appear at the bottom of the content nodes, the "read more" and "email this page" and "unsubscribe" stuff.

Currently, there are a couple of links in the way of the "read more" link, which on our site is more important than the others.

I would also like to shorten the vocabulary on some of the links, so "email this page" becomes "email" or some such nonsense.

View my page so you can see what I mean: http://www.cctvcambridge.org

Does anyone have any tips? Thanks!

Sean

Comments

Override theme_links in your

Override theme_links in your theme's template.php or smartytemplate.php (PHPTemplate and Smarty theme engines, respectively).

Initially just copy the current code to a custom function named {theme_name_here}_links.

http://drupaldocs.org/api/head/function/theme_links

(code in template.php or smartytemplate.php -- depending on your theme-engine -- within your theme directory)

<?php
function seanstheme_links($links, $delimiter = ' | ') {
  if (!
is_array($links)) {
    return
'';
  }
  return
implode($delimiter, $links);
}
?>

You can put your own sorting logic in there.

I understand how to copy and

I understand how to copy and paste the code, but not sure where that code should be stuck in my template files. I'm using xtemplate.

Also, how do I set parameters for sorting the links - I don't speak PHP!

Thanks for your help so far!

Sean

Ordering links with theme_links in Drupal 5

From what I can work out in Drupal 5 you can use theme_links. Can anyone give an example of the php and logic you could use to reorder the links?

Would be really, really helpful!!

Changing the vocabulary is

Changing the vocabulary is pretty easy with the locale module. Here is a nice post that explains it in detail:
http://drupal.org/node/43791#comment-81553

Thanks!

Thanks for this link, it hit the spot!

You're welcome:-)

You're welcome:-)

Links array re-ordering

I ended up here while doing a search as I wanted to achieve the exact same thing. However, the solution given above doesn't fit what I want.

Here's the solution I came up with (quite simple, yet had to dig into how PHP deals with arrays):

<?php
   
// first check if the $links array contains the 'array_key' (name of the link/module you want to move)
   
if( isset( $links['array_key'] ) ) {
       
// then create a temporary array (I don't know whether this is required or optional)
       
$temp_arr = array();
       
       
// assign the existing array (of the link) to the temporary array
       
$temp_arr = $links['array_key'];

       
// delete the existing array, so that you don't get duplicates, and only one instance of the array (link) is published
       
unset( $links['array_key'] );
       
       
// this does the magic, as it prepends the $links with the temporary array, thus moving your link to be the first one
       
array_unshift( $links, $temp );

       
// finally unset ... i think this is necessary for performance
       
unset( $vote );
    }
?>

Woohoo! My first post here finally!

--
Jhoom.com

--
Sawant
CMS Goodies | @sawant

Time for a flexible $links module...

This is a bone of contention with regards to Drupal flexibility and user friendliness with me. This page reads like hieroglyphics to anyone who's not a coder. There should be a module that simply allows us to drag and drop reorder and rename the links, assign icons, etc. at the bottom of any node, specific to the theme that I'm in/setting up at the moment.

I know it would be one incredibly challenging module to write, but I know coders that eat that stuff like a good chess game, so I'm throwing down the challenge. Any takers?

Nipples,
Baker

Nice

Nice snippet of code - very useful GuruJi! I've modified it slightly to be a little easier to customize...

This should work in Drupal 5.x - simply rename the function from "yourtheme_links" and paste in your template.php file.

add any keys for links you want to appear first in a list. For myself, I used

"$searchkeys = array('comment_add', 'comment_forbidden');"

<?php

// a function to reorder links before passing them to default link theme function
function yourtheme_links($links, $attributes = array('class' => 'links')) {

 
 
//simply add any link keys here that you wish to appear first in a list of links
 
$searchkeys = array('key_one', 'key_two');
 
 
$searchkeys = array_reverse($searchkeys);
  foreach (
$searchkeys as $key) {
      if( isset(
$links[$key] ) ) {
           
$temparray = array();
           
$temparray[$key] = $links[$key];
            unset(
$links[$key] );
           
$links = array_merge($temparray, $links);
            unset(
$temparray );
      }
  }
 
  return
theme_links($links, $attributes = array('class' => 'links'));
}

?>

Themeable in Drupal 6?

Am I right, did I read that this is now handled on the theme layer by Drupal 6?

Slightly better version

Here's a slightly better and more flexible version of the above code:

Reorder Function:

<?php
/**
* Reorder links before passing them to default link theme function.
* Original idea taken from <a href="http://drupal.org/node/44435
" title="http://drupal.org/node/44435
" rel="nofollow">http://drupal.org/node/44435
</a> *
* @param $links
*   A keyed array of links to be themed.
* @param $first_keys
*   An array of keys which should be sorted to the beginning of the $links array.
* @param $last_keys
*   An array of keys which should be sorted to the end of the $links array.
* @return
*   A string containing an unordered list of links.
*
* Usage Note: The order in which you specify $first/last_keys is the order in which they will be sorted.
*/
function reorder_links($links, $first_keys = array(), $last_keys = array()) {
   
$first_links = array();
    foreach (
$first_keys as $key) {
        if (isset(
$links[$key])) {
           
$first_links[$key] = $links[$key];
            unset(
$links[$key]);
        }
    }
   
$links = array_merge($first_links, $links);

   
$last_links = array();
    foreach (
$last_keys as $key) {
        if (isset(
$links[$key])) {
           
$last_links[$key] = $links[$key];
            unset(
$links[$key]);
        }
    }
   
$links = array_merge($links, $last_links);
   
    return
$links;
}
?>

Usage:

<?php
/**
* Override theme_links() so we can reorder the $links array.
*/
function phptemplate_links($links, $attributes = array('class' => 'links')) {
   
// Reorder the links however you need them.
   
$links = reorder_links($links, array('first-link', 'second-link'), array('last-link'));
   
   
// Use the built-in theme_links() function to format the $links array.
   
return theme_links($links, $attributes);
}
?>

 
~ Digital Cowboy Extraordinaire ~

need a conditional statement in there

Great snippett. However, you need a conditional statement in the phptemplate_links function as follows:

if($links){
     $links = reorder_links($links, array('edit_node', 'comment_add'), array('quote'));
}

Otherwise, if the node/comment doesn't have links the reorder_links function will throw an error.

Mike

Veneer | Crack-proof Creative
http://www.veneerstudio.com

Civicsolar | Direct Solar Distribution
http://www.civicsolar.com

this worked - thanks!

This worked. I just pasted the function into my template.php and then added this to my theme_links function (I'm using the permalink and sharethis modules):

if($links){
     $links = reorder_links($links, array('node_read_more', 'comment_add', 'permalink'), array('sharethis_link'));
}

Giddyup!

It took me a while to understand where to put what (especially where to insert my keys) but in the end it worked. :)

To other visitors as thick as myself: put the keys (which in this case is the same as the css class, so easy to find) of the list items where 'first-link', 'second-link', 'last-link' are in the example.

Thanks a lot to all contributors to solve this problem, and of course especially to Linxor.

Thank you.

This has worked nicely for me. (I added it to template.php, but would have liked to have it live somewhere else, to help prevent accidental hammering)

hook_link_alter() is an alter-native

The same reordering can be done also in hook_link_alter(). It is easier to reorder in hook_link_alter() if you want the same order of links in multiple themes and/or if you do not want to implement new theme (or change an existing one).

Hi,Could with this solution

Hi,

Could with this solution also the $links stuff be placed on more than one line:
So you get:

"read more"
"email this page"
"unsubscribe"
etc..

Thanks a lot in advance for your reply!

greetings,
Martijn

You could just use css to put

You could just use css to put these on multiple lines. Something like: li.links {float:left} for all of them or clear:right to break it spmewhere specific.

Edit order without editing theme

Here is how:

<?php
/*
* Reorder node links to show the edit link first
*/
function hook_link_alter(&$links, &$node) {

  if( isset(
$links['node_edit_link']) ) {
   
   
$node_edit_link = $links['node_edit_link'];
    unset(
$links['node_edit_link']);
   
$links = array_merge(array('node_edit_link' => $node_edit_link), $links);
  }
}
?>

This being Drupal, there is

This being Drupal, there is now a module for that 8o)
http://drupal.org/project/linkweights

d7 slightly different syntax

you could tweak this or the reorder_links function - this is probably the best place though

<?php
function phptemplate_links($variables) {
  if(
$variables['links']) {
   
$links = reorder_links($variables['links'], array('comment-reply', 'quote', 'flag-thanks', 'comment-edit', 'comment-delete', 'flag-report'), array('last-link'));
   
$variables['links'] = $links;
  } 
  return
theme_links($variables);
}
?>
nobody click here