generování menu basepresenter / latte

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kasparek
Člen | 43
+
0
-

Ahoj,
dělám na menu, které funguje

BasePresenter.php

abstract class BasePresenter extends Nette\Application\UI\Presenter {

    protected function beforeRender() {
      parent::beforeRender();
      $this->template->menuItems = array(
          'Úvodní stránka' => 'Homepage:',
          'Stránky' => array(
				'Přidat' => 'Dashboard:add',
				'Upravit' => 'Dashboard:edit'
          ),
          'Odhlásit' => 'Sign:out',
      );
    }
}

a zpracovávám v @layaut.latte

{block #menu}
    <ul>
    {foreach $menuItems as $item => $link}
        <li>
        {if is_array($link)}
            <span>{$item}</span>
            {include #menu, menuItems => $link}
        {else}
            <a n:href="$link">{$item}</a>
        {/if}
        </li>
    {/foreach}
    </ul>
{/block}

Ale přemýšlím zda by nešlo aby i např. položka 'Stránky' byla odkaz

Napadlo mě něco jako

'Stránky' => 'Dashboard: 'array(
				'Přidat' => 'Dashboard:add',
				'Upravit' => 'Dashboard:edit'
),

ale je mi jasný že takhle to nejde.

Nemáte s tím někdo zkušenosti???
Díky za rady ;)

Editoval kasparek (31. 8. 2014 11:45)

nanuqcz
Člen | 822
+
0
-

Ahoj,
není nic jednoduššího, než to do té šablony nastrkat třeba takhle :-)

$this->template->menuItems = array(
    'Úvodní stránka' => array(
    	'link' => 'Homepage:',
    	'childs' => array(),
    ),
    'Stránky' => array(
    	'link' => 'Foo:bar',
    	'childs' => array(
            'Přidat' => 'Dashboard:add',
            'Upravit' => 'Dashboard:edit'
   		),
    ),
    ...
);

a potom to v šabloně i odpovídajícím způsobem vypsat.

mkoubik
Člen | 728
+
+1
-

nanuqcz napsal(a):

childschildren :-)

kasparek
Člen | 43
+
0
-

Díky za rady juknu na to a pokusím se to poskládat v tom @layaut.latte ;)

nanuqcz
Člen | 822
+
0
-

mkoubik napsal(a):

nanuqcz napsal(a):

childschildren :-)

A sakra, budu teď muset přepsat všechny své aplikace :-D

h4kuna
Backer | 740
+
0
-

Pro takto jednoduché menu jsem si napsal pomocnou strukturu, má výhodu drobečkové navigace a pokud časem převedeš menu do db, tak jen změníš factory která je i na toto připravená. Takto vypadá pole, takto se to použije a API je jednoduché

Editoval h4kuna (2. 9. 2014 14:07)

kasparek
Člen | 43
+
0
-

h4kuna napsal(a):

Pro takto jednoduché menu jsem si napsal pomocnou strukturu, má výhodu drobečkové navigace a pokud časem převedeš menu do db, tak jen změníš factory která je i na toto připravená. Takto vypadá pole, takto se to použije a API je jednoduché

Teď jsem nebyl u PC ale jdu se na to kouknout, i když to asi nevyužiji to tvoje, jelikož to co teď řeším je jen „menu administrace“, které by bylo na pevno, jinak menu na webu řeším přes db.
Menu v administraci se mi nechce řešit v db abych neměl zbytečně mnoho dotazů.

thm
Člen | 147
+
+1
-

Kdyby se někomu hodilo, udělal jsem si třídu pro práci se stromovou strukturou. Ne že by to bylo nějak hezky naprogramované (resp. nedokážu to posoudit, protože s OOP teprve začínám), ale funguje to. Pracuje s Nette Database.

Stačí vyrobit základní tabulku (v popisu třídy základní sloupce (ID,PARENT_ID,ORDER,ORDER_BY,NAMESPACE) + nějaké svoje třeba NAME, SEONAME atd..), pak už jenom píšu.

Každá stromová struktura má root TreeNode a pod ní se nechají napojovat další TreeNode

 $tree = new \TH\TreeStructure\Tree(Context $database, $tableName, $namespace); //namespace umožňuje více oddělených stromových struktur v jedné tabulce.

//Piřdání položky pod kořenovou TreeNode (public function addNode($id, $data))
$tree->addNode($tree->getRootNode()->id, array('name' => 'Ovoce', 'seoname' => 'ovoce'));

//Vyhledání TreeNode podle nějakého sloupce nebo podle id ($tree->find($id);)
$ovoce = $tree->findBy('seoname','ovoce');

//Přidání položku pod ovoce
$ovoce->addChild(array('name' => 'Mrkev', 'seoname' => 'mrkev'));

//Procházení stromové struktury
$tree->findBy('seoname', 'mrkev')->parent->parent->addChild(array('name' => 'Zelenina', 'seoname' => 'zelenina'));

//Přepojování struktur
$mrkev = $tree->findBy('seoname', 'mrkev');
$zelenina = $tree->findBy('seoname', 'zelenina');
$tree->moveNode($mrkev->id, $zelenina->id);

//Řazení (u každé položky je možno řadit podpoložky pomocí jiného sloupce. Je možno zadat i orderChildren('name, id DESC'))
$zelenina->orderChildren('name'); //Pokud by přidal pod $zelenina->addChild(array('name' => 'Brambory')); tak budou brambory na prvním místě, protože děti zeleniny se řadí podle name.

//Mazání
$zelenina->delete(); //Vyhodí Exeption, protože obsahuje podpoložky
$zelenina->delete(TRUE); //Smaže včetně podpoložek

//Update
$ovoce = $tree->findBy('seoname','ovoce');
$ovoce->update('name' => 'To nežeru', 'seoname' => 'to-nezeru');

//Různé dotazy např.
$zelenina->parent //vrací rodiče marně ve třídě hledám getter ;)
$zelenina->getDepth(); //Vrací zanoření
$zelenina->isRoot(); //Vrací bool jestli je kořenovou položkou
$zelenina->isChildLess(); //Vrací bool
$zelenina->isDescendantOf($id); //Je potomkem jiné TreeNode (přes všechna kolena)
$zelenina->countDescendants();
$zelenina->countChildren();
$zelenina->getSiblings(); //Vrací sourozence, včetně zeleniny
$zelenina->hasOrderedChildren(); // Vrací bool
$zelenina->isOrdered();
$zelenina->findByDown($column, $value); //Hledá podpoložky

$brambory = $tree->find('seoname','brambory');
$brambory->getPath(); //Vrací array of TreeNode - cesty ke kořenu
$brambory->getPathString('seoname', '/'); //vrací string "zelenina/brambory"
$brambory->getDownTree(); //Vrací array of TreeNode pro vypsání stromové struktury (od této položky níže) samozřejmě seřazené vše jak má být.
$tree->getTree() //Vrací kompletní data pro vypsání stromové struktury

nebo lze stromovou strukturu vypisovat v latte

{var $children = $tree->getChildren()}
{if count($children)}

      <ul>
      {block tree}
            {foreach $children as $child}

                  <li>{$child->name}
                        {if $child->countChildren()}
                              <ul>
                              {include tree, $children = $child->getChildren()}
                              </ul>
                        {/if}
                  </li>
            {/foreach}
      {/block}
      </ul>

{/if}

Vypisování stromových struktur ze jednoho namespace udělá dva dotazy na DB. Chtěl jsem to celé udělat metodou traverzování kolem stromu, ale tam se mi nelíbily možnosti toho řazení (asi), resp. narazil jsem na problém, který už jsem zapomněl.

Editoval thm (5. 9. 2014 14:21)

nettolog
Člen | 68
+
0
-

To je super, moc mi to usnadnilo práci. Díky, @thm.