-
zen_back_link
The function zen_back_link, in /includes/functions/functions_general.php, does not account for pages (like password_forgotten) that remove themselves from the navigation history ($_SESSION['navigation']->remove_current_page()). If, for example, you use a stock v150 installation and go to Home, New Products, Login, Password Forgotten and then press the back button you will be taken to the new_products page instead of the login page.
Here's a rewrite (including my previously-reported validation issue) that corrects this problem:
Code:
////
// Set back button
function zen_back_link($link_only = false) {
/*-BOF rewrite lat9
if (sizeof($_SESSION['navigation']->path)-2 >= 0) {
$back = sizeof($_SESSION['navigation']->path)-2;
$link = zen_href_link($_SESSION['navigation']->path[$back]['page'], zen_array_to_string($_SESSION['navigation']->path[$back]['get'], array('action')), $_SESSION['navigation']->path[$back]['mode']);
} else {
if (isset($_SERVER['HTTP_REFERER']) && preg_match("~^".HTTP_SERVER."~i", $_SERVER['HTTP_REFERER']) ) {
//if (isset($_SERVER['HTTP_REFERER']) && strstr($_SERVER['HTTP_REFERER'], str_replace(array('http://', 'https://'), '', HTTP_SERVER) ) ) {
$link= $_SERVER['HTTP_REFERER'];
} else {
$link = zen_href_link(FILENAME_DEFAULT);
}
$_SESSION['navigation'] = new navigationHistory;
}
*/
$link = '';
$nav_size = sizeof ($_SESSION['navigation']->path);
if ($nav_size != 0) {
$back = $nav_size - 1;
if ($_SESSION['navigation']->path[$back]['page'] != $current_page || ($back--) != 0) {
$link = zen_href_link($_SESSION['navigation']->path[$back]['page'], zen_array_to_string($_SESSION['navigation']->path[$back]['get'], array('action')), $_SESSION['navigation']->path[$back]['mode']);
}
}
if ($link == '') {
if (isset($_SERVER['HTTP_REFERER']) && preg_match("~^".HTTP_SERVER."~i", $_SERVER['HTTP_REFERER']) ) {
$link= $_SERVER['HTTP_REFERER'];
} else {
$link = zen_href_link(FILENAME_DEFAULT);
}
$_SESSION['navigation'] = new navigationHistory;
}
$link = str_replace('&', '&', $link); //-lat9- Validation issue
if ($link_only == true) {
return $link;
} else {
return '<a href="' . $link . '">';
}
}
-
Re: zen_back_link
I messed that up; size vs. index of arrays (arggh). Changes are highlighted in red. Note that the result still might be incorrect if the navigation history in the session is empty and the HTTP_REFERER is the current page.
Code:
////
// Set back button
function zen_back_link($link_only = false) {
/*-BOF rewrite lat9
if (sizeof($_SESSION['navigation']->path)-2 >= 0) {
$back = sizeof($_SESSION['navigation']->path)-2;
$link = zen_href_link($_SESSION['navigation']->path[$back]['page'], zen_array_to_string($_SESSION['navigation']->path[$back]['get'], array('action')), $_SESSION['navigation']->path[$back]['mode']);
} else {
if (isset($_SERVER['HTTP_REFERER']) && preg_match("~^".HTTP_SERVER."~i", $_SERVER['HTTP_REFERER']) ) {
//if (isset($_SERVER['HTTP_REFERER']) && strstr($_SERVER['HTTP_REFERER'], str_replace(array('http://', 'https://'), '', HTTP_SERVER) ) ) {
$link= $_SERVER['HTTP_REFERER'];
} else {
$link = zen_href_link(FILENAME_DEFAULT);
}
$_SESSION['navigation'] = new navigationHistory;
}
*/
$link = '';
$nav_last = sizeof ($_SESSION['navigation']->path) - 1;
if ($nav_last > 0) {
$back = $nav_last - 1;
if ($_SESSION['navigation']->path[$back]['page'] != $current_page_base || (--$back) > 0) {
$link = zen_href_link($_SESSION['navigation']->path[$back]['page'], zen_array_to_string($_SESSION['navigation']->path[$back]['get'], array('action')), $_SESSION['navigation']->path[$back]['mode']);
}
}
if ($link == '') {
if (isset($_SERVER['HTTP_REFERER']) && preg_match("~^".HTTP_SERVER."~i", $_SERVER['HTTP_REFERER']) ) {
$link= $_SERVER['HTTP_REFERER'];
} else {
$link = zen_href_link(FILENAME_DEFAULT);
}
$_SESSION['navigation'] = new navigationHistory;
}
$link = str_replace('&', '&', $link); //-lat9- Validation issue
if ($link_only == true) {
return $link;
} else {
return '<a href="' . $link . '">';
}
}