Pokus o velmi primitivní komponentu mi nefunguje
- Aetos
- Člen | 3
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
$this->template->menuItems
inicializuj až v metodě
render() a bude to fungovat.
- Aetos
- Člen | 3
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
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
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
Místo n:href="$link"
, což je ekvivalent
href="{link $link}"
použij href="{plink $link}"
.