Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Denkwijze voor nested comment.

Pagina: 1
Acties:

  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 14:57
Ik probeer nested comments weer te geven in de format van het template dat ik gebruik.
Hierbij wordt gebruik gemaakt van <ol> en <li>. Het problem is dat ik het niet netjes voor elkaar krijg om de comments op te halen en netjes weer te geven in de juiste structuur van <ol> en <li>

Voorbeeld (ook op JSFiddle):
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<ol class="comment-list">
    <li class="comment">
        <div id="comment 1"></div>
    </li>
    <li class="comment">
        <div id="comment 2"></div>
        <ol class="children">
            <li class="comment">
                <div id="comment 3"></div>
            </li>
        </ol>
    </li>
</ol>


Er wordt dus in de <li> genaamd 'comment' en nieuwe <ol> gestart om de nested comment weer te geven. Dit kan verschillende niveaus doorgaan.

Hieronder de halve pseudo code waarbij het ook al fout gaat maar ik kom er niet uit welke volgorde ik moet gebruiken om één functie te krijgen die netjes omgaat met 'hoofd' comments en 'children' comments.

Halve pseudo code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Start comment list
echo  <ol class="comment-list">
    // Running comment function
    getComments($messageid);
echo  </ol>


function getComments($messageid, $parent_id = 0) {
    // Get comments from database
    $aComments =  Comments uit database met $commentid en $parent_id
    
    // Check for parent_id and start children ol
    if($parent_id !== 0) {
        echo <ol class="children">
    }
    
    // Run through the comments
    for loop door $aComments {
        echo <li class="comment">
            echo comment div
            draai getComments($messageid,$commentid)
        echo </li>
    }
    
    // Check for parent_id and end children ol
    if($parent_id !== 0) {
        echo </ol>
    }
}


Ik ben bewust niet opzoek naar een uitgeschreven stukje code.
Het gaat fout in mijn denkwijze en ik krijg dit niet op een rijtje. Er zijn veel voorbeelden op internet van nested comments, maar ik krijg deze niet werkend met deze specifieke oplossing van <ol>'s en <li>'s.

Concreet: Hoe krijg ik de plaatsing van <ol class="children"> op de juiste plaats.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zie niets fout aan je denkwijze. Ik denk dat het dus fout gaat in je concrete implementatie. Eerste gok: maak je gebruik van nested mysql queries?

.edit: oh wacht ik snap al wat je bedoelt, moment.
.edit2: nee, er lijkt me nog steeds niet fout. Wat krijg je nu als resultaat dan?
.edit3: nee wacht :+. De fout die je maakt is dat je altijd een <ol> genereert (zolang je een parent hebt iig), en niet alleen als er ook daadwerkelijk comments zijn. Het hele stuk van regel 12 t/m regel 28 hoeft in principe alleen uitgevoerd te worden als $aComments niet leeg is.

[ Voor 65% gewijzigd door .oisyn op 01-11-2013 11:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Volgens mij:

getComments moet in dit geval verantwoordelijk zijn voor het genereren van een <ol> en bijbehorende list items. (al zou ik het eigenlijk renderComments noemen en een apart stuk code voor het daadwerkelijk 'getten' van de comments uit de DB)

op het moment dat je in een list item een nieuwe subthread tegenkomt, genereer je een nieuwe <ol> in die betreffende <li> door getComments opnieuw (recursief) aan te roepen.

Lijkt overigens aardig overeen te komen met je huidige opzet (denk ik).

[ Voor 44% gewijzigd door Laurens-R op 01-11-2013 11:29 ]


  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 14:57
.oisyn schreef op vrijdag 01 november 2013 @ 11:26:
Ik zie niets fout aan je denkwijze. Ik denk dat het dus fout gaat in je concrete implementatie. Eerste gok: maak je gebruik van nested mysql queries?

.edit: oh wacht ik snap al wat je bedoelt, moment.
.edit2: nee, er lijkt me nog steeds niet fout. Wat krijg je nu als resultaat dan?
.edit3: nee wacht :+. De fout die je maakt is dat je altijd een <ol> genereert (zolang je een parent hebt iig), en niet alleen als er ook daadwerkelijk comments zijn. Het hele stuk van regel 12 t/m regel 28 hoeft in principe alleen uitgevoerd te worden als $aComments niet leeg is.
hahaha, lastig toch!

Heb de code nogmaals opgebouwd. Krijg nu netjes de array terug met de comments, maar niet de juiste <ol>
Heb je edit3 doorgevoerd en een if ingebouwd die checked of $aComment inhoud heeft.

Krijg alleen nu de comments op het 'hoofd' niveau. De rest niet. 8)7
Ik wordt hier echt zo geschift van... 7(8)7 }:|

Verleidelijk om de code te posten, maar ik wil het &^$#*&^$&# zelf oplossen... :+

[ Voor 4% gewijzigd door MuddyMagical op 01-11-2013 14:58 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Laat de concrete code van die functie dan eens zien?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 14:57
.oisyn schreef op vrijdag 01 november 2013 @ 14:57:
Laat de concrete code van die functie dan eens zien?
Hmm, ok dan.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function DisplayComments($messageid, $parent = 0) {
        // Get comments from database 
        $aComments = $this->pDatabase->get_array("
            SELECT * 
            FROM users_response
            WHERE news_idnews = ".$messageid."
            AND parent_idusers_response = ".$parent);

        
        if(count($aComments) !== 0) {
            // Check for parent_id and start children ol 
            if($parent !== 0) { 
                $outComments .= '<ol class="children">'; 
            } 

            // Run through the comments
            for ($index = 0; $index < count($aComments); $index++) {
                $outComments .= '
                        <li class="comment">';
                $outComments .= '
                            <div id="comment">
                                <div class="avatar-wrap">
                                    <div class="avatar">
                                            <img src="images/demo/avatar-50x50.png" alt="">
                                    </div>
                                    <a title="Edit comment" href="#" class="comment-edit-link" style="display: none;">Edit</a>
                                </div>
                                <div class="comment-details">
                                        <div class="comment-author"><a href="#">'.$aComments[$index]['users_idusers'].'</a></div>
                                        <div class="comment-meta">February 18, 2012 at 5:30 pm</div>
                                        <div class="comment-content">
                                                <p>'.$aComments[$index]['response'].'</p>
                                                <a onclick="" href="#" class="comment-reply-link">Reply</a>
                                        </div>
                                </div>
                            </div>';

                $this->DisplayComments($messageid, $aComments[$index]['idusers_response']);

                $outComments .= '
                        </li>'; 
            } 

            // Check for parent_id and end children ol 
            if($parent !== 0) { 
                $outComments .= '
                    </ol>'; 
            }
        }
        
        return $outComments;
    }


Een print_r van $aComments op lijn 8 geeft de info, dus het zit echt in de output weergave...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

DisplayComments() returnt een string maar je doet nergens wat met het resultaat op regel 38.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 14:57
.oisyn schreef op vrijdag 01 november 2013 @ 15:06:
DisplayComments() returnt een string maar je doet nergens wat met het resultaat op regel 38.
:X |:( -O-

Is code-blindheid een woord?
Dat was het laatste foutje inderdaad. Ik ga deze gelijk maar even commiten zodat ik het niet nog een keer kan slopen...

Thanks!! :>

[ Voor 27% gewijzigd door MuddyMagical op 01-11-2013 15:08 ]


  • BryanD
  • Registratie: September 2010
  • Laatst online: 09-11 14:56
Ik weet dat de oplossing al gevonden is, maar is onderstaande iets in de regio van wat je zoekt?
Het vergt wel dat je een correcte opbouw van je comments array hebt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function renderComment($comments, $level = 0){
   $html = '<ol'.(($level > 0) ? ' class="child"' : '').'>';

   foreach($comments as $comment){
      $html .= '<li>';
      $html .= '   <a href="#">'.$comment['text'].'</a>';
      if(count($comment['children']) > 0){
          $html .= renderComment($comment['children'], $level + 1);
      }
      $html .= '</li>';
   }
 
   $html .= '</ol>';
   return $html;
} 
?>
Pagina: 1