Autor Zpráva
Tirus
Profil
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
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
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
Š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;
}
PS: Nezkoušela jsem to, ale snad to bude fungovat.
japlavaren
Profil
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
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
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
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
                )
)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: