Autor | Zpráva | ||
---|---|---|---|
Joan Profil |
#1 · Zasláno: 17. 2. 2011, 21:07:00
Hezký večer,
pochopila jsem a úspěšně zpracovala jeden parametr v adrese, takže do index.php obohaceného o menu s odkazy s parametrem načítám obsahy jednotlivých stránek. Použítí druhého parametru už mi ovšem vyhazuje obsah stránky mimo tento index.php a navíc vidím rozsypaný čaj místo diakritiky, protože stránka se přepne do quirku a z UTF-8 do Windows-1250. Inspirovala jsem se touto stránkou (popravdě, jinou tohoto typu jsem nenalezla...) a sesmolila jsem pokusný kód s tímto tvarem odkazů: <ul id="menu"> <li><a href="?str=uvod"<?php if($_GET['str']=="uvod") echo 'class="vybr"';?>>Úvodní stránka</a></li> <li><a href="ovoce.php?str=ovoce"<?php if($_GET['str']=="ovoce") echo 'class="vybr"';?>>Ovoce</a></li> <li><a href="zelenina.php?str=zelenina"<?php if($_GET['str']=="zelenina") echo 'class="vybr"';?>>Zelenina</a></li> <li><a href="?str=koreni"<?php if($_GET['str']=="koreni") echo 'class="vybr"';?>>Koření</a></li> </ul> Skript pro jeden parametr jsem nalezla tady ale mám ho už trochu "upravený" v zatím marné snaze dosáhnout kýženého výsledku: <?php if(isset($_GET['vyber'])) { $vyber = $_GET['vyber']; include ($_GET['vyber']).php; } if(isset($_GET['str'])) { $str = $_GET['str']; } if (isset($_GET['str']) && preg_match('/^[a-z0-9_\-]+$/', $_GET['str'])) { include file_exists("../pokus/{$_GET['str']}.php") == true ? dirname(__FILE__)."/{$_GET['str']}.php" : dirname(__FILE__)."/404.php"; } else { include dirname(__FILE__)."/uvod.php"; } ?> Moje představa je velmi přesná: chci, aby se stránky i adresa zobrazovaly stejně, jako má Yuhů na jakpsatweb.cz kde na úvodní straně má na výběr HTML, CSS, JS... a při klikání na odkazy stále zůstává označená aktivní položka a adresa má složkovitý tvar (to později upravím přes mod_rewrite). Dám sem svůj názorný hokus-pokus i když jsem zmatená tím, že na localhostu (WAMP s PHP 5.3.0) se mi úvodní i poslední stránka v menu normálně natáhne, kdežto na své subdoméně (PHP 5.3.5) i na Swebu (PHP 5.2.13) jsou tyto stránky nenalezeny (chyba 404) - přitom jsem přesně zkopírovala složku z WAMPu na server. Netuším, co je jinak a hlavně jak úspěšně vecpat druhý parametr do adresy. Pevně doufám, že mi nějaká dobrá duše poradí, moc děkuji předem! |
||
unlucky Profil |
#2 · Zasláno: 18. 2. 2011, 04:45:34 · Upravil/a: unlucky
ahoj, tyhle 2 skripty fungujou v pohode ale musis to udelat takhle:
mas uvodni stranku kde mas menu a Hlavni obsah. Udelas podminku, ze pokud bude existovat get str, tak includnes/vlozis do hlavniho obsahu tu stranku (pouze obsah) Takze v tomto pripade neni zapotrebi zelenina.php?str=zelenina ale pouze ?str=zelenina. (zelenina.php?str=zelenina je porad 1 promenna. 2 prommene by byly ?str=zelenina&promenna=neco ) a u menu je lepsi udelat pres switch case, je to rychlejsi a prehlednejsi $zelenina=""; $ovoce=""; switch ($neco){ case tohle": $zelenina="class=vybr"; break; case tahle": $ovoce="class=vybr"; break; } |
||
Joan Profil |
#3 · Zasláno: 18. 2. 2011, 09:36:39
Ahoj a děkuju za odpověď.
Poněkud v to ale ještě plavu. Mám stránku index.php která obsahuje pouze menu a nic jiného (patička přibude až pochopím to vkládání) do které vkládám úvodní stránku stejně jako obsahy jednotlivých stránek. V souboru ovoce.php mám <a href="druh1.php?str=ovoce&vyber=jablka">Jablka</a> <a href="druh2.php?str=ovoce&vyber=hrusky">Hrušky</a> <a href="druh3.php?str=ovoce&vyber=banany">Banány</a> a v souboru druhy1.php <p>Zvolený druh <?php echo $_GET['str'];?> je: <?php echo $_GET['vyber'];?></p> <p>Jablíčka jsou červená</p> obdobně jako tady. Takže v hlavním menu na index.php nebude vůbec zmínka o druhém parametru? A ten switch použít místo mého ternárního operátoru? To myslím raději ne, protože ty dvě dosavadní položky tam mám jen kvůli přehlednosti, potom jich tam bude víc a pak by switch dost kynul. |
||
unlucky Profil |
#4 · Zasláno: 18. 2. 2011, 09:48:46
kdyz odkazujes na dalsi stranku, tak k cemu ti bude str=ovoce kdyz je to ovoce.php
Je to takhle: v indexu mas normalne vsechno v obsahu bude akorat skript, ktery rika, co tam ma mit - v tomto pripade tedy include podle $_GET['str'] kdyz bude index.php?str=ovoce tak tam misto obsahu bude text z ovoce.php kdyz das ale ovoce.php tak tam krome textu bude VSECHNO a je to zbytecne. To uz muzes rovnou mit vsechno v html |
||
Joan Profil |
#5 · Zasláno: 18. 2. 2011, 12:06:09 · Upravil/a: Joan
unlucky:
"kdyz bude index.php?str=ovoce tak tam misto obsahu bude text z ovoce.php " Pravdu díš :-) Už jsem postoupila do druhé úrovně, vidím v index.php přehled ovoce a zeleniny. Ale vkládací skript mám v NEPOŘÁDKU nebo spíš nekompletní, protože Warning: include(jablka.php) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\psi-kusy\pokus\index.php on line 32 Warning: include() [function.include]: Failed opening 'jablka.php' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\psi-kusy\pokus\index.php on line 32 Mám za to, že $_GET['vyber'] musím hledat uvnitř $_GET['str'], ne? Prostě ten druhý parametr musím mít ve vkládacím skriptu v index.php taky zohledněný - no, a to neumím :-( Poradíte prosím? Děkuji! |
||
Alphard Profil |
#6 · Zasláno: 18. 2. 2011, 13:09:38
Joan:
Dvě úrovně jsou pevně dané, nebo budete chtít jít i do dalších? Je více možností, jak vytvořit tuto funkčnost, já bych zřejmě volil trochu jiný způsob. V URL bych si nekomplikoval situaci se dvěmi proměnnými, ale použil např. index.php?page=ovoce/hrusky . Na straně PHP to lze jednoduše zpracovat a stačí jednoduché pravidlo pro přesměrování.
Když si vytvořím v .htaccess (je v rootu, tedy na úrovni http>://dev.l) pravidlo RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L] a do index.php (opět v http>://dev.l) dám <?php echo $_SERVER['REQUEST_URI'], "<br>\n"; print_r(explode('/', $_SERVER['REQUEST_URI'])); tak při načtení adresy http://dev.l/rostliny/stromy/ovocne/hrusky/hruska.htm (dev.l je můj lokální server, ekvivalentní k např. janula.kr.sweb.cz) je výstup /rostliny/stromy/ovocne/hrusky/hruska.htm<br> Array ( [0] => [1] => rostliny [2] => stromy [3] => ovocne [4] => hrusky [5] => hruska.htm ) Vše z adresy mám v poli a dle požadavků můžu načíst obsah. Úroveň zanoření lze zjistit třeba spočítáním prvků - count(), jen pozor na cestu ukončenou lomítkem http://dev.l/rostliny/stromy/ovocne/hrusky/ hodí prázdný prvek i na konec Array ( [0] => [1] => rostliny [2] => stromy [3] => ovocne [4] => hrusky [5] => ) Array ( [0] => [1] => rostliny [2] => stromy [3] => ovocne [4] => hrusky ) |
||
Joan Profil |
#7 · Zasláno: 18. 2. 2011, 14:02:30
Alphard:
"Dvě úrovně jsou pevně dané, nebo budete chtít jít i do dalších? " Jsem přesvědčena, že na 98% mi postačí jen dvě úrovně. Myšlenka s polem je zajímavá a hned jsem to zkusila. Ladím stránky na localhostu a když jsem .htaccess šoupla do složky k ostatním souborům (protože výsledek potom bude na vlastní subdoméně, která je tvořená samostatnou složkou) tak mě úplně všechno vracelo na úvodní stránku WAMPu. Jinam než do složky s obsahem .htaccess nebudu moci dát, protože už tam jeden sedí pro obsah hlavní domény 2.řádu print_r(explode...) mi viditelně vypsalo obsah pole na stránku - to se potom musí nějak skrýt, ne? A ještě, kromě index.php?page=ovoce/hrusky bych na stránku musela vypsat taky index.php?page=ovoce/jablka a index.php?page=ovoce/banany atd.? Takže odkazy na veškeré stránky z webu? Myslím si, že na tom .htaccessu jsem zřejmě skončila - nebude to přece jenom schůdnější pro 2 parametry v adrese, které potom mod_rewritem převedu na vzhled složek? Moc děkuji za ochotu pomoci. |
||
amon Profil |
#8 · Zasláno: 18. 2. 2011, 17:37:52
Pri vkladaní textu do stránky na zaklade adresy si treba dať pozor a najprv použitý text ošetriť. Najviac sa to týka includovania súboru podľa adresy, teda:
include "./nieco/" . $_GET['stranka'] . ".php"; |
||
Joan Profil |
#9 · Zasláno: 18. 2. 2011, 20:12:26
amon:
Hmm, to máš pravdu. Neměla jsem ošetřený vstup druhé proměnné, u té prvni (snad) ano: if (isset($_GET['str']) && preg_match('/^[a-z0-9_\-]+$/', $_GET['str'])) { Stále mám problém rozběhat druhý parametr :-( Stejně jako [#6] Alphard mi radil použít pole, tak i tady je řešení s polem. Zkusila jsem toto: <?php $vloz = array ('druh1' => 'druh1.php', 'druh2' => 'druh2.php', 'druh3' => 'druh3.php'); if (isset($_GET['vyber']) && preg_match('/^[a-z0-9_\-]+$/', $_GET['vyber']) && array_key_exists($_GET['vyber'], $vloz)) { include ($vloz[$_GET['vyber']].'.php'); } ?> Přijde mi ale zvláštní, že druhý parametr se v adrese vesele ukazuje, leč podstránka se ne a ne natáhnout. Zatím mám v poli zkušebně jen tři stránky. Kde mám prosím chybu, že se podstránky nezobrazují? EDIT: půjde i sem něco podstrčit?? |
||
Alphard Profil |
#10 · Zasláno: 18. 2. 2011, 22:08:51
Joan:
Je tady několik myšlenek a nevím, které se chytit. print_r() je samozřejmě jen pro debug výpisy. Pole není třeba vytvářet pro všechny stránky, maximálně, že by se mělo dynamicky generovat menu. Můj návrh jde použít i na subdoméně ve tvari dev.l/adresar/, jen je třeba upravit pravidlo v .htaccess a z pole odstranit nežádoucí prvky. |
||
Joan Profil |
#11 · Zasláno: 21. 2. 2011, 00:16:24
Mám VYŘEŠENO
Největší zádrhel byl - jak jinak - mezi židlí a klávesnicí, kdy jsem dlouho neviděla souvislost, že hodnota druhého parametru == název vkládaného souboru. A je to :-) Přeji pěkný popůlnoční čas všem. |
||
Časová prodleva: 13 let
|
0