Dub 07

Kamarádka potřebovala do školy naprogramovat jednoduché menu. Když už jsem se s tím dělal, dávám to k dispozici široké veřejnosti, třeba se to někomu bude někdy hodit :) .

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();  
}
Tagy:
Dub 07

Před pár měsící jsem zkoušel odhalit jak nejlépe vypsat dvouúrovňové menu přes databázi (mysql) a php. Dnes se s vámi o svůj postup podělím.

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>';
  }
}
Tagy:
Dub 07

Již před několika týdny jsem spustil vlastní youtube kanál, kam budu nahrávat svojí tvorbu, ať se jen tak neztratí v hlubiách harddisků :) .

podívat se můžete zde

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.

Tagy:
Dub 07

Obálka knihy Konec křížů

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 :) .

Tagy: