Tlačítko zpět v PHP

Ukázka, jakým způsobem lze řešit tlačítko zpět. Filosofické úvahy typu "proč suplovat na stránkách funkci prohlížečů" pominu a ukážu pouze praktické řešení s alternativou v javascriptu.

Vystačíte-li si s javascriptem, stačí udělat velmi jednoduchý odkaz.

<a href="javascript:history.go(-1)">Zpet</a>

Následující kód se podívá do historie prohlížeče a zobrazí předposlední zobrazenou stránku.

Jistě, je to řešení. Ale má to malinkou vadu na kráse. To, že si javascript může člověk vypnout sice je argument, ale v dnešní době by si takový člověk moc stránek asi nezobrazil.

Dalším argumentem proti javascriptu může být fakt, že návštěvník přišel z vyhledávače nebo katalogu. Výše zmíněný kód by návštěvníka po stisku odkazu „zpět“ vrátil na vyhledávač, což asi také např. majitel eshopu nechce. I tento problém lze vyřešit pomocí javasciptu.

<a href="javascript:history.go('pecan.cz')">Zpet</a>

Tento kód návštěvníka vrátí na poslední navštívenou stránku, která obsahuje „pecan.cz“. Takový odkaz „zpět“ ale může vést za určitých okolností ke zmatení návštěvníka.

PHP

Následující řešení v php bude zobrazovat odkaz zpět pouze tehdy, má-li to význam.

Využijeme sessions a dvě funkce, které se nám budou o sessions starat. Funkce budou uložené v externím souboru funkce.php.

<?php
/**
* Správa session, zaznamenávání historie navštívených stránek.
*/
function GoBackHandler()
{
  // spočítáme počet klíčů v poli
  $pocet = count($_SESSION['BACK_URL']);

  // pokud není poslední položka stejná jako aktuální stránka budeme pokračovat
  if($_SESSION['BACK_URL'][$pocet - 1] != $_SERVER['REQUEST_URI'])
  {
    // pokud se nejedná o krok zpět, přidáme aktuální stránku do session
    if(!isset($_GET['GoBack']))
    {
      $_SESSION['BACK_URL'][] = $_SERVER['REQUEST_URI'];
    }
    else
    {
      // jedná se o krok zpět, poslední položku v poli tedy chceme smazat.
      if(is_array($_SESSION['BACK_URL']))
      {
        // smažeme poslední položku v poli.
        array_pop($_SESSION['BACK_URL']);
      }
    }
  }
}// GoBackHandler


/**
* Funkce vrací odkaz na poslední navštívenou stránku.
* @return string
*/
function GoBackLink()
{
  // je pole?
  if(is_array($_SESSION['BACK_URL']))
  {

    /*
    echo "<pre>";
    var_dump($_SESSION['BACK_URL']); // pomoc při testování - echuje obsah session
    echo "</pre>";
    */


    // spočítá počet prvků v poli a vrátí nám klíč předposledního pole.
    $last = count($_SESSION['BACK_URL']) - 2;

    // pokud takový klíč pole existuje, vypíše odkaz zpět
    if(array_key_exists($last, $_SESSION['BACK_URL']))
    {
      // Spočítáme, kolik je v posledním odkazu otazníků. Do odkazu potřebujeme dát informaci, že se jedná o krok zpět.
      $question_mark  = substr_count($_SESSION['BACK_URL'][$last],"?");
      if($question_mark  >= 1){
        $QueryString = "&GoBack";
      }else{
        $QueryString = "?GoBack";
      }

      // Vrátíme odkaz na stránku zpět.
      return "<a href='".$_SESSION['BACK_URL'][$last].$QueryString."'>Zpět</a>";
    }
  }
  return false;
} // GoBackLink
?>

Praktická ukázka použití funkcí:

<?php
  session_start(); // nastartujeme session - musí být na každé stránce!
  include_once "funkce.php";

  GoBackHandler(); // Správa historie.
?>
<html>
  <head>
    <title>Zpět v php</title>
  </head>
  <body>
    Text....
    <?php
      echo GoBackLink(); // zobrazení odkazu "Zpět"
    ?>
  </body>
</html>

Funkční online ukázku naleznete na adrese pecan.cz/ukaz­ky/zpet.

