switch

Je možné mít v jednom skriptu dvakrát použitou funkci switch ?

Např. :

switch($op) {
case "$op":
$dotaz = "SELECT nadpis, text FROM texty WHERE ID = '$op' AND sublevel = '$sub'";
vypis($dotaz);
break;


}

switch($akc) {
case "kontakt";
require("kontakt.php");
break;

case "newsletter";
require("newsletter.php");
break;

//atd.

}

funkce vypis($dotaz) jen zajistí vypsání výsledku dotazu na předem určené místo.

Jde mi o to, že proměnná $akc nabývá číselných hodnot a jedná se o jedinečný identifikátor kategorie textů. Abych nemusel s každou novou stránkou přidávat case 2: case 3: atd., je pro mne jednodušší využít proměnné. Na stejnou stránku se ale odkazují také jiné odkazy, které mají vlastní skripty a nejsou to jen texty vytažené z databáze. Když pak třeba kliknu na odkaz newsletter, chci aby se mi na místo, kde obvykle bývajá nějaky text includoval soubor newsletter.php.

Ještě pro doplnění : ve skriptu, který se includuje hned na začátku celé stránky jsem doplnil :

global $akc;
if($akc!="kontakt" || $akc!="newsletter" || $akc!="hledani") $akc=$akc;
if($akc=="kontakt") $op="kontakt";
if($akc=="newsletter") $op="newsletter";

if(!isset($akc)) $akc="1";

Nebo máže nějaký jiný nápad ?
Sorry, pokud jsem někoho zmátl, v tom prvním switch, kde je $op, tam má být všude $akc a v tom druhém switch má být $op místo $akc. Prostě jsem to prohodil, jak jsem to psal z hlavy :(
> Je možné mít v jednom skriptu dvakrát použitou funkci switch ?

Jiste ze ANO ... napada nekoho proc by ne? ... ale odpoved a problem se mi zda natolik trivialni, ze jsem te mozna ne zcela pochopil. Jinak switch neni funkce, ale klicove slovo pro konstrukci rozvetvovaciho prikazu.

Radek
Dokonce bych si snad troufl rict ze ve volbach case lze pouzit promennou misto konstanty, ale to jen hadam a nezkousel jsem to..
Oproti C/C++ kde prepinac musi byt vylucne definovanou konstantou a nelze pouzit promennou zadnyho typu (bohuzel ani const)
Master: hadas spravne, dokonce muzes pouzit libovolnej vyraz
Arnie:jakej ma prosimte smysl konstrukce
switch($op)
{
  case "$op":
  ...
  break;
}
??
nebo treba
if($akc!="kontakt" || $akc!="newsletter" || $akc!="hledani") $akc=$akc;

:-))
jinak jestli mas tou podminkou na zacatku pohlidany ze $akc je jmeno existujciho php souboru tak je ten druhej switch zbytecnej (jestli to teda pokracuje v tom douchu v jakym to zacina), co treba require("$akc.php");
Na úvod řeknu, že tady jsem použil $op a $akc, ale původně to bylo takto (případ stejným jen proměnné jiné) :

...měl jsem tabulku se třemi sloupci (mimo hlavičky a patičky), kde v levém sloupci byly odkazy, v pravém nějaké novinky apod. a uprostřed se vždy objevoval daný text.

Tabulku texty jsem měl v následující struktuře

ID(char2, index) sublevel(char2, index) krtext (char20) text(text)

kde ID bylo číslo kategorie a sublevel bylo číslo podůrovně.

Třeba text Představení společnosti měl ID 1 sublevel 0 (a všechny hlavní kategorie měly sublevel 0). A pod hlavní kategorií "Představení společnosti" byly další články - třeba kontakt, servisní oddělení apod, jenom texty tahané z databáze, které měly v tomto případě ID 1 a sublevel 1,2,3 atd. , jenom ne 0.

Dále jsem na těch stránkách měl i jiné stránky, které v sobě měly php kód jako třeba fulltext vyhledávání, newsletter apod. a ty jsem nemohk jednoduše volat pomocí $akc.

