Autor Zpráva
piiiiiiiip
Profil
Udělal jsem si v Nette vypisování článků. Když článek rozkliknu tak ho chci mít možnost komentovat. Udělal jsem si tedy k modelu, presenteru a template toho článku ještě model a presenter pro komentáře (zatím jen vypisování). Nevím ale jak ty komentáře dostat do šablony toho článku.
Alphard
Profil
Jestli mají být komentáře na stejné stránce se článkem, je třeba je načíst v presenteru článku, nejde to zcela oddělit.
Konkrétní implementace šablony záleží na návrhu, mohla by to být třeba komponenta, ale jestli začínáte, nebál bych se přidat je jako includovaný blok přímo k tomu článku.

public function renderArticle($id) {
  $this->template->article = $articlesModel->find($id);
  $this->template->comments = $commentsModel->findByArticle($id);
}
piiiiiiiip
Profil
Když udělám šablonu pro komentáře a do šablony pro článek dám
{include 'comments.latte'}
Tak mi to vyhodí chybu:
Undefined variable: comments.



Edit: Už jsem nato přišel.

Funkce v modelu:
   public function getComments($url)
    {
        return $this->database->table(self::TABLE_NAME)->WHERE(self::COLUMN_URL, $url);
    }
mi vyhodí chybu: Cannot read an undeclared property Nette\Database\Table\Selection::$comment_content.
když ale na konec připíšu fetch() tak mi to vypíše jeden komentář ale tu chybu ne. Nevíte proč?
Alphard
Profil
comment_content je název sloupce? Metoda fetch() vyhodnotí dotaz a vrátí výsledek. Dokud ji nezavoláte, tak pracujete s instancí Table\Selection.
Když těch komentářů chcete více, použijte foreach, pak se implicitně zavolá fetchAll(), nebo tak něco.
piiiiiiiip
Profil
Už to běží, děkuji za pomoc :)
piiiiiiiip
Profil
Ještě se chci zeptat jak dostanu proměnou url článku, podle které se určí k jakému článku komentář patří do formuláře pro přidávání komentářů? Formulář vytvořím v presenteru článků ve kterém jsem s tou proměnnou už pracoval, ale když ji chci dát do toho formuláře:
$form->addText('comment_url', 'URL')->setRequired()->setValue($url);
Tak mi místo té proměnné do políčka URL vypíše název formuláře.
Keeehi
Profil
Na první pohled nevidím chybu. Jedině, že bys v proměnné url měl něco jiného než si myslíš.
Jinak předávat si URL mi přijde zbytečné. Pokud by SIS chtěl něco předávat, pak by bylo asi hezčí ID článku. Ale ani to by nemělo být potřeba. Formulář je v nějakém presenteru a ten zná svoji URL i parametry. Z formuláře bys tedy měl být schopen zjistit, co je v URL a tudíž i potřebný identifikátor.
piiiiiiiip
Profil
Já jsem se nato snažil přijít asi čtyři hodiny ale tu chybu prostě nemůžu najít.
Takto si vytvořím formulář pro komentování v ArticlePresenter.php.
   protected function createComponentEditorFormm($url)
    {
        $form = new Form;
        $form->addGroup('Komentuj');
        $form->addHidden('comment_id');
        $form->addText('comment_url', 'URL')->setRequired()->setValue($url);
        $form->addText('posted_by', 'Autor:')->setRequired();
        $form->addTextArea('comment_content', 'Komentář:')->setRequired();
        $form->setCurrentGroup(NULL);
        $form->addSubmit('submit', 'Odeslat');
        $form->onSuccess[] = [$this, 'editorFormmSucceeded'];
        return $form;
    }
ale tu proměnou url (může být i id to je víceméně jedno) tak nedostanu. Do políčka URL mi to vypíše editorFormm místo například uvod, nebo test (název - url článku) apod . . .
Taps
Profil
Podivej se na doc.nette.org/cs/2.4/http-request-response
piiiiiiiip
Profil
Já nepotřebuju nic s URL adresou. Já mám v databázi v tabulce pro články sloupec url do kterého se zapisuje název článku bez speciálních znaků. Takže když mám článek jménem Úvod tak se do url v db uloží uvod a když chci článek přečíst tak zadám url adresu web.cz/test. Když pod ten článek napíšu komentář tak ta proměnná url z db se uloží i do tabulky komentáře abych věděl který komentář patří k jakému článku ale nemůžu tu proměnnou uložit do tabulky pro komentáře protože ji nedostanu do formuláře.
Taps
Profil
Tim padem musis pres model ziskat radek z databaze, ktery se vztahuje ke konkretnimu clanku. Vytahnout z nej url a nastavit ji jako setValue formularovemu poli
piiiiiiiip
Profil
To už ale mám. Kdybych to neměl tak ten článek přece nevypíšu. Já to akorát nedostanu do toho formuláře.
Taps
Profil
Dival ses na pla.nette.org/cs/vychozi-data-pro-editacni-formular ?
piiiiiiiip
Profil
Já tam potřebuju jen dostat tu proměnnou a nic víc.
Keeehi
Profil
Takhle se ale data do komponenty nepředávají.
createComponentEditorFormm($url)

