Server Error… nefunguje komponenta
- kozusnik
- Člen | 10
Ahoj, mám problém s komponentou… teprve se je učím, tak omluvte má
stupidní chyby a dotazy :D
Pokusil jsem se vytvořit komponentu, ale háže mi to Server Error a nevím,
jak to zpravit …
HOMAPAGE PRESENTER
<?php
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
private $connection;
public function injectDatabase(Nette\Database\Connection $connection)
{
$this->connection = $connection;
}
public function renderDefault() {
// připojíme komponentu do presenteru
$widget = new Widget();
$this->template->widget = $widget->content;
}
}
DEFAULT.LATTE
{block content}
TENTO WEB JE VE VÝSTAVBĚ
<a n:href="Sign:in"> SIGN</a> <br>
{$widget}
{/block}
WIDGET.PHP
<?php
use Nette\Application\UI\Control;
class Widget extends Control
{
public function render()
{
$template = $this->template;
$template->setFile(dirname(__FILE__) . '/widget.latte');
// vložíme do šablony nějaké parametry
$template->content = "obsah proměnné content";
// a vykreslíme ji
$template->render();
}
}
WIDGET.LATTE
nějaký text
Prostě nevím, kde je chyba :/ Prosím o pomoc
Editoval kozusnik (27. 9. 2012 20:47)
- kozusnik
- Člen | 10
vojtech.dobes promiňte mou hloupou chybu, ale který soubor
to má být?
je to toto?:
[2012-09-27 20-40-17] Nette\MemberAccessException: Cannot read an undeclared property Widget::$content. in /data/web/virtuals/28025/virtual/libs/Nette/common/ObjectMixin.php:174 @ http://womap.cz/ @@ exception-2012-09-27-19-36-30-4c3df1b1d47f7d83320bc3085f1e4452.html
- Vojtěch Dobeš
- Gold Partner | 1316
Ahá, taky jsem se mohl hned podívat pořádněji. Btw, není proč se omlouvat…
Komponenty se používají pomocí tzv. továrniček. Doporučuju se mrknout
do dokumentace a do Quickstartu… továrnička je protected
metoda
presenteru s názvem ve tvaru createComponent<Název>
.
Takže si vytvoř metodu:
protected function createComponentWidget()
{
return new Widget;
}
A v šabloně jen volej:
{control widget} {* to widget je camelcase verze odpovídající názvu ve jménu té továrničky *}
Chyba, co ti to hlásí, je pochopitelně protože tvoje třída
Widget
žádnou public property s názvem content
nemá, nemůžeš ji tedy předávat
($this->template->widget = $widget->content
).
Každopádně práce s komponentama viz výše jak jsem popsal.
- kozusnik
- Člen | 10
aha. už to jede :)
chtěl bych se zeptat ještě na jednu věc, a sice, jak mám získat ty data
z widget.latte…? Nebo resp. proč tam vůbec je? čtu tady, že tam se
vloží jakási kostra, jak to bude vypadat, ale nikde potom nevidím, jak je
ten výpis ovlivněn tímto souborem… to je automatické, nebo jak to
funguje?
Editoval kozusnik (27. 9. 2012 21:22)
- Nox
- Člen | 378
Co myslíš přesně „získat data z widget.latte“. Latte je šablona, ta naopak akorát data příjmá. Jestli zprostředkovává nějakou interakci, tak použij signály widgetu a předej mu nějaký objekt(y), který bude umět tu akci zpracovat. Bude to asi chtít říct konkrétněj, i když to třeba jen zkoušíš
- Vojtěch Dobeš
- Gold Partner | 1316
Úplně nerozumím… do šablony se předávají data, a v ní se
vykreslí. Komponenty lze taky vykreslovat, makro {control ...}
ve
skutečnosti volá právě metodu render()
té tvojí
komponenty.
- kozusnik
- Člen | 10
akorát mám ještě poslední dotaz…tady https://doc.nette.org/cs/quickstart se píše toto:
public function __construct(Nette\Database\Table\Selection $selected, TaskRepository $taskRepository)
{
parent::__construct(); // vždy je potřeba volat rodičovský konstruktor
$this->selected = $selected;
$this->taskRepository = $taskRepository;
}
a že se má volat rodičovský konstruktor… co to je rodičovský konstruktor? děkuji
- Vojtěch Dobeš
- Gold Partner | 1316
Hm, možná by nezaškodilo trochu si pročíst dokumentaci OOP v PHP :). Ale já se taky OOP učil spolu s Nette… rodičovský konstruktor je konstruktor třídy, od které aktuální třída dědí.
- Vojtěch Dobeš
- Gold Partner | 1316
kozusnik Vážně si přečti dokumentaci PHPka. Nebo nějaký úvod do OOP. Nette fórum by se nemělo stát obecnou poradnou pro PHP. Od toho je jiné fórum…
Obě uvedené třídy jsou to samé, první varianta je bez namespace.
Editoval vojtech.dobes (27. 9. 2012 22:34)