Pokus o velmi primitivní komponentu mi nefunguje

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

Ahoj,
předem chci upozornit, že jsem ohledně Nette naprostý začátečník. Ale OOP programování mi není cizí. Tak jsem si říkal že Nette nebude problém, ale je. Studuji ho asi tak den, a právě jsem dokončil základní tutorial. Co se mi líbilo ze všeho nejvíce ( zatím ) jsou komponenty. Ale v quickstartu je to probráno tak, že se mi to nepodařilo pobrat.
Takže se pokouším udělat první komponentu. A to takovou, že místo toho abych menu umístil do BasePresenteru, tak z něho chci udělat componentu a zobrazovat ho na každé stránce. Ale nějak mi to nejde. Pokusil jsem se o co nejprimitivněkší způsob, abych pochopil jak to funguje. Přikládám tři soubory co jsem vytvořil.

componenta Menu.php

use Nette\Application\UI\Control;

class Menu extends Control {
    public function __construct() {
        parent::__construct();
        $this->template->menuItems = array(
                'Hlavní stránka' => 'HomePage:',
                'Druhá stránka' => 'DruhaStranka:'
        );
    }
    public function render() {
        $template = $this->template;
        $this->template->setFile(__DIR__ . '/Menu.latte');
        $template->render();
    }
}

šablona Menu.latte

<ul id="menu_hlavni" n:inner-foreach="$menuItems as $item => $link">
    <li>
        <a n:href="$link" {ifCurrent $link}class="aktivni_odkaz"{/ifCurrent}>{$item}</a>
    </li>
</ul>

BasePresenter.php

abstract class BasePresenter extends Nette\Application\UI\Presenter {
    public function renderDefault() {

    }
    protected function createComponentMenu() {
        $menu = new Menu;
        return $menu;
    }
}

a vkládám jí ( tu componentu ) do @layout.latte

{control menu}

Chybová hláška:
Call to a member function link() on a non-object

Možná je to v nette, a možná tím, že jsem v php dost dlouho nic nedělal. Nevím. Ale budu velmi vděčen když mě měkdo posune k řešení.

Mnohokrát děkuji

Jan Tvrdík
Nette guru | 2595
+
0
-

$this->template->menuItems inicializuj až v metodě render() a bude to fungovat.

Aetos
Člen | 3
+
0
-

Díky, za radu, posunul jsem se kousek dál. Jen teď mi to hlásí, že komponenta se jménem Homepage neexistuje. Co s tím? No když tak se v tom budeu ještě vrtat.
A můžu mít ještě jednu otázku? Co je to ten „template“? Je to třída, nebo je to zděděná proměnná a nebo …? Prošel jsem si dokumentaci a nějak to nemůžu rozlousknout co je to ten template. Je přítomný i když není deklarovaný v té konkrétní třídě. Já jsem Javista, jsem asi moc zhýčkaný dokumentací a tutorialy :-)

Editoval Aetos (1. 3. 2012 22:29)

pawouk
Člen | 172
+
0
-

No mám pocit že by ti to spíš mělo psát že Presenter with name HomePage neexistuje co? Pak bych řekl, že to je tím, že jsi u Page napsal velké P, takže správně je Homepage. Ještě bych možná před Homepage dal dvojteřku (:) tím žekneš at bere ten link jako absolutní (tedy od začátku). Pak už by ho to mělo brát rozhodně jako Presenter, max jako Modul, ale to bych ted neřešil. No template je prostě tempalte. V API dokumentaci je to poměrně dobře dohledatelné. Jinak template je dustupný ve všech třídách které dědí od Control.

Aetos
Člen | 3
+
0
-

Děkuji mnohokrát. Ale bohužel mi to nepomohlo. To s tím HomePage vs. Homepage jsem už před tím přepsal. A : je za linkem, když jí dám před link, hlásí mi to, že je prázdný řetězec. Prostě to chápe, odkaz jako komponentu. Ale co s tím? Teď raději nic. Vrátil jsem menu do BasePresenteru s tím, že to vyřeším, až se víc naučím. Teď budu dělat nějaké jiné věci, raději. Ale problém zůstává stále otevřený.

Díky za pomoc

Jan Tvrdík
Nette guru | 2595
+
0
-

Místo n:href="$link", což je ekvivalent href="{link $link}" použij href="{plink $link}".