Stažení ukázkového příkladu – zde.


<Starší | tento článek | Novější

Napsáno: 20. 5. 2008, 13:09 | Přečteno: 10703x | Kategorie: PHP Skripty | Napsal: peCan.cz |
Komentáře: 13
.:. Hologos

První :-D Už jsem myslel, že to tu umřelo, ale naštěstí ještě ne. Jinak dobrá práce Pecane, jen tak dál!

Odpověď | 2008-05-20 18:25:45

Po svatáku si to prostuduji. :-D

Odpověď | 2008-05-20 19:04:52
.:. foxkill3r

Off topic : Bude nejaka nova verze min irs? Uz se resim :-)

Odpověď | 2008-05-21 21:04:06

Hologos: dík, pokusím se ;-)

Lord AgEnT: Tak pevné nervy a šťastnou ruku!

foxkill3r: zatím nevím, vím jen to, že jsem tam přidával nové věci psané pro PHP5, takže pokud něco vydám, bude to php4 nekompatibilní.

Odpověď | 2008-05-22 09:06:07
.:. cup | www | mail

Pecane tak tohle se ti povedlo hled to aplikuju k sobe misto javascript –1 :-D :-) fakt pěkný … jen tak dál

Odpověď | 2008-05-31 12:00:35
.:. error414-

neni poro seo lepsi tam rovnou hodit primej link, nez jen goback?

Odpověď | 2008-06-03 13:26:25
.:. Leo

Možná by bylo lepší napsat to session_start(); napsat na začátek souboru funkce.php

Odpověď | 2008-07-02 12:00:20
.:. Kcko

To si nemyslim tedy. session_start se ma poustet ve startovacim souboru a ne v nejakym, ktery nekam includujes … , neprispiva to na citelnosti

Odpověď | 2008-07-15 14:15:28
.:. Mirun | www | mail

měl bys připojit upozornění, že toto řešení vylučuje cacheování stránek, takže při každém požadavku se musí vygenerovat nová stránka

Odpověď | 2008-08-01 19:16:35
.:. Suro | www

Ahoj peCan, po dlhanskej dobe som to tu objavil :) nuz, celkom som sa pobavil, teda nemyslim to v zlom, samozrejme javascriptove tlacitko s5 ma nevyhodu pri vypntom JS, ale pisat 30 riadkovy script i tak si myslim ze ludia, ktori sa do internetu nevyznaju pouzivaju radsej tlacitka na prehliadaci a ti ktori nim ziju maju na to uz svoje metody :) ako napriklad gestikury alebo klavesove skratky :) ale zas „why not“ :)

Odpověď | 2008-10-21 21:35:08
.:. srth | www | mail

srthsrth

Odpověď | 2008-11-22 13:49:26
.:. Stava | www | mail

Diky, hodilo se. Stava

Odpověď | 2009-01-14 18:22:25
.:. dfsdf

<script> alert(‚ahoj‘); </script>

Odpověď | 2009-10-04 20:05:32
Přidej komentář
Jméno
Web
Mail
Kontrola Zadejte číslo pět
Text

:-)
:-D
:-(
|-/
:-[]
;-)
8-|
8-o
Zde formátuje Texy! (syntaxe)
  • Příklad formátování příspěvku:

    **Tlustě**
    *Kurzíva*
    "Odkaz":http://neco.cz nebo http://neco.cz (i www.neco.cz)
    /---code php
    php kód
    \---

  • Pro odeslání zprávy můžete použít klávesovou zkratku Alt+S. (Podporují jen některé prohlížeče)
  • HTML znaky budou převedeny na entity.
  • Vyjadřujte se tu jako doma, ať víme jak to u Vás vypadá.
  • Odkazy začínající http:// budou automaticky převedeny na odkazy , nepoužívejte však v jednom příspěvku více jak 3 - to dělají jen spam roboti:-)
Víte kdy jste maximálně opilí? Když nezvládáte bez cizí pomoci ležet na zemi.
Petr Graubner | ICQ- 264912843, Jabber - pecan27@njs.netlab.cz | RSS | Šlape na miniRS | Styl CoolStyle | Zpracováno za: 0.506s | Počet SQL dotazů ve fóru: 1 | Admin