Autor | Zpráva | ||
---|---|---|---|
piiiiiiiip Profil |
#1 · Zasláno: 8. 10. 2016, 12:05:06
Dobrý den, chtěl bych si do nette webu přidat shoutbox do postraního panelu. V levém by se mi vypisovaly články (hlavní obsah každé stránky - na každé jiný) a na každé stránce v pravém by byl ten shoutbox což nevím jak v nette udělat (můžu zobrazit jen obsah, nebo shoutbox - nevím jak rozjet dvě věci najednou) tak se chci zeptat jestly by jste mě nenasměrovaly na nějaký návod, nebo tutoriál.
|
||
CZechBoY Profil |
#2 · Zasláno: 8. 10. 2016, 19:28:38
Na čem přesně ses zasekl?
V @layout.latte si definuješ pravý panel v html a vypíšeš tam komponentu shoutbox, kterou vytvoříš v nějakým BasePresenteru (předek všech presenterů). abstract class BasePresenter extends Nette\Application\UI\Presenter { protected function createComponentShoutbox() { return new Shoutbox; } } class Shoutbox extends Control { public function render() { // do templatu nasypeš proměnnný $this->template->setFile(__DIR__ . '/shoutbox.latte'); $this->template->render(); } } <!doctype html> <html> <head> </head> <body> <div class="container"> <div class="col-md-8"> {include content} </div> <div class="col-md-4"> {control shoutbox} </div> </div> </body> </html> |
||
piiiiiiiip Profil |
Nasměrujete mě k nějakému tutoriálu na ty Komponenty?
Tenhle nechci doc.nette.org/cs/2.4/components Já jsem ten shoutbox udělal normálně jako bych dělal stránku (například články) ale prostě mi to nefunguje tak jak chci. |
||
CZechBoY Profil |
#4 · Zasláno: 9. 10. 2016, 16:50:22
A co ti chybi v te strance v dokumentaci?
Co ti nefungovalo v tvym pristupu? Nestaci ti ten muj kod jako nastrel kostry? |
||
piiiiiiiip Profil |
Podle tvého kodu zhruba vím jak ten shoutbox dostat do šablony. Problém je v tom že jsem ten shoutbox udělal jako stránku, ne jako aplikaci do postraního panelu. Podle toho co jsem pochopil z té dokumentace je to tak ale špatně. Z té dokumentace vyplívá že musím vytvořit soubor ShoutboxControl.php ve složce components což bude sloužit jako presenter. Model bude nezměněn a už se ztrácím.
Takže, takhle jsem si udělal jednoduchý model, s tím by problém být neměl. <?php namespace App\Model; use App\Model\BaseManager; class ShoutboxManager extends BaseManager { const TABLE_NAME = 'shoutbox', COLUMN_ID = 'shout_id'; public function getShouts() { return $this->database->table(self::TABLE_NAME)->order(self::COLUMN_ID . ' DESC'); } public function saveShout($shout) { if(!$shout[self::COLUMN_ID]) $this->database->table(self::TABLE_NAME)->insert($shout); else $this->database->table(self::TABLE_NAME)->where(self::COLUMN_ID, $shout[self::COLUMN_ID])->update($shout); } } <?php use App\Model\ShoutboxManager; use Nette\Application\BadRequestException; use Nette\Application\UI\Form; use Nette\Database\UniqueConstraintViolationException; use Nette\Application\UI; class ShoutboxControl extends Control { protected $shoutboxManager; private $database; public function __construct(ShoutboxManager $shoutboxManager) { parent::__construct(); $this->shoutboxManager = $shoutboxManager; } ... public function actionEditorshout($shout_id) { if($shout_id) ($shout = $this->shoutboxManager->getShouts($shout_id)) ? $this['editorFormsshoutbox']->setDefaults($shout) : $this->flashMessage ('Shout nenalezen.'); } public function ereateComponentEditorFormshoutbox() { $form = new Form; $form->addHidden(shout_id); $form->addGroup('Shoutbox:'); $form->addText('nick', 'Jméno')->setRequired(); $form->addText('shout', 'Text')->setRequired(); $form->setCurrentGroup(NULL); $form->addSubmit('submit', 'Vložit'); $form->onSuccess[] = [$this, 'editorFormshoutboxSucceeded']; return $form; } public function editorFormshoutboxSucceeded($form, $values) { try { $this->shoutboxManager->saveShout($values); $this->flashMessage('Přízpěvek byl úspěšně uložen.'); $this->redirect(':Core:Shout:', $values->url); } catch (UniqueConstraintViolationException $ex) { $this->flashMessage('Přispěvek s tímto URL již existuje.'); } } } public function renderShoutbox() { $this->template->shoutbox = $this->shoutboxManager->getShouts(); } $template = $this->template; $template->setFile(__DIR__ . '/shoutbox.latte'); $template->param = $this->shoutboxManager->getShouts(); $template->render(); Vrátilo mi to chybu Class 'App\Presenters\Shoutbox' not found. |
||
piiiiiiiip Profil |
#6 · Zasláno: 9. 10. 2016, 18:50:34
Toho bych se mohl zbavit tím že přesunu ShoutboxControll.php a shoutbox.latte do App\Presenters\ to mi ale vrátí chybu Argument 1 passed to ShoutboxControl::__construct() must be an instance of App\Model\ShoutboxManager, none given, called in C:\xampp\htdocs\first-web\app\presenters\BasePresenter.php on line 43 tak nevím jestly jsem na správné stopě nebo úplně mimo.
|
||
CZechBoY Profil |
#7 · Zasláno: 10. 10. 2016, 10:28:14
Místo action použij signál - handleXXX (btw. ten by měl jít i v presenteru).
Render metodu bych pojmenoval vždycky jen render (pokud nemáš více různých vykreslení komponenty). Pokud chceš předat závislosti tak se hodí vytvořit továrničku a přes ni potom vytvářet tu komponentu. <?php class BasePresenter extends Presenter { /** * @var IShoutboxFactory * @inject */ public $shoutboxFactory; protected function createComponentShoutbox() { return $this->shouboxFactory->create(); } } interface IShoutboxFactory { /** * @return Shoutbox */ public function create(); } |
||
Kcko Profil |
piiiiiiiip:
Stáhni si ukázkovou aplikaci kde se používají hlavně komponenty a třeba to pochopíš. CZechBoY: Nejsou mu jasné základy (Presenter vs Komponenta, životní cyklus ...), jinak se snažíš pěkně :-) |
||
piiiiiiiip Profil |
#9 · Zasláno: 10. 10. 2016, 17:39:05
CZechBoY:
Tet mi to crací chybu Nette\DI\ServiceCreationException Check a @return annotation of the IShoutboxFactory::create() method used in service '32_IShoutboxFactory', class 'Shoutbox' cannot be found. Znamená to že nemůže vytvořit ccomponentu? |
||
Keeehi Profil |
#10 · Zasláno: 10. 10. 2016, 18:59:02
Znamená to, že nemůže najít soubor ve kterém je definovaná třída Shoutbox.
|
||
CZechBoY Profil |
#11 · Zasláno: 10. 10. 2016, 19:06:53
Nemáš definovaný namespace u tý třídy Shoutbox? Nebo máš soubor s tou třídou někde mimo robotloader?
|
||
piiiiiiiip Profil |
#12 · Zasláno: 10. 10. 2016, 19:18:30
ShoutboxManager mám v namespace App\Model;
ShoutboxControl mám v namespace Components; ShoutboxPresenter mám v namespace App\Presenters; ShoutboxFactory mám v namespace Components (tam jsem měl překlep) Tet mi to vrací chybu: Nette\DI\ServiceCreationException Class IShoutboxFactory used in service '32_IShoutboxFactory' not found or is not instantiable. Cache jsem smazal a nepomohlo. |
||
CZechBoY Profil |
Takhle vypadá ten interface?
interface { /** * @return ShoutboxControl */ public function create(); } |
||
piiiiiiiip Profil |
Ano.
I když to změním na /** * @return Shoutbox */ |
||
CZechBoY Profil |
#15 · Zasláno: 10. 10. 2016, 21:22:21
No tvoje třída se jmenuje ShoutboxControl ne?
|
||
piiiiiiiip Profil |
#16 · Zasláno: 10. 10. 2016, 21:23:31
Ano, jmenuje.
|
||
CZechBoY Profil |
#17 · Zasláno: 10. 10. 2016, 21:53:02
Tak v @return anotaci musí být název té třídy, pokud je jiný namespace tak ještě musíš dát nahoru use xxx.
|
||
Kcko Profil |
#18 · Zasláno: 10. 10. 2016, 21:59:29
CZechBoY:
Má smysl, aby dělal v Nette když nemá "základy" a ty se mu tady snažíš pracně vysvětlit? |
||
Časová prodleva: 3 dny
|
|||
piiiiiiiip Profil |
#19 · Zasláno: 14. 10. 2016, 08:13:21
CZechBoY:
To nepomohlo. |
||
Kcko Profil |
#20 · Zasláno: 14. 10. 2016, 09:22:08
piiiiiiiip:
Díky za info. Vrať se zpátky na nette.org a studuj, případně forum.nette.org/cs/ |
||
Časová prodleva: 8 let
|
0