« 1 2 3 »
Autor Zpráva
TSD
Profil
Toto není dotaz, naopak všeobecná rada na otázku "Jak udělat přepínání stránek na webu, aniž bych v nich musel opakovat obsah - menu, hlavička atd?" Kdysi se na to používaly rámy, dnes se používá php funkce include. Její použití je tak jednoduché, že se toho nemusí bát ani někdo bez znalosti php.

Řekněme, že mám záměr udělat webík o této struktuře:

 ------------------ 
|  záhlaví         |
 ------------------ 
|m |               |
|e |   obsah       |
|n |               |
|u |               |
 ------------------ 
|  pata            |
 ------------------ 


Klikáním na položky menu chci přepínat obsah toho, co je v části 'obsah'.
Jsou v zásadě dvě řešení. Podstata obou je stejná: využití php funkce include. Z toho vyplývá, že jednak úvodní stránka webu se musí jmenovat index.php (nikoliv html) a jednak tam kde soubor leží, musí php běžet. Na většině běžných (i free) hostingů php běží, pokud u vás ne, za peníze běží všude.

Řešení 1: Includovat obsah

Soubor index.php bude vypadat takto: (obsah hlavičky a stylování pro tento příklad neřeším)

<html>
<head>
</head>
<body>

<div id="zahlavi">
Obsah záhlaví
</div>

<div id="levemenu">
<ul>
<li><a href="index.php?stranka=uvod">Úvod</a></li>
<li><a href="index.php?stranka=druha">Druhá stránka</a></li>
<li><a href="index.php?stranka=posledni">Poslední stránka</a></li>
</ul>
</div>

<div id="obsah">
<?
if (!isset($_REQUEST['stranka'])) { include ("uvod.html"); };
if ($_REQUEST['stranka'] == 'uvod' ) { include ("uvod.html"); };
if ($_REQUEST['stranka'] == 'druha' ) { include ("druha.html"); };
if ($_REQUEST['stranka'] == 'posledni' ) { include ("posledni.html"); };
?>

</div>

<div id="zapati">
Obsah zápatí
</div>

</body>
</html>



Ve stejné složce jako index.php, budou soubory uvod.html, druha.html, posledni.html.
V nich bude POUZE to, co se má vložit do divu "obsah". Zapomeňte na <head>, na menu a podobně. Příklad souboru uvod.html:

<p>
Toto je úvodní stránka a nazdar
</p>



Řešení 2: Includovat obal

Totéž naruby. Všechny soubory budou mít stejnou stavbu, ale budou obsahovat jen svůj vlastní obsah a dva řádky include, které zařídí vložení společných částí stránek.
Obsah index.php:

<? include ("uvod.txt"); ?>
<p>
Toto je úvodní stránka a nazdar
</p>
<? include ("konec.txt"); ?>


Ve stejné složce budou soubory uvod.txt:

<html>
<head>
</head>
<body>

<div id="zahlavi">
Obsah záhlaví
</div>

<div id="levemenu">
<ul>
<li><a href="index.php">Úvod</a></li>
<li><a href="druha.php">Druhá stránka</a></li>
<li><a href="posledni.php">Poslední stránka</a></li>
</ul>
</div>

<div id="obsah">



a konec.txt:


</div>

<div id="zapati">
Obsah zápatí
</div>

</body>
</html>


Příponu můžou mít samozřejmě jakoukoliv, ale podle mého názoru nejde ani o html, ani php, tak tomu říkám txt.

Funkční jsou obě řešení. První se asi používá častěji. Když jsem to druhé kdysi chtěl použít, po nějaké době jsem byl nucen překopávat to do prvního a nebyla to příjemná práce.
Jakékoliv upřesňující nebo opravné komentáře (třeba css?) vítám, příspěvky typu "skvělé" nebo "blbost" si prosím ušetřete, nebylo by špatné mít z toho příspěvku kompaktní návod (případně čištěný od balastu moderátory).
Str4wberry
Profil
1. Tématu jsem přidal důležitost.
2. Není řešena změna titulku.
3. Není řešeno zvýraznění aktuální stránky.
4. „Výchovně“ bych nahradil <div id="levemenu"><ul> za <menu>.

