Autor Zpráva
casy
Profil *
Ahoj, potřeboval bych poradit jak vytvořit interaktivní menu v php pomocí podmínky while.

Jde mi prakticky o rozevírací menu kde by se na index rozevřel seznam "uvod" a podnim podstranky.

dalsi polozka by byla design a pri kliknuti by se uvod zavrel a rozevrel "design".

Takhle jednoduše, ale nemůžu nic vygooglit, tak vás prosím o pomoc.

Menu můžu načítat z databáze nebo staticky v php.


podobné řešení zde

Děkuju

Dan
fajzen
Profil
casy:
ahoj,
na začiatok si nemôžem odpustiť trochu rýpnuť :)

pomocí podmínky while
while je cyklus, nie podmienka

mohlo by to byť nejak takto:
// statická definícia štruktúry
$menu = array(
  array( // prvá kategória
    'href'   => 'kat1', // identifikátor kategórie
    'text'   => 'Kategória 1', // text odkazu
    'items' => array( // stránky kategórie
      array('subkat1', 'Položka menu 1.1'), // identifikátor stránky a text odkazu
      array('subkat2', 'Položka menu 1.2')
    )
  ),
  array(
    'href'   => 'kat2',
    'text'   => 'Kategória 2',
    'items' => array(
      array('subkat1', 'Položka menu 2.1'),
      array('subkat2', 'Položka menu 2.2')
    )
  ),
  array( // kategória bez podstránok
    'href'   => 'kat3',
    'text'   => 'Kategória 3',
    'items' => array()
  )
);

// zistenie aktuálne otvorenej kategórie
$actual = (isset($_GET['kat']) ? $_GET['kat'] : 'kat2'); // druhá kategória je predvolená

// výpis menu
echo '<ul>';
foreach($menu as $cathegory) {
  echo '<li><a href="?kat=' . $cathegory['href'] . '">' . $cathegory['text'] . '</a></li>';
  if(!empty($cathegory['items'])) {
    echo '<ul style="' . ($actual == $cathegory['href'] ? '' : 'display:none;') . '">';
    foreach($cathegory['items'] as $page)
      echo '<li><a href="?kat=' . $cathegory['href'] . '&amp;page=' . $page[0] . '">' . $page[1] . '</a></li>';
    echo '</ul>';
  }
}
echo '</ul>';
casy
Profil *
Ahoj výborně to funguje, děkuju moc. Za tu podmínku se omlouvám, učím se za chodu.

Chci se ještě zeptat, dal by se sem nějak vložit styl ? Potřebuji aby v té aktivní kategorii překrýval obrázek text. Totožně s tím příkladem co uvádím.

$actual = (isset($_GET['kat']) ? $_GET['kat'] : 'kat2'); // druhá kategória je predvolená

další věc je, když kliknu na kategorii bez podkategorií tak aby se nezobrazovala defauletně nastavená stránka "kat1"

a ještě jednu věc jsem nerozlousknul a to je samotný odkaz kategorie - když kliknu na kategorii 2 tak chci aby první strana v danné kategorii byla aktivní strana, zatím se mi načítá chyba stím že sem si nastavil neexistující(404) stranu na index.php

Díky moc
fajzen
Profil
casy:
od riadku 26 môjho kódu zmeň:
// zistenie aktuálne otvorenej kategórie
$actual = (isset($_GET['kat']) ? $_GET['kat'] : 'kat2'); // druhá kategória je predvolená
// zistenie aktuálnej stránky
$actual_page = (isset($_GET['page']) ? $_GET['page'] : null); // ak nie je zadaná stránka, použije sa ako otvorená stránka identifikátor nadradenej kategórie

// výpis menu
echo '<ul class="menu">';
foreach($menu as $cathegory) {
  echo '<li'  . ($actual == $cathegory['href'] ? ' class="menu_active"' : '') . '><a href="?kat=' . $cathegory['href'] . '&amp;page=' . (empty($cathegory['items']) ? $cathegory['href'] : $cathegory['items'][0][0]) . '">' . $cathegory['text'] . '</a>';
  if(!empty($cathegory['items'])) {
    echo '<ul>';
    foreach($cathegory['items'] as $page) {
      echo '<li><a href="?kat=' . $cathegory['href'] . '&amp;page=' . $page[0] . '">' . $page[1] . '</a></li>';
	  if($actual == $cathegory['href'] && $page[0] == $actual_page)
		define('TO_INCLUDE', $actual_page);
	}

        // ak bola zadaná existujúca kategória ale neexistujúca stránka, automaticky sa nastaví prvá stránka v kategórií
        // môžeš zmazať ak by si chcel namiesto toho zobraziť nejakú chybovú stránku
	if($actual == $cathegory['href'] && !defined('TO_INCLUDE'))
		define('TO_INCLUDE', $cathegory['items'][0][0]);
   echo '</ul>';
  } else if($cathegory['href'] == $actual) {
	define('TO_INCLUDE', $actual);
  }

  echo '</li>';
}
echo '</ul>';
aktívna kategória bude mať nastavené class na menu_active, stačí túto triedu naštýlovať. Spravil som tam nejaké zmeny, kvôli ktorým treba do CSS doplniť toto:
<style>
.menu ul { display: none; }
.menu_active > ul { display: inherit }
</style>

