Komentáře ke článku které se po přidání překreslí

jAkErCZ
Člen | 324
+
-2
-

Zdravím,

Mám udělané články a rád bych s k nim udělal možnost přidat komentáře..

Všechno tak nějak mám ale je tu pár věcí kde prostě nevím jak pokročit…

Udělal sem si funkci na výpis komentářů ale problém nastává v tom že mi to vypisuje reply komentáře jako hlavní ale přitom bych rád aby mi to vrátilo hlavní komentáře a pod nimi by byli případné odpovědi pokud jsou… takže by mi to vrátilo něco jako 2× foreach jeden na hlavní a v něm další na odpovědi… třeba

Struktura kometářů

comment_id	int(11) Auto Increment
user_id	int(11)
article_id	int(11)
parent_id	int(11) NULL
content	text
created_at	timestamp [CURRENT_TIMESTAMP]
images	int(11) [0]

pak bych chtěl udělat že pokud člověk přidá článek tak se článek jen přidá pod ostatní bez reloadu stránky… a poté když klikne na reply tak mu to v textovým poli napíše placeholder=„Odpovídáte na komentář uživetele JMÉNO“

       <div class="comments">
                    <h4 class="page-header"><i class="fa fa-comment-o"></i> Comments ({$comments_count})</h4>
                    <a href="#" class="btn btn-block btn-primary text-left margin-bottom-30"><i class="fa fa-spinner fa-pulse margin-right-10"></i> Load more 4 comments</a>
                    {snippet comments}
                        <div n:foreach="$comments as $comment" class="media">
                            <a class="media-left" href="#">
                                <img src="{$basePath}/images/user/avatar3.jpg" alt="" />
                            </a>
                            <div class="media-body">
                                <div class="media-content">
                                    <a href="#" class="media-heading">{$comment->user->username}</a>
                                    <a n:if="$user->isLoggedIn()" n:href="reply! $comment->user->user_id" class="btn btn-sm btn-primary pull-right ajax">reply</a>
                                    <span class="date">{$comment->created_at|date:'j. n. Y H.i'}</span>
                                    <p>{$comment->content}</p>
                                </div>

                                <div class="media">
                                    <a class="media-left" href="#">
                                        <img src="{$basePath}/images/user/avatar.jpg" alt="" />
                                    </a>
                                    <div class="media-body">
                                        <div class="media-content">
                                            <a href="#" class="media-heading">YAKUZI</a>
                                            <a href="#" class="btn btn-sm btn-primary pull-right">reply</a>
                                            <span class="date">April 15, 2016 at 13:00 am</span>
                                            <p>Duis ultricies commodo accumsan. Donec augue leo, feugiat lobortis ex ut, convallis blandit arcu.</p></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    {/snippet}
                    <div class="comment-form">
                        <h4 class="page-header">Leave a comment</h4>
                        {if ($user->isLoggedIn())}

                            <form n:name="commentForm">
                                <div class="form-group">
                                    <textarea n:name="content" class="form-control" rows="6" placeholder="Your Comment"></textarea>
                                </div>
                                <input type="submit" id="addCommentForm" n:name="send" class="btn btn-primary btn-rounded btn-shadow pull-right" value="Submit Comment">
                            </form>

                        {else}
                        <p>Pro přidání komentáře je nutné se přihlásit</p>
                        {/if}

                    </div>
                </div>
    public function renderDefault($url)
    {
        if (!$url) $url = $this->redirect(':Front:Homepage:default'); // Pokud není zadaná URL, vykreslí se hlavní stránka.
        if (!($article = $this->articleManager->getArticle($url))) throw new BadRequestException();
        /* Načítání funkcí */
        $comments = $this->articleManager->getComments($article->article_id);
        bdump($comments);
        /* Načítání funkcí do šablony */
        $this->template->article = $article; // Předá článek do šablony.
        $this->template->comments_count = $article->related('comment')->count();
        $this->template->comments = $comments;
        $this['commentForm']->setDefaults([
            'user_id' => $this->user->id,
            'article_id' => $article->article_id,
        ]);
    }

    public function handleReply($parent_id){
        if ($this->isAjax()) {
            $this['commentForm']->setDefaults([
                'parent_id' => $parent_id,
            ]);
            bdump($parent_id);
        }
        $this->redrawControl('flash');
    }

    protected function createComponentCommentForm()
    {
        $form = new Form; // means Nette\Application\UI\Form

        $form->addHidden('user_id');
        $form->addHidden('article_id');
        $form->addHidden('parent_id');

        $form->addTextArea('content', 'Komentář:')
            ->setRequired();
        $form->addSubmit('send', '');
        $form->onSuccess[] = [$this, 'commentFormSucceeded'];
        return $form;
    }

    public function commentFormSucceeded(Form $form, ArrayHash $values)
    {
        if ($this->isAjax()) {
            $this->flashMessage('Děkuji za komentář', 'success');
            $this->redrawControl('comments');
            bdump($values);
        } else {
            $this->flashMessage('Nefunguje', BasePresenter::MSG_ERROR);
        }

    }

Můj model kde se pokouším vymyslet aby to vracelo zvlášť v jiným foreach ty odpovědi…

	public function getComments($article_id, $parent_id = NULL){

	    if ($parent_id === NULL) {
            $comment = $this->database->table(self::TABLE_COMMENTS)->where(self::COLUMN_COM_ARTICLE_ID, $article_id)->order('created_at')->fetchAll();
        } else {


        }

        return $comment; // vrátit komentáře

    }

Tady jsem se o něco pokoušel ale ty ten snippet se nepřekreslil a nevím proč..

Všem děkuji za rady a pomoc.

Editoval jAkErCZ (10. 10. 2018 14:59)

Pavel Kravčík
Člen | 1205
+
+1
-

Nepřekreslení snippetu může mít mnoho příčin:

  1. Rozchozený ajax v Nette
  2. Pokud nette.ajax – třída „ajax“ u odkazu
  3. Správná struktura (nevolá se z komponenty jinam apod)
  4. Pokud je to zanořené (include) musíš použít {snippetArea}

Tipuji problém v zanořené komponentě – viz https://doc.nette.org/…ication/ajax#…

PS: Být Tebou zkusil bych mrknout po nějaké práci, zkus najít nějakou juniorskou pozici, kde Ti tyhle věci vysvětlí on-site a mnohem rychleji, než když založíš každý týden na fóru „plachtu“ (čti: dlouhé vlákno).