Obdobný (snad kompaktní) návod jsem napsal zde.
TSD
Profil
Str4wberry
2. 3. - to je záměr. Návod je určen těm, co php neznají a smyslem bylo neodradit začátečníka komplikacemi. Dobře si pamatuju, jaký útok na moje html jistoty první použití php znamenalo :)
4. zvažoval jsem, nakonec jsem to napsal takhle.

Mohl bys prosím tě smazat mou diskusi s Noxem? Řekl bych, že se ukázalo, že byla zbytečná a návod jako takový to nijak nerozšiřuje. Myslím že Nox by nic nenamítal.
karbon
Profil *
if ($_REQUEST['stranka'] == 'uvod' ) { include ("uvod.html"); };
Request bych v žádném případě nepoužíval a už vůbec bych ho nedával do příkladu pro začátečníky.
Tommy4
Profil
Dobrý návod! Určitě to použiju, bude tím i snadnější a přehlednější editace webu.
rorejs
Profil *
Tohle je pěkné řešení. Já jsem pro podobný účel použil iframe, v něm mám menu a některé další společné prvky webu, každá stránka ale obsahuje hlavní obsah přímo. Kdyby byl samotný obsah v iframe, vyhledávač by mohl zaindexovat jenom ten a uživatel by to pak viděl bez menu... Zajímalo by mě jestli tímhle neduhem trpí i vaše řešení s include, případně jaké jsou jeho výhody. Předem díky za výklad.
joe
Profil
karbon
Proč bys nepoužíval $_REQUEST? Já bych ho naopak použil namísto $_GET nebo $_POST.
Medvídek
Profil
jeste bych pridal fci file_exist :)

používám:
                if(isset($_GET["stranka"]))
               {
                $stranka=$_GET["stranka"];
                if(file_exists("_".$stranka.".php"))
                {
                 include "_".$stranka.".php";
                }
                else
                {
                 include "404.php";
                }
               }
               else
               {
                if(file_exists("_domu.php"))
                {
                 include "_domu.php";
                }
                else
                {
                include "404.php";
                } 
               }
Mastodont
Profil
TSD:
Obě tvoje řešení mají ten problém, že nemůžeš měnit nabídku, jen obsah. Proto bych doporučil spíš běžný postup z různých template enginů, kdy máš šablonu stránky se zástupnými značkami, které nahradíš vytvořeným obsahem, nabídkou apod.


<html>
<head>
</head>
<body>

<div id="zahlavi">
{ZAHLAVI}
</div>

<div id="levemenu">
{NABIDKA}
</div>

<div id="obsah">
{OBSAH}
</div>

<div id="zapati">
{ZAPATI}
</div>

</body>
</html>
TSD
Profil
rorejs
Kdyby byl samotný obsah v iframe, vyhledávač by mohl zaindexovat jenom ten ... Zajímalo by mě jestli tímhle neduhem trpí i vaše řešení s include

Netrpí. Include funguje na serveru. To co odchází ke klientovi, ať už je to prohlížeč nebo vyhledávač, je jedna seskládaná stránka. Přesně taková, jako by to bylo v případě, kdyby na serveru leželo pět html stránek s naprosto stejným záhlavím, menu a zápatím.


Medvídek
Tvoje varianta obsahuje bezpečnostní rizika, o kterých ale víš a eliminuješ je tím podtržítkem.
Já mám prostě natvrdo seznam stránek a každá z nich má přiřazen jeden string, který ji vyvolává. Tvoje řešení je univerzální, moje ale nepotřebuje file_exist, navíc mi připadá přehlednější :)



Mastodont
Nepochopil jsem. Nevím proč bych nemohl měnit nabídku. Přidat do menu novou stránku rovná se vložit nový soubor do složky a napsat jeden řádek
<li><a href="treti.php">Třetí stránka</a></li>

Navíc to co píšeš, je totéž co jsem napsal já, já jsem jen vypsal to, co ty shrnuješ jako {NABIDKA} apod., což stejně musí být někde definováno.
Mastodont
Profil
TSD
Já mám na mysli dynamickou změnu, třeba:
- přidání údajů pro přihlášeného uživateli (pokud je přihlášen), třeba seznam naposledy čtených článků
- box pro přihlášení / tlačítko odhlášení
- nabídka reagující na to, v které části webu právě jsi
To se staticky dělat nedá.
lingvista
Profil *
joe
Proč bys nepoužíval $_REQUEST? Já bych ho naopak použil namísto $_GET nebo $_POST.
Kód je pak méně přehledný a použití REQUEST může být za určitých okolností nebezpečné.
lordfrikk
Profil
$_REQUEST rozhodně nepoužívat. Neexistuje nic, co by bez něj nešlo udělat a to, že si někde takto zcela nepatrně ulehčíte může přijít později hodně draho. Osobně s PHP pracuju přes 2 roky a $_REQUEST jsem nepoužil ani jednou.
joe
Profil
Nevím nevím s tím $_REQUEST...

