Autor Zpráva
Joan
Profil
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
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
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
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
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
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] => 
)
na rozdíl od http://dev.l/rostliny/stromy/ovocne/hrusky
Array
(
    [0] => 
    [1] => rostliny
    [2] => stromy
    [3] => ovocne
    [4] => hrusky
)
Ale v zájmu konzistence se stejně preferuje jedna varianta a na ni se přesměrovává.
Joan
Profil
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
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";
Ale nebezpečné to môže byť aj v iných prípadoch. Na tvojej testovacej stránke sa dá bez problémov zobraziť iná stránka, ako ukazuje príklad.
Joan
Profil
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0