Z dokumentace Metoda createComponent($name) zavolá v aktuální komponentě metodu createComponent<název komponenty> a jako parametr jí předá název komponenty.

Volal bych něco jako
$this->getPresenter()->request->getParameter("jméno identifikatoru v url")
v metodě kde zpracováváš už odeslaný formulář.
piiiiiiiip
Profil
Odeslaný formulář zpracovávám takto:
    public function saveComment($comment)
    {
        if(!$comment[self::COLUMN_ID])
            $this->database->table(self::TABLE_NAME)->insert($comment);          
        else
            $this->database->table(self::TABLE_NAME)->WHERE(self::COLUMN_ID, $comment[self::COLUMN_ID])->update($comment);
    }
$comment jsou data z formuláře, tu url teda musím dostat do db tím že v metodě saveComment nechám proběhnout ten první dotaz (insert) a vytvořím ještě druhý, který upraví sloupec comment_url právě vytvořeného komentáře, nebo to jde jednodušeji?
Taps
Profil
Podle me cela ta problematika vlozeni komentare je zbytecne komplikovana. Tak jak podotkl [#7] Keeehi v praxi se nejcasteji pouziva id (clanku, komentare)..tim je zaroven i zajistena unikatnost zaznamu, se kterym budes pozdeji pracovat (editovat, mazat). Vlozeni a nasledna editace komentare je z meho pohledu zbytecna.

V praxi se nejcasteji jedna o ulozeni komentare (1 sql prikaz). Pri ulozeni komentare se zaroven ulozi jeho unikatni id (neni potreba zadna nasledna editace)
piiiiiiiip
Profil
ID článků je article_url (je unikátní). To id článku (article_url) musím uložit do komentáře když ten článek komentuji. Kdybych to neudělal tak se mi vypisují všechny komentáře ke všem článkům. já akorát nevím jak to id článku (article_url) do toho komentáře dostat. Když jsem to dělal ve statickym php tak to nebyl problém, tet se ale učím to nette a nevím jak to udělat.
Taps
Profil
piiiiiiiip:
Mas to nekde na ftp, ze bych se na to podival?
piiiiiiiip
Profil
Nemám. Můžu sem dát kod jestly to pomůže.
Taps
Profil
Zipni mi tu appku a posli na mail ( mam ho v profilu).Podivam se na to
CZechBoY
Profil
Lepší dát na github
piiiiiiiip
Profil
Github nepoužívám.
Kcko
Profil
Děkujeme za informaci.
piiiiiiiip
Profil
Jinak už jsem nato přišel. Pokut to někoho bude zajímat.
ArticlePresenter:
¨ public function editorFormmSucceeded($form, $values)
    {
        try{
            $data = $values;
            $data['comment_url'] = $this->getParam('url');
            $url = $this->commentsManager->saveComment($data);
            $this->flashMessage('Komentář byl uložen.');
            $this->redirect(':Core:Article:', $values->comment_url);
        } catch (UniqueConstraintViolationException $ex) {
            $this->flashMessage('Komentář s tímto URL již existuje.');
        } 
    }
Kcko
Profil
piiiiiiiip:
Nic moc řešení, URL si přes GET skutečně posílat nemusíš, dá se to vyřešit uvnitř objektu, podívej se na příklady na NETTE do cookboku, někdo Ti už sem odkaz dal (Taps).
PS. Nejlepší bude, pokud se na Nette budeš ptát na oficiálním fóru a pokud ještě zapracuješ na svojí bídné češtině bude to velké plus.
piiiiiiiip
Profil
Kcko:
pla.nette.org/cs/vychozi-data-pro-editacni-formular
To jsem zkoušel a nešlo to.
piiiiiiiip
Profil
Pročítal jsem si doc.nette.org a tam ty komentáře v jednom z těch příkladů řešily takto:

$data['comment_url'] = $this->getParameter('url');

akorát použily id místo url. Což je to samé jako getParam() nebo né?
Jan Tvrdík
Profil
piiiiiiiip:
Metoda getParam() je už dlouho dobu deprecated, v budoucnu bude pravděpodobně odstraněna. Měl bys vždycky používat getParameter().
piiiiiiiip
Profil
Ano tu už tet používám.

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: