Autor | Zpráva | ||
---|---|---|---|
piiiiiiiip Profil |
#1 · Zasláno: 19. 12. 2016, 11:35:47
Dobrý den. Učím se nette a zasekl jsem se na komponentech. Nevíte o nějakém jednoduchém tutoriálu aby se to z něj dalo lechce pochopit (např vypsání dat z db)? Zkoušel jsem ten tutoriál na stránkách nette a jiných co jsem našel ale vždy to zkončilo chybou 500 apod . . .
|
||
Rfilip Profil |
#2 · Zasláno: 19. 12. 2016, 14:03:01
No kromě dokumentace na stránkach nette třeba:
Komponenty pomocí Dependency InjectionOdkaz článek popisující spojení s db v komponentách Vlastní komponenty v Nette článek popisují tvorbu komponenty a její šablony Pokud jde o 500, to ti Latte nevrátila krásnou červenou stránku s přesnou chybou, včetně zvýrazněného řádku kde k ní došlo? Pokud ne, tak se můžeš bud podívat do adresáře log, kde jsou všechny chybové hlášky uložené, nebo si povol debug mode na serveru pomocí najití řádku $configurator->setDebugMode('ip'); v souboru, app/bootstrap.php ten řádek odkomentuj a místo ip dosaď svoji ip adresu (zjisti treba na whatismyip.cz). Ty budeš mít přehlednou error hlášku, ostatní budou mít 500 jako jsi viděl do teď
|
||
piiiiiiiip Profil |
#3 · Zasláno: 19. 12. 2016, 16:26:56
Ten první odkaz vypadá slibně ale než se do toho pustím tak jsem koukal že ten článek je 5 let starý, to nevadí?
|
||
CZechBoY Profil |
#4 · Zasláno: 20. 12. 2016, 12:58:47
Nevadí.
Prvně si ale zapni ten vývojový režim jak píše Rfilip. |
||
piiiiiiiip Profil |
#5 · Zasláno: 21. 12. 2016, 08:38:32
Ok. Děkuji za radu, pustím se do toho :)
|
||
piiiiiiiip Profil |
#6 · Zasláno: 21. 12. 2016, 11:05:43
Stále někde dělám zásadní chybu. Pomohl by mi ji někdo prosím najít když vám popíšu svůj myšlenkový pochod?
Nejdřív si vytvořím model, třeba pro ty články. TestModel.php <?php namespace App\CoreModule\Model; use App\Model\BaseManager; class TestManager extends BaseManager { const TABLE_NAME = 'article'; public function getArticles() { return $this->database->table(self::TABLE_NAME); } } Dále si vytvořím TestControl.php abych mohl renderovat články do šablony. <?php namespace App\CoreModule\Components; use App\CoreModule\Model\TestManager; use Nette\Application\UI\Control; class TestControl extends Control { /** @var TestManager */ private $testManager; public function __construct(testManager $testManager) { parent::__construct(); $this->testManager = $testManager; } public function render() { $this->template->article = $this->testManager->getArticles(); $this->template->render(); } } <h1>{$article->title}</h1> {control article $presenter} - App\CoreModule\Components\TestControl protected function createComponentArticle() { return new TestControl($this->context->getService('TestManager')); } } Nevím jestly jsem úplně mimo, nebo jestly jsem jen něco přehlédl ale nemohu nato přijít. |
||
CZechBoY Profil |
piiiiiiiip:
1) máš špatně velká/malá písmena u názvů tříd 2) komponenta se vykresluje pomocí {control article} případně následují parametry (ale to nedoporučuju)
3) presenter radši napíšu celý znova <?php class ArticlePresenter extends Nette\Application\UI\Presenter { private $testManager; public function __construct(TestManager $testManager) { $this->testManager = $testManager; } protected function createComponentArticle() { return new TestControl($this->testManager); } } Ovšem lepší je udělat továrničku na komponentu a nemusíš vůbec řešit závislosti té komponenty. <?php namespace App\CoreModule\Components; class TestControl extends Nette\Application\UI\Control { // stejně jak máš } interface ITestControlFactory { /** * @return TestControl // zde v @return anotaci uvedeš jakou třídu má továrnička vytvořit */ public function create(); // tuto metodu potom voláš v presenteru } services: - App\CoreModule\Components\ITestControlFactory <?php use App\CoreModule\Components\ITestControlFactory; class ArticlePresenter extends Nette\Application\UI\Presenter { private $testControlFactory; public function __construct(ITestControlFactory $testControlFactory) { $this->testControlFactory = $testControlFactory; } protected function createComponentArticle() { return $this->testControlFactory->create(); // volá se metoda create z ITestControlFactory } } |
||
piiiiiiiip Profil |
CreateComponentArticle jsem upravil na CreateComponentTest a vrací mi to chybu :
Component with name 'test' does not exist. |
||
CZechBoY Profil |
#9 · Zasláno: 23. 12. 2016, 12:40:49
piiiiiiiip:
Pošli víc informací. Šablona, ve které se snažíš použít tu komponentu je šablona toho presenteru, kde máš createComponentTest metodu? |
||
piiiiiiiip Profil |
Dobře. Takže mám tedy ten model:
<?php namespace App\CoreModule\Model; class TestManager extends \App\Model\BaseManager { const TABLE_NAME = 'article'; public function getArticless() { return $this->database->table(self::TABLE_NAME); } } Dále mám TestControl od tut už si nejsem jistý co je špatně. <?php namespace App\CoreModule\Components; use App\CoreModule\Model\TestManager; use Nette\Application\UI\Control; class TestControl extends Control { /** @var TestManager */ private $testManager; public function __construct(TestManager $testManager) { parent::__construct(); $this->testManager = $testManager; } public function render() { $this->template->test = $this->testManager->getArticless(); $this->template->render(); } } interface ITestControlFactory { /** * @return TestControl */ public function create(); // tuto metodu potom voláš v presenteru } <?php namespace App\CoreModule\Presenters; use App\CoreModule\Components\TestControl; use App\CoreModule\Model\TestManager; use App\CoreModule\Components\ITestControlFactory; class TestPresenter extends \Nette\Application\UI\Presenter { private $testControlFactory; public function __construct(ITestControlFactory $testControlFactory) { parent::__construct(); $this->testControlFactory = $testControlFactory; } protected function createComponentTest() { return $this->testControlFactory->create(); // volá se metoda create z ITestControlFactory } } Šablona presenteru App/CoreModule/presenters/test/default.latte (i test.latte pro případ že jsem zmotal názvy) {* Latte template *} {block content} {$test->title} Zkoušel jsem použít BasePresenter ale to mi vrátilo nějakou chybu o chybějícím parametru. |
||
CZechBoY Profil |
#11 · Zasláno: 23. 12. 2016, 17:04:26
Jo, vloz ten createComponentTest do BasePresenteru a predej zavislosti pres inject (metoda zacinajici na inject).
class BasePresenter extends Presenter { private $testControlFactory; public function injectTestControlFactory(ITestControlFactory $f) { $this->testControlFactory = $f; } protected function createComponentTest() { return $this->testControlFactory->create(); } } |
||
piiiiiiiip Profil |
#12 · Zasláno: 23. 12. 2016, 19:18:16
Perfektní už vím jak na to :D. Mockrát děkuji za pomoc :)
|
||
Časová prodleva: 7 let
|
0