3

I want to extend Nodes with the title of the parentnode so I can display a hierarchy link.

I have a solution that sometimes works:

function modulename_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) 
{
    switch ($op) 
    {
        case 'view':
        loadParentTitle($node);
        break;
    }
}

function loadParentTitle(&$node)
{
    $title = $node->title;
    $query = "SELECT mlid, p1, p2,p4,p5,p6,p7,p8,p9  FROM menu_links WHERE link_title like '%%%s%%'";

    $data =  db_fetch_array(db_query($query, $title));

    $mlid = $data["mlid"];
    $i = 9;
    while (($data["p". $i] == 0 || $data["p". $i] == $mlid) && $i >= 0) 
    {
        $i--;
    }
    if ($i > 0)
    {
        $query = "SELECT `link_title` as parentTitle from  `menu_links` WHERE  mlid = " . $data["p" . $i]; 
        $data =  db_fetch_array(db_query($query));
        $parentTitle = ($data["parentTitle"]);
    }
    else
    {
        $parentTitle = $title;
    }
    $node->content['#parentTitle'] = $parentTitle;
}

This works as long as the title of the item is the same as the Menu Title. However i'm looking for a solution that will work all the time. Any ideas?

wasigh
  • 895
  • 1
  • 11
  • 21
  • what is it you call parent node? you mean in menus? btw, if you're looking for breadcrumbs, try the Custom Breadcrumbs module (http://drupal.org/project/custom_breadcrumbs) – Capi Etheriel May 06 '10 at 00:34
  • Yes, I mean the parent node in the menu. I'm not looking for breadcrumbs. I want to render the link/title of the parent in the content of the node. – wasigh May 06 '10 at 07:44

1 Answers1

5

You did not specify really what do you mean by 'parent node' but the mlid of the parent of a menu link is stored in menu_links.plid. Now, the link_path is going to be node/nid and you can fetch the title from there.

$mlid = db_result(db_query("SELECT plid FROM {menu_links} WHERE link_path = 'node/%d'", $node->nid));
$link_path = db_result(db_query("SELECT link_path FROM {menu_links} WHERE mlid = %d", $mlid));
$title = db_result(db_query("SELECT title FROM {node} WHERE nid = %d", substr($link_path, 5));

The first two queries can be unified by a JOIN but I strongly recommend against getting the third in there too (you can with CONCAT('node/', nid) = parent.link_path) because that is not going to be indexable. These three queries should be practically instant.

P.S. You won't forget to check_plain($title) before printing, would you? :)

demongolem
  • 9,474
  • 36
  • 90
  • 105
chx
  • 11,270
  • 7
  • 55
  • 129
  • Tnx, works like a charm! There is minor syntax error: you forgot a parenthesis at the end of every line. Off course i'll check_plain ;) , tnx for the tip! – wasigh May 29 '10 at 16:21