Při přidání nového komentáře duplikujeme se mi řádek

jAkErCZ
Člen | 322
+
0
-

Zdravím,
mám takový problém a to je ten že jsem si vytvořil systém komentářů ale jakmile přidám komentář tak se mi do db přidají 2 stejné řádky.

A nechápu kde dělám chybu..

{if ($user->isLoggedIn())}
                   <div class="comment-form">
                       <h4 class="page-header">{_article.comments_add}</h4>
                       {snippet addComment}
                               <form n:name="commentForm" class="ajax" id="add-coment">
                                   <div class="form-group">
                                       <textarea n:name="content" class="form-control" rows="6"></textarea>
                                   </div>
                                   <input type="submit" id="addCommentForm" n:name="send" class="btn btn-primary btn-rounded btn-shadow pull-right ajax" value="Vložit komentář">
                               </form>
                       {/snippet}
                   </div>
                   {else}
                       <br />
                       <p>{_article.forAddingCommentLogIn}</p>
                   {/if}

Presenter:

protected function createComponentCommentForm()
   {
       $form = new Form;
       $form->addHidden('comment_id');
       $form->addHidden('user_id');
       $form->addHidden('article_id');
       $form->addHidden('parent_id');
       $form->addTextArea('content', '')
           ->setAttribute('placeholder','Vložte text komentáře...')
           ->setRequired('Zpráva je povinná!');
       $form->addSubmit('send', '');
       $form->onSuccess[] = [$this, 'commentFormSucceeded'];
       return $form;
   }

   public function commentFormSucceeded(Form $form, ArrayHash $values)
   {
       if ($this->isAjax()) {
           $this->articleManager->saveCommentWithArticle($values);
           $this->flashMessage('Komentář byl vložen.', BasePresenter::MSG_SUCCESS);
           $this->redrawControl('comments');
       } else {
           $this->flashMessage('Nastala chyba, opakujte akci později!', BasePresenter::MSG_ERROR);
       }
       $this->redrawControl('flashMessages');
   }

Model:

public function saveCommentWithArticle($values){
     if (!$values[self::COLUMN_COM_ID]){
       $test = $this->database->table(self::TABLE_COMMENTS)->insert([
             'user_id' => $values->user_id,
             'article_id' => $values->article_id,
             'parent_id' => $values->parent_id ? $values->parent_id : NULL,
             'content' => $values->content
         ]);
       bdump($test);
     }else{
        $this->database->table(self::TABLE_COMMENTS)->where(self::COLUMN_COM_ARTICLE_ID, $values->article_id)->where(self::COLUMN_COM_ID)->update($values);
     }
 }

Výsledek:
NÁHLED

Kde tedy dělám chybu?

Editoval jAkErCZ (14. 1. 2019 16:28)

David Matějka
Moderator | 6445
+
0
-

Neprovedou se ti dva ajax requesty? koukni do developer konzole v prohlížeči v záložce network.

případně se ujisti, že $form->onSuccess[] callback nezapojuješ dvakrát

jAkErCZ
Člen | 322
+
0
-

David Matějka napsal(a):

Neprovedou se ti dva ajax requesty? koukni do developer konzole v prohlížeči v záložce network.

případně se ujisti, že $form->onSuccess[] callback nezapojuješ dvakrát

Tak sem si vrátil $form a taky to co jde do db

Výsledky

Nette\Application\UI\Form #f13e
onAnchor => null
onSuccess => array (1)
0 => array (2)
0 => App\FrontModule\Presenters\ArticlePresenter #2244 { ... }
1 => "commentFormSucceeded" (20)
onError => null
onSubmit => null
onRender => null
httpRequest => null
submittedBy private => Nette\Forms\Controls\SubmitButton #33b3
httpData private => array (7)
element private => Nette\Utils\Html #cc83
attrs => array (3)
action => Nette\Application\UI\Link #7515 { ... }
method => "post" (4)
id => "frm-commentForm" (15)
children protected => array ()
name private => "form" (4)
isEmpty private => false
renderer private => null
translator private => null
groups private => array ()
errors private => array ()
beforeRenderCalled private => null
onValidate => null
currentGroup protected => null
validated private => true
components private => array (6)
comment_id => Nette\Forms\Controls\HiddenField #9fde
user_id => Nette\Forms\Controls\HiddenField #bd12
article_id => Nette\Forms\Controls\HiddenField #3014
parent_id => Nette\Forms\Controls\HiddenField #8cc0
content => Nette\Forms\Controls\TextArea #c6c1
send => Nette\Forms\Controls\SubmitButton #33b3
cloning private => null
parent private => App\FrontModule\Presenters\ArticlePresenter #2244
name private => "commentForm" (11)
monitors private => array (2)
"Nette\Application\UI\Presenter" => array (4)
0 => App\FrontModule\Presenters\ArticlePresenter #2244 { ... }
1 => 1
2 => "commentForm" (11)
3 => array (1) [ ... ]
"Nette\Forms\Form" => array (4)
0 => null
1 => null
2 => null
3 => array (1) [ ... ]

DB:

Nette\Database\Table\ActiveRow #0666
table private => Nette\Database\Table\Selection #00ee
data private => array (7)
comment_id => 3
user_id => 1
article_id => 4
parent_id => null
content => "test" (4)
created_at => Nette\Utils\DateTime #710c
date => "2019-01-14 16:29:51.000000" (26)
timezone_type => 3
timezone => "Europe/Prague" (13)
hidden => 0
dataRefreshed private => false

A dev vrací jen 1 request :D

Phalanx
Člen | 310
+
0
-

@jAkErCZ Nainstaluj si XDebug a zjistíš to hned
návod např. https://knut.brloh.eu/…ro-phpstorm/

jAkErCZ
Člen | 322
+
0
-

Phalanx napsal(a):

@jAkErCZ Nainstaluj si XDebug a zjistíš to hned
návod např. https://knut.brloh.eu/…ro-phpstorm/

Jenže ten mám ale nic tam nevidím jinak…

Phalanx
Člen | 310
+
0
-

Dej si break point na řádek:

<?php
$test = $this->database->table(self::TABLE_COMMENTS)->insert([
?>

a předtím zkontroluj databázi, jestli se tam už něco nevložilo. Pak dávej F8 a kontroluj databázi, kdy se přidá další řádek. Pak zjistíš, že se třeba vyvolává nějaká událost dvakrát nebo se třeba uloží podruhé z tohoto příkazu bdump($test);

Editoval Phalanx (14. 1. 2019 18:12)

jAkErCZ
Člen | 322
+
0
-

Phalanx napsal(a):

Dej si break point na řádek:

<?php
$test = $this->database->table(self::TABLE_COMMENTS)->insert([
?>

a předtím zkontroluj databázi, jestli se tam už něco nevložilo. Pak dávej F8 a kontroluj databázi, kdy se přidá další řádek. Pak zjistíš, že se třeba vyvolává nějaká událost dvakrát nebo se třeba uloží podruhé z tohoto příkazu bdump($test);

Je to divný ale když to projedu xDebugem a pak ukončím debug tak v db mám jen 1 řádek a mimo debug mi to zase dá 2…