v konštante TO_INCLUDE bude uložený identifikátor stránky, ktorá sa má zobraziť, takže ak nastavíš identifikátory tak, aby to boli zároveň názvy stránok, ktoré sa majú includovať (napr. identifikátor novinky pre stránku novinky.php), môžeš použiť:
// konštanta nemusí byť nastavená, ak bola zadaná kategória, ktorá nie je v menu, treba to skontrolovať
// taktiež sa kontroluje existencia požadovaného súboru
if(defined('TO_INCLUDE') && file_exists(TO_INCLUDE . '.php'))
  include TO_INCLUDE . '.php';
else
  include 'default.php';
casy
Profil *
fajzen:
Je to funkční až na ty styly, nastyloval jsem si

.menu_active
.menu_active {  
background-image: url('images/leftMenu_item_bg.png');
background-repeat: repeat-y;}


a zjistil jsem že takto použitý styl "zaktivuje" kompletně celé menu. U té kategorie není uzavřené </li>

ve výstupu to vypadá takto

<ul class="menu">
<li class="menu_active"><a href="?kat=&amp;page=uvod">Wellnes technik group</a> <!--  //tady  -->
<ul>
<li><a href="?kat=&amp;page=uvod">Úvod</a></li>
<li><a href="?kat=&amp;page=PREDSTAVENI-FIRMY-WELLNESSTECHNIK">Představení firmy</a></li>
<li><a href="?kat=&amp;page=originalita-wellnesstechnik">Originalita a jedinečnost</a></li>
<li><a href="?kat=&amp;page=profesionalita_wellness">Profesionalita</a></li>
<li><a href="?kat=&amp;page=portfolio_wellness">Portfolio</a></li>
<li><a href="?kat=&amp;page=wtg_firma">WTG - firma</a></li>
<li><a href="?kat=&amp;page=show-room-realizace">SHOW ROOM - realizace</a></li>
<li><a href="?kat=&amp;page=show-room-prezentace">SHOW ROOM - prezentace</a></li>
</ul>
</li> <!-- Tohle li uzavírá celý seznam a když ho uzavřu tak se nerozevře submenu, ale odkazy jsou jinak funkční a správně se zobrazuje i obrázek pod ním -->



styl jsem ponechal na místě zde

echo '<li'  . ($actual == $cathegory['href'] ? ' class="menu_active"' : '') . '><a href="?kat=' . $cathegory['href'] . '&amp;page=' . (empty($cathegory['items']) ? $cathegory['href'] : $cathegory['items'][0][0]) . '">' . $cathegory['text'] . '</a>';



Mockrát děkuji že mi pomáháš!
casy
Profil *
fajzen:

ještě to nemůžu říct jistě, ale je to asi nefunkční pro IE
casy
Profil *
tak je to tak, nefunguje IE coz je neprijemna chyba nejspis na strane css ne ?
casy
Profil *
Tak se mi povedlo to vyřešit.

Do stylu jsem napsal

.menu ul {
  visibility: hidden; 
  display: none;    
  padding: 0px;
  margin: 0px;  
  text-align: left;  
}
.menu_active ul {  
  visibility: visible; 
  display: block; 
  padding: 0px;
  margin: 0px;
}

a zobrazuje to i IE
fajzen
Profil
casy:
super, takže je to už OK všetko?
casy
Profil *
fajzen:

vyřešil jsem pouze IE, respektive to zobrazení samotného menu, teď mi ještě chybí samotný aktivní odkaz s tím stylem
casy
Profil *
Ahoj, tak se na výsledek můžeš podívat na http://www.wellnesstechnik.cz/ dělal jsem kopii pro česko a nedaly mi přístupy k ftp, tak proto jsem sháněl pomoc. Asi trochu nepochopitelne jsem udelal portfolio z url poznas o cem mluvim.

Použil jsem zajímavý kód,

if(defined('TO_INCLUDE') && file_exists(TO_INCLUDE . '.php'))
  include TO_INCLUDE . '.php';
else
   if (IsSet($_GET['p'])){     
              $soubor=$_GET['p'];
              $soubor2= dirname($_SERVER['SCRIPT_FILENAME'])."/".$soubor.".php";
              if(file_exists($soubor2)){      //pokud soubor existuje, nacteme ho do stredu
                include $soubor2;
              }else{                //pokud soubor neexistuje, zavolame error404.php
                include "inc/error404.php";
              }
            }else{                  
              include "uvod.php";
            }



kupodivu to funguje, uz jenom casem doresim ty aktivni kategorie coz bude asi orisek, ten styl by se musel napsat do '<a' zatim nevim jak na to, ale poradim si stim :)

Dekuju za pomoc a rady

Mej se fajn

Dan

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: