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(); } |
‘Programování’
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>'; } } |


