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

jAkErCZ
Člen | 321
+
-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 | 1180
+
+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).