| 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: 9 let
|
|||
0