Server Error… nefunguje komponenta

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

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)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Pošli Laděnku. Server Error je dost obecná chyba :).

kozusnik
Člen | 10
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ú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
+
0
-

jo počkat, už asi chápu :)
díky moc :)

Editoval kozusnik (27. 9. 2012 21:30)

kozusnik
Člen | 10
+
0
-

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
+
0
-

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í.

kozusnik
Člen | 10
+
0
-

aha. a jak poznám, od které třídy má dědit?

Twista
Člen | 48
+
0
-

mas to v kodu:

class Widget extends Control // widget dedi od tridy Control, resp. Nette\Application\UI\Control
kozusnik
Člen | 10
+
0
-

aha. díky moc ;)
a mám tedy uvést jako třídu od které dědí Control, Nette\Application\UI\Control nebo to je jedno?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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)