Komponenta pro drobečkovou navigaci

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

Zdravím,

vytvořil jsem si komponentu pro drobečkovou navigaci:

use Nette\Application\UI\Control;

class Breadcrumb extends Control {

  public $links = array();

  public function render() {
    $this->template->setFile(__DIR__ . '/breadcrumb.latte');
    $this->template->links = $this->links;
    $this->template->render();
  }

  public function addLink($text, $link, $title = null) {
    $this->links[] = array(
      'text' => $text,
      'link'  => $link,
      'title' => $title
    );
  }

}

V presenteru ji pak volám takto:

class HomepagePresenter extends BasePresenter {

  protected function createComponentBreadcrumb() {
    $control = new Breadcrumb();
    $control->addLink(
      $this->translator->translate('homepage.breadcrumb.text'),
      $this->link("Homepage:default"),
      $this->translator->translate('homepage.breadcrumb.title')
    );
    return $control;
  }

}

Občas má presenter dvě render metody → potřebuji dvě drobečkové navigace. Napadlo mě, že bych v rámci presenteru vytvořil pole a to pak předal komponentě, ale moc se mi to nelíbí. Existuje lepší způsob? Díky za radu.

Editoval radekBrno (6. 10. 2014 23:18)

Tharos
Člen | 1030
+
0
-

Můžeš to vyřešit snadno třeba tak, že drobečkovou navigaci donastavíš v každé action metodě:

public function actionDefault()
{
	$this['breadcrumb']->addLink(...);
}

Mimochodem, proč má ta proměnná $links v Breadcrumb viditelnost public? :)


A ještě jeden tip, v aktuálním Nette můžeš tu render metodu v komponentě zjednodušit:

public function render() {
	$this->template->links = $this->links;
	$this->template->render(__DIR__ . '/breadcrumb.latte');
}

Metodě Template::render lze předat cestu k souboru s šablonou.

Editoval Tharos (7. 10. 2014 0:10)