Autor | Zpráva | ||
---|---|---|---|
Tirus Profil |
#1 · Zasláno: 24. 3. 2011, 19:36:55
Lidi, dalo by se to ještě zjednodušit? Zkoušel jsem JOIN v SQL, ale tím se mi to nějak nepodařilo.
public function getMenu() { $n = null; $lang = $this->registry['lang']; $result_menu = dibi::query('SELECT * FROM [cms_menu_label] WHERE [lang] = %s', $lang); foreach ($result_menu as $menu_nazev) { $nazev = $menu_nazev['text']; $list = array(); $res_label = dibi::query('SELECT * FROM [cms_menu_list] WHERE [UPPER_ID] = %u', $menu_nazev['ID']); foreach ($res_label as $polozka) { $list[] = array('nazev' => $polozka['name'], 'odkaz' => $lang.$polozka['href'], 'title' => $polozka['label']); } $this->view->set('nazev', $nazev); $this->view->set('list', $list); $n .= $this->view->fetch('Subparts/menu.tpl'); } return $n; } |
||
AM_ Profil |
#2 · Zasláno: 24. 3. 2011, 20:05:25
prakticky každý program jde nějak zjednodušít :) ale:
- hlavní je, aby to bylo přehledné a rozumně rychlé. Pokud to splňuje tato kritéria, tak je vše v pořádku. - používáš zde jakousi třídu, jejíž interface neznáme (to, na co se tu odkazuješ $this), takže netušíme, zda to s ní lze napsat nějak lépe. |
||
Tirus Profil |
#3 · Zasláno: 24. 3. 2011, 20:06:28 · Upravil/a: Tirus
AM:
pastenu ti to sem celý class Models_Menu { protected $registry; protected $view; protected $args; public function __construct($registry) { $this->registry = $registry; $this->registry = $registry; $this->view = $this->registry['view']; $this->args = $this->registry['args']; } public function getMenu() { $n = null; $lang = $this->registry['lang']; $result_menu = dibi::query('SELECT * FROM [cms_menu_label] WHERE [lang] = %s', $lang); foreach ($result_menu as $menu_nazev) { $nazev = $menu_nazev['text']; $list = array(); $res_label = dibi::query('SELECT * FROM [cms_menu_list] WHERE [UPPER_ID] = %u', $menu_nazev['ID']); foreach ($res_label as $polozka) { $list[] = array('nazev' => $polozka['name'], 'odkaz' => $lang.$polozka['href'], 'title' => $polozka['label']); } $this->view->set('nazev', $nazev); $this->view->set('list', $list); $n .= $this->view->fetch('Subparts/menu.tpl'); } return $n; } public function getTopMenu(){ $n = null; $lang = $this->registry['lang']; $menu_topa = array(); $result = dibi::query('SELECT * FROM [cms_menu_top] WHERE [lang] = %s', $lang); foreach ($result as $row) { $menu_topa[] = array('odkaz' => $lang.$row['href'], 'nazev' => $row['text'], 'title' => $row['label']); } $this->view->set('menu_topa', $menu_topa); return $this->view->fetch('Subparts/menu_top.tpl'); } } základ je framework ( http://blackhole.sk/ ) a pro připojení k MySQL využívám dibi.mini.php |
||
Tori Profil |
#4 · Zasláno: 24. 3. 2011, 22:23:02 · Upravil/a: Tori
Šlo by to i jedním dotazem a využít dibi::fetchAssoc()
public function getMenu() { $n = null; $lang = $this->registry['lang']; // stačí získat jen sloupce, které se použijí + dát jim aliasy, jaké mají mít v šabloně $result_menu = dibi::query("SELECT c.[text], l.[name] 'nazev', CONCAT(c.[lang],l.[href]) 'odkaz', l.[label] 'title' FROM [cms_menu_label] c LEFT JOIN [cms_menu_list] l ON l.[UPPER_ID] = c.[ID] WHERE c.[lang] = %s", $lang, 'ORDER BY [text]') ->fetchAssoc('text,#'); foreach ($result_menu as $nazev=>$list) { $this->view->set('nazev', $nazev); $this->view->set('list', $list); $n .= $this->view->fetch('Subparts/menu.tpl'); } return $n; } |
||
japlavaren Profil |
#5 · Zasláno: 24. 3. 2011, 23:22:11
otazka je, ci nebude problem s prepisovanim $this->view->set('nazev', $nazev); ak bude viac vysledkov. osobne by som si najprv vysledok ulozil do pola s klucamy a potom ho predaval do sablony cez dalsi foreach
|
||
Tori Profil |
#6 · Zasláno: 24. 3. 2011, 23:29:29
japlavaren:
S tím se počítá, ne? Při každém průchodu se do tpl->nazev pošle název jedné položky menu (1.úrovně), a do tpl->list pole se všemi položkami 2.úrovně na ní závislými. Pak se to vygeneruje a uloží. Při dalším průchodu se proměnné naplní novými hodnotami pro další položku 1.úrovně a všechny závislé a vygeneruje další kousek skládanky. |
||
Tirus Profil |
#7 · Zasláno: 25. 3. 2011, 15:17:55
Tori:
toto je výsledek kodu :) Catchable fatal error: Object of class DibiRow could not be converted to string in C:\xampp\htdocs\fw\lib\bTemplate.php on line 223 |
||
Tori Profil |
#8 · Zasláno: 25. 3. 2011, 22:36:54
Tirus:
A jak vypadá ta šablona? Jsem to teď zkusila, a v proměnné $list bylo (v jednom průchodu foreach) totéž, co by se do ní uložilo podle [#3], tedy pole: Array ( [0] => DibiRow Object ( [text] => Hlavní nabídka [nazev] => Tabulka [odkaz] => cs/Table [title] => ) [1] => DibiRow Object ( [text] => Hlavní nabídka [nazev] => Hlavní stránka [odkaz] => cs [title] => Hlavní stránka ) ) |
||
Časová prodleva: 13 let
|
0