swicth($akc) {
case "$akc":
$dotaz = "SELECT * FROM texty WHERE ID = '$akc' AND sublevel = '$sub'";
vypis($dotaz);
break;



kde vypis($dotaz) dělalo následující :

function vypis($dotaz2) {
$query = mysql_query($dotaz2);
$story = mysql_fetch_row($query);
$nadpis = StripSlashes($story[0]);
OpenTable();
echo "<center><p class=\"nadpis\">$nadpis</p></center>";
echo $story[1];
CloseTable();
}


Takže jsem si musel ošetřit situaci, kdy bych volal index.php?akc=hledani, protože jinak by switch($akc) dělalo něco jako SELECT * FROM texty WHERE ID = "hledani" a byl bych v.....

dal jsem tedy :

if($akc!="hledani" || $akc .....) $akc=$akc;

a

if(!isset($sub)) $sub="0"; // to pro případ, když volám hlavní kategorie

a k tomu ještě, když bude volána třeba akce newsletter (která neměla vlatsní stránku, jen se vykonávaly funkce na ověření emailu a v případě chybičky se tato vypsala jenom do toho bloku vlevo.

if(!isset($akc)) $akc="1";

, takže když jsem volal akci, která měla jenom vypsat hlášku do bloku, zajistil jsem si tím, že uprostřed byl vždy alespoň nějaký text, v mm případě úvpdní stránk a s představením společnosti.

a ještě zpátky ke switchům :

switch($akc2) { //tady jsem původně měl asi tu $op
case "hledani":
require("hledani.php");
break;
}

a abych tento switch mohl používat, přidal jsem ještě další podmínky :

if($akc=="hledani") $op = "hledani";
atd. pro ostatní netextové stránky

Pak jsem se do toho všeho tak zamotal, že jsem to vyřešil úplně jinak a přehledněji :

ze všech podmínek zůstala jediná :

if(!isset($sub)) {
$sub="0";
}

a ve středním sloupci je includovana stranka stred.php s tímto :

if(!isset($akc) && !isset($akc2)) $akc=1;

switch($akc) {
case $akc:
$dotaz = "SELECT krtext, text FROM texty WHERE ID = '$akc' AND sublevel = '$sub'";
vypis($dotaz);
break;

}

switch($akc2) {

case "kontakt" :
$nadpis = "Kontaktní údaje/formulář";
require("kontakt.php");
break;

case "hledani" :
require("search.php");
break;

case "newsletter" :
require("newsletter.php");
break;
}


Takže můžu klidně pro ty stránky, kde nenaleznu odpovídající záznam v databázi (čili nejsou to jednoduché texty) použít konstrukci menu (taky vytvářené pomocí php) jednoduše takovou , že místo <a href=index.php?akc=1,2,3 atd. použít <a href=index.php?akc2=newsletter atd...)

a tím se to celé vyřešilo. Ještě jsem musel odstranit defaulty ze switchů, protože ty přebíraly hlavní slovo a tedka to šlape tak, jak má.

Výsledná podoba je vidět na www.marcontrols.cz

Nevím, jestli jsem dostatečně odpověděl na otázku, která mi byla směrována nebo jsem vám akorát zamotal hlavy, jisté je, že teďka to funguje tak jak má.

Tabulka s textama sice není ideální (vzhledem k možnosti, že umožňuje vytvořit až 99+(99x99) = 9900 stránek, takže by si to zasloužilo rozdělit třeba do tabulek po hlavních kategoriiích, ale pro firemní web o pár stránkách to stačí až až. Přidávání stránek je z administračního rozhraní řešeno jednoduše ve stylu wysiwyg editoru, kde se zvolí nadpis stránky, její umístění (buď jako nová hlavní kategorie nebo se zařadí do některé stávající), může se následně editovat nebo mazat, přidávat novinky, posílat newslettery, testovat stránky pro rozlišení 800x600 nebo 1024x768. Myslím si, že tím moje práce skončila a ať si tam vedení napíše co chce. Ostatně - byli spokojeni.

Pokud by o to měl někdo zájem, stačilo by mu pár stránek, ať se klidně ozve na mail, skripty mu pošlu.

Je to fakt jednoduché. Kdyby si to někdo chtěl předělat na rozumnější podobu tabulek v databází (rozdělení po kategoriích), měl by to zvládnout - při přidávání nové kategorie se prostě vytvoří nová tabulka a je to. Jen pak upravit dotazy na hledání, možná i tvorba menu. Do sta stránek by to myslím si ale vyhovělo většině ve stávající podobě.