Autor Zpráva
piiiiiiiip
Profil
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
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
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);
}
}
S tím ShoutboxControl už je to ale horší.

<?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.');
        } 
    }
}
V tomto souboru místo těch tří teček musím mít ještě tedy renderShoutbox() což jsem dělal takto:

public function renderShoutbox()
    {
        $this->template->shoutbox = $this->shoutboxManager->getShouts();
    }
Podle dokumentace by to mělo vypadat takto?
    $template = $this->template;
    $template->setFile(__DIR__ . '/shoutbox.latte');
    $template->param = $this->shoutboxManager->getShouts();
    $template->render();
Dále jsem si vytvořil shoutbox.latte, zaregistroval jsem to v configu pod services a upravil jsem BasePresenter a layout.latte.
Vrátilo mi to chybu Class 'App\Presenters\Shoutbox' not found.
piiiiiiiip
Profil
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
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();
  }
}
generovaná továrnička (potom přidej do config.neon mezi služby)
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
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
Znamená to, že nemůže najít soubor ve kterém je definovaná třída Shoutbox.
CZechBoY
Profil
Nemáš definovaný namespace u tý třídy Shoutbox? Nebo máš soubor s tou třídou někde mimo robotloader?
piiiiiiiip
Profil
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
   */
Tak se nic nezmění.
CZechBoY
Profil
No tvoje třída se jmenuje ShoutboxControl ne?
piiiiiiiip
Profil
Ano, jmenuje.
CZechBoY
Profil
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
CZechBoY:
Má smysl, aby dělal v Nette když nemá "základy" a ty se mu tady snažíš pracně vysvětlit?
piiiiiiiip
Profil
CZechBoY:
To nepomohlo.
Kcko
Profil
piiiiiiiip:
Díky za info. Vrať se zpátky na nette.org a studuj, případně forum.nette.org/cs/

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: