PHPBear Posted January 5, 2014 Share Posted January 5, 2014 0down votefavorite I just converted a query that displays "bread crumbs" style navigation links to PDO: function get_path($dbh,$node,$TopnavTable, $TopnavName) { $stmt = $dbh->prepare("SELECT name FROM $TopnavTable WHERE $TopnavName = ?"); $stmt->bindValue(1,$node); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); $row = $stmt->fetch(); $path = array_merge(get_path($pdo,$row['Parent'], $TopnavTable, $TopnavName), $path); return $path ; } I also figured out a way to display the results: $Path2 = explode("/", $path); $Path2[1] = '<a href="/Topics">'.$Path2[1].'</a>'; $Path2[2] = '<a href="/Topics/'.$Path2[2].'">'.$Path2[2].'</a>'; $Path2[3] = '<span class="navHere"><b>'.$Path2[3].'</b></span>'; echo join( $Path2, ' > ' ); However, it only works only if I'm working with an array consisting of three segments. For example, I'm viewing the URL MySite/Topics/Washington/Governor, which displays the following bread crumbs trail: Topics > Washington > Governor If I view MySite/Washington, it should display... Topics > Washington But I get an error message: Undefined offset: 3, plus there's a trailing arrow (>) after Washington. So I'm trying to figure out how to make this work with any number of segments - 2, 3, 6, etc. Regardless of the number of segments, I'd like the last segment to be unlinked. (I'm going to further put it inside a span.) Does anyone have any tips? (If there's a completely different way of doing it that's better, I'd love to hear about it.) Link to comment https://forums.phpfreaks.com/topic/285113-need-help-with-bread-crumbs-nav-links-arraypath/ Share on other sites More sharing options...
hansford Posted January 5, 2014 Share Posted January 5, 2014 $str = 'path1/path2/path3'; $path = explode('/',$str); $size = count($path); for($i = 0; $i < $size; $i++) { if($i == $size - 1) { $link = htmlentities('<span class="navHere"><b>' . $path[$i] . '</b></span>'); } else { $link = htmlentities('<a href="/Topics">' . $path[$i] . '</a>'); } $path[$i] = $link; } echo join($path, ' > '); Link to comment https://forums.phpfreaks.com/topic/285113-need-help-with-bread-crumbs-nav-links-arraypath/#findComment-1463958 Share on other sites More sharing options...
PHPBear Posted January 5, 2014 Author Share Posted January 5, 2014 Thanks, Hansford. I think that's the ticket, though I'm doing something wrong. I modified your code a bit to match my query and came up with this: function get_path($dbh,$node,$TopnavTable, $TopnavName) { $stmt = $dbh->prepare("SELECT name FROM $TopnavTable WHERE $TopnavName = ?"); $stmt->bindValue(1,$node); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); $row = $stmt->fetch(); $path = array_merge(get_path($pdo,$row['Parent'], $TopnavTable, $TopnavName), $path); return $path ; } $Path2 = explode("/", $path); $size = count($Path2); for($i = 0; $i < $size; $i++) { if($i == $size - 1) { $link = htmlentities('<span class="navHere"><b>' . $Path2[$i] . '</b></span>'); } else { $link = htmlentities('<a href="/Topics">' . $Path2[$i] . '</a>'); } $Path2[$i] = $link; } echo join($Path2, ' > '); It works fine except that the links display as plain text. Can you see what I did wrong? Link to comment https://forums.phpfreaks.com/topic/285113-need-help-with-bread-crumbs-nav-links-arraypath/#findComment-1463960 Share on other sites More sharing options...
PHPBear Posted January 5, 2014 Author Share Posted January 5, 2014 I just discovered that the links are properly hidden in the code if I remove the htmlentities thing... $link = '<span class="navHere"><b>' . $Path2[$i] . '</b></span>'; However, in the string Topics > Washington > Governor, Topics and Washington are both linked to /Topics. Link to comment https://forums.phpfreaks.com/topic/285113-need-help-with-bread-crumbs-nav-links-arraypath/#findComment-1463961 Share on other sites More sharing options...
hansford Posted January 5, 2014 Share Posted January 5, 2014 Yeah, I like to store in non-html chars. This code will remove the last span tag if it's not necessary. //keep all paths with '/' symbol - even the last one $str = 'path1/path2/path3/path4'; $path = explode('/',$str); //remove last array element with / symbol and no path array_pop($path); $size = count($path); for($i = 0; $i < $size; $i++) { //if on the first and last array element - don't add > symbol and break loop if($size == 1) { $link = htmlentities('<a href="/Topics">' . $path[$i] . '</a>'); $path[$i] = $link; break; } //if on the last array element - don't add > symbol if($i == $size - 1) { $link = '<span class="navHere"><b>' . $path[$i] . '</b></span>'; } else { //else add > symbol $link = '<a href="/Topics">' . $path[$i] . '</a> > '; } $path[$i] = $link; } //no need to join with > symbol echo join($path, ''); Link to comment https://forums.phpfreaks.com/topic/285113-need-help-with-bread-crumbs-nav-links-arraypath/#findComment-1463963 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.