1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { menu(); system("PAUSE"); return 0; } int menu() { system("cls"); printf("%sn","Vyber:"); printf("%sn","1. FUNKCE1"); printf("%sn","2. FUNKCE2"); printf("%sn","3. Konec"); int i = 0; printf("%s ","Zadej číslo volby: "); scanf("%d",&i); while(i < 1 || i > 3) { printf("%s ","Zadej znovu číslo volby: "); scanf("%d",&i); } switch(i) { case 1: funkce1(); break; case 2: funkce2(); break; case 3: system("cls"); printf("%sn","Sbohem"); break; } } int funkce1() { system("cls"); printf("%sn","Volas funkci 1:"); int i; printf("%s ","Napis 1 nebo 0 a zmackni enter: "); scanf("%d",&i); menu(); } int funkce2() { system("cls"); printf("%sn","Volas funkci 2:"); int i; printf("%s ","Napis cislo a zmackni enter: "); scanf("%d",&i); menu(); } |
Na vzhledu databázové tabulky příliš nezáleží, v zásadě by měla obsahovat:
- identifikátor řádku (id)
- název položky menu
- odkaz položky menu
- typ položky menu
- rodič položky
Tučně zvýrazněné položky jsou důležité, ty ostatní pouze rozšiřují funkcionalitu.
První postup je čistě programátorský – líný a prasácký
– je to jednoduché a přímé řešení problému, ovšem velkou nevýhodou jsou nároky na paměť, databázi i samotný webserver – v momeňtě kd si generujeme menu a ukládáme ho například do cache je to naprosto ideální řešení, pokud se v menu často dělají změny popřípadě se při jeho vypisování nějak ovlivňuje jeho zobrazení, je nutné použít dynamický přístup k problému. První menu se hodí třeba v e-shopech, druhé je vhodnější pro weby s více vrstvami oprávnění pro uživatele a podobně. Zdrojový kód by měl být dobře pochopitelný pro každého proto jsem se s komentáři příliš nepytloval
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <?php error_reporting(E_ALL); function getRuntime() { list($a,$b) = explode(' ', microtime()); return $a + (float)$b; } //db $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $dbname = 'myweb'; $total = 0; for($i=0;$i<1000;$i++) { $t1 = getRuntime(); $fdb1 = mysql_connect($dbhost,$dbuser,$dbpass); $fdb2 = mysql_select_db($dbname); mysql_query('SET NAMES utf8'); echo '<ul>'; $res = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = 0 ORDER BY parent ASC, nazev ASC"); while($a = mysql_fetch_row($res)) { echo '<li><a href="'.$a[2].'">'.$a[1].'</a></li>'; if($a[3]==3 || $a[3]==4) { $res2 = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = '".$a[0]."' ORDER BY parent ASC, nazev ASC "); echo '<ul>'; while($b=mysql_fetch_row($res2)) { echo '<li><a href="'.$b[2].'">'.$b[1].'</a></li>'; } echo '</ul>'; } } echo '</ul>'; $t2 = getRuntime(); $t = ($t2-$t1); //echo ' cycle runtime: '.$t.' sec'; $total += $t; mysql_close($fdb1); } echo '</div>'; echo ' total runtime: '.($total/$i).' sec'; ?> |
Druhé řešení poměrně dobře čerpá veškeré krásy objektového programování, i když jsem si vědom že by se zdroják dal ještě více rychlostně i paměťově optimalizovat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <?php error_reporting(E_ALL); function getRuntime() { list($a,$b) = explode(' ', microtime()); return $a + (float)$b; } //db $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $dbname = 'myweb'; $total = 0; for($i=0;$i<1000;$i++) { $t1 = getRuntime(); $fdb1 = mysql_connect($dbhost,$dbuser,$dbpass); $fdb2 = mysql_select_db($dbname); mysql_query('SET NAMES utf8'); echo '<ul>'; $res = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = 0 ORDER BY parent ASC, nazev ASC"); while($a = mysql_fetch_row($res)) { echo '<li><a href="'.$a[2].'">'.$a[1].'</a></li>'; if($a[3]==3 || $a[3]==4) { $res2 = mysql_query("SELECT id,nazev,href,typ,parent FROM menu WHERE parent = '".$a[0]."' ORDER BY parent ASC, nazev ASC "); echo '<ul>'; while($b=mysql_fetch_row($res2)) { echo '<li><a href="'.$b[2].'">'.$b[1].'</a></li>'; } echo '</ul>'; } } echo '</ul>'; $t2 = getRuntime(); $t = ($t2-$t1); //echo ' cycle runtime: '.$t.' sec'; $total += $t; mysql_close($fdb1); } echo '</div>'; echo ' total runtime: '.($total/$i).' sec'; ?> |
Třída menuTree
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | class menuTree { private $parentMenuItem; private $menuArray = array(); private $innerTree = false; public $parent = 0; public $type = 'menuTree'; public function setParent($parent, $menuItem) { $this->parent = $parent; $this->parentMenuItem = $menuItem; } public function loadItem($menuItem) { $this->menuArray[] = $menuItem; } public function createItem($text,$href,$css,$title,$id) { $this->menuArray[] = new menuItem($text,$href,$css,$title,$id); } /* public function loadTree($menuTree) { $this->menuArray[] = $menuTree; } */ public function createTree($parent, $menuItem) { $newMenu = new menuTree(); $newMenu->setParent($parent, $menuItem); $this->menuArray[] = $newMenu; $this->innerTree = true; } public function insertInTree($parent, $menuItem) { //echo 'parent: '.$this->parent.'<br />'; if($parent==$this->parent) return $this->menuArray[] = $menuItem; //if(count($menuArray)) foreach($this->menuArray as $menu) { if($menu->type=='menuTree') if($menu->innerTree) if($menu->insertInTree($parent, $menuItem)) return true; } return false; } /* public function createInTree($parent,$text,$href,$css,$title,$id) { $item = new menuItem($text,$href,$css,$title,$id); $this->insertInTree($parent,$item); } */ public function show() { if($this->parent) $this->parentMenuItem->show(); if(count($this->menuArray)>0) { echo '<ul>'; foreach($this->menuArray as $menuItem) $menuItem->show(); echo '</ul>'; } } } |
Třída menuItem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class menuItem { private $text; private $href; private $css; private $title; private $id; public $type = 'menuItem'; public function __construct($text,$href,$css,$title,$id) { $this->text = $text; $this->href = $href; $this->css = $css; $this->title = $title; $this->id = $id; //echo ' item created;; '; } public function show() { echo '<li><a href="'.$this->href.'" class="'.$this->css.'" title="'.$this->title.'">'.$this->text.'</a></li>'; } } |
O nahraných videích většinou postnu i sem, takže se nemusíte bát že byste o něco přišli.

Obálka knihy Konec křížů
“Druhá” kniha spisovatele Martina Moudrého má sice poměrně klišéovitou zápletku, na druhou stranu bych ji označil za nejoriginálnější dílo ze všech dosud napsaných.
Kniha vypráví o —-, který jednoho dne na cestě z práce zabloudí do ponurého knihkupectví, kde najde hromadu knižních skvostů (samozřejmě z oblasti scifi). Mezi knihami nalezne i Necronomicon – legendami opředenou knihu. Kniha je plná textů a zaklínadel (aspoň to tak vypadá, kdo by to poznal, že). Po tom co se sklenkou whisky vysedává a přemílá, rozhodne se nějaké zaklínadlo vyzkoušet. Vybere si zaklínadlo na oživení mrtvého a tím spustí lavinu událostí, které by si žádný čtenář nedovedl ani v tom nejhorším snu představit
.