Zajímalo by mě, v jakém případě bude jeho použití nebezpečné a naopak, proč by mělo kód znepřehledňovat, to je nesmysl.
Kód je pro mě přehledný, pokud je správně odsazován text nebo chceš mi snad říct, že použitím jiné proměnné je pro tebe kód méně přehledný?!
Dranel
Profil
Mastodont
Já mám na mysli dynamickou změnu...
Ale includované soubory mohou být přeci také *.php a tím pádem mohou být také dynamické. Stačí jedna podmínka a další položku v menu buďto zobrazíš, či ne (třeba na základě přihlášení).
srigi
Profil
Ta prva moznost riesenia ma logicku chybu
<div id="obsah">
<?
if (!isset($_REQUEST['stranka'])) { include ("uvod.html"); };
if ($_REQUEST['stranka'] == 'uvod' ) { include ("uvod.html"); };
if ($_REQUEST['stranka'] == 'druha' ) { include ("druha.html"); };
if ($_REQUEST['stranka'] == 'posledni' ) { include ("posledni.html"); };
?>

</div>
Co sa asi stane ak si vyziadam URL www.example.com?stranka=fero ? No nesplni sa ani jedna podmienka a dostanem prazdny obsah. Ja by som odporucal opravit, tak, ze ak je URL nezmyselne, treba includovat vzdy uvod.html. Odporucam pouzit konstrukciu switch/case/default.
Str4wberry
Profil
Reakce na srigiho:
treba includovat vzdy uvod.html
Spíš zobrazit chybovou stránku.
Mastodont
Profil
Dranel
Ale tady se do nabídky nic neincluduje, tam jsou jen A tagy :-)
lordfrikk
Profil
Ad $_REQUEST... citace je odtud:

Please do not encourage the use of $_REQUEST. You might as well just tell people to enable register_globals again. Use $_GET, $_POST, $_SESSION, $_COOKIE, $_SERVER, etc. for the appropriate source of data. $_REQUEST is laziness and introduces most of the same issues that was the reasoning behind disabling register_globals to begin with.

Prosím nedoporučujte, aby lidé používali $_REQUEST. Stejně tak jim můžete rovnou říct, ať si zase zapnou register_globals. Používejte $_GET, $_POST, $_SESSION, $_COOKIE, $_SERVER atd. pro jednotlivé zdroje dat. $_REQUEST je jenom o lenosti a jde ruku v ruce s většinou stejných problémů, které nakonec zapříčinily defaultní vypnutí register_globals.

Jediný, kdo vždycky obhaujeje $_REQUEST, jsou nováčci nebo lidé, kteří nemají s PHP mnoho zkušeností. Je to prostě špatný zvyk, takže doporučuju se jej zbavit.

Dále se píše...

Every application using $_REQUEST is most probably vulnerable to Delayed Cross Site Request Forgery problems. (This basically means if e.g. a cookie named (age) exists it will always overwrite the GET/POST content and therefore unwanted requests will be performed).

Každá aplikace, která používá $_REQUEST je s největší pravděpodobností napadnutelná za pomocí útoku zvaného Delayed Cross Site Request Forgery. (Což jednoduše řečeno znamená, že pokud budeme mít např. cookie pojmenovanou age pak vždy přepíše všechen obsah z GET/POST a tudíž pak skript provádí nechtěné požadavky).

Někdo může namítnout, že pořadí, v jakém jsou proměnné ukládány do $_REQUEST (mimojiné) se dá změnit za pomocí direktivy variables_order v php.ini. Např.: variables_order ECGPS. Tímto PHP říkáte že má ukládat data ze zdrojů v pořadí $_ENV, $_COOKIE, $_GET, $_POST, $_SERVER. To by bylo možná ještě hloupější než používat $_REQUEST tak jak je defaultně, protože jakýkoli GET/REQUEST požadavek přepíše existující cookie se stejným jménem... následky jsou nedozírné.... viz. např. Session Fixation.

Takže asi takhle.
joe
Profil
lordfrikk
Pěkný :-) Ale podle toho co jsi napsal, resp. převzal z těch stránek, hrozí „nebezpečí“ (řekl bych, že při obyčejných stránkách hrozí nulové), jen pokud $_REQUEST použiješ namísto $_COOKIES, $_SESSION.
Navíc si nemyslím, že bych byl začátečník a že by to používali jen začátečníci, dříve jsem používal taky $_GET, $_POST, ale pak jsem odkoukal od větčích odborníků právě $_REQUEST. To znamená, že pokud $_REQUEST použiješ jen namísto $_GET a $_POST, je to bezproblému nebo chceš tvrdit, že snad ne? Usnadní to pak pozdější přepis kdyby ses rozhodl řešit jestli data budeš posílat $_GET nebo $_POST.
staki
Profil *
ako si dám mp3 player aby hral na každej stránke.Urobil som stránku podľa prvej navigácie.
staki
Profil *
potrebujem aby hral plynule ak prejdem s uvodnej stranky napriklad na galeriu. ďakujem
staki
Profil *
potrebujem aby hral stále keď prechádzam so stránky na stránku. Teraz sa mi stále načítava odznova.
lordfrikk
Profil
joe: Řekni mi, který odborník to používá, rád se sám přesvědčím. Já jsem osobně za x let co dělám s PHPkem nenarazil na jediné doporučení používání $_REQUEST.

Dejme tedy čistě teoreticky tomu, že $_REQUEST není zatížen žádným bezpečnostním rizikem. Proč ho používát místo $_GET a $_POST? Mě se za celou dobu co s PHP dělám nestalo, že bych nevěděl, jestli tahám data z GET nebo POST. Jediný důvod je, že je člověk líný.

staki: Můžeš umístit ten obsah do iframe a přehrávač zůstane "venku" nebo můžeš obsah načítat za pomocí AJAXu. A přístě prosím použij Editaci (napravo u příspěvku) namísto posílání 4 příspěvků za sebou.
Martin Dostal
Profil
Já teda taky používam _REQUEST. Je to podle mě čistější. Protože si v hlavním index.php z requestu přetaham data do proměnný, které pak předávam objektům. A ať už tam pošlu data z formuláře, nebo jen přes odkaz, tak to funguje vždy.

A zabezpečení si stejně člověk musí udělat sám - např. s užitím SESSION, mod rewrite apod.

Jo a jakej je problém s REQUESTEM ? Já tam žádný bezpečnostní riziko nevidim.
Adam Zábranský
Profil
A přístě prosím použij Editaci (napravo u příspěvku) namísto posílání 4 příspěvků za sebou.
nemůže, když není zaregistrovaný :)
mates75
Profil *
Zdravim,
Jsem PHP analfabet.
Testnul jsem ten prvni priklad - je to OK
Vytvoril jsem si tabulku
------------------
| záhlaví |
------------------
|m | |
|e | obsah |
|n | |
|u | |
------------------
| pata |
------------------

Linky v v casti menu krasne volaji stranky do bunky OBSAH v tabulce.

Nedokazu ale vyresit to, kdyz text v casti OBSAH bude obsahovat nejaky link jehoz klikem
bych potreboval nacist jiny obsah, tak aby okoli (zahlavi, menu, pata) zustaly zachovany.

Muzete mi prosim poradit ??
lordfrikk
Profil
Jo a jakej je problém s REQUESTEM ? Já tam žádný bezpečnostní riziko nevidim.
Možná kdybys použil oči ke čtení (např. o pár příspěvků výše), tak bys ho možná i VIDĚL.
Bart
Profil
Chci se zeptat jestli by šlo měnit obsah stránek, ale všechna data by byla uložena v index.php. Prostě abych nemusel vytvářet stránky prvni.txt, druhy.txt atd. Podle toho na co bych klikl tak by se vybral daný obsah a ostatní by zůstalo na serveru.
joe
Profil
lordfrikk
To žádné riziko není zdá se mi. Použitím $_POST/$_GET nebo $_REQUEST to vyjde nastejno.
« 1 2 3 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0