| 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: 15 let
|
|||
0