phpmysqlthreaded-comments

PHP Threaded comments pagination


I'm using the threaded comment from http://www.jongales.com/blog/2009/01/27/php-class-for-threaded-comments/ and I have no idea how to implement a pagination system. If anybody could point me in a direction or something because I search for a solution but didn't find anything...

public $parents  = array();
public $children = array();

function __construct($comments)
{
    foreach ($comments as $comment)
    {
        if ($comment['parent_id'] === NULL)
        {
            $this->parents[$comment['id']][] = $comment;
        }
        else
        {
            $this->children[$comment['parent_id']][] = $comment;
        }
    }
}

private function format_comment($comment, $depth)
{
     If($depth == 0){
        ?>
        <br /><?php echo $comment['name']; ?><br /><?php echo $comment['datetime']; ?><br /><?php echo $comment['text']; ?></div>
        <a href="javascript:toggleDiv('<?php echo $comment['id']; ?>');">Raspunde</a>
        <div id="<?php echo $comment['id']; ?>" style="display: none;">
        The content in this div will hide and show (toggle) when the toggle is pressed. 
        </div>
        <?php
     }

     If($depth > 0){
        ?>
        <div style="margin-left: 20px;">
        <br /><?php echo $comment['name']; ?><br /><?php echo $comment['datetime']; ?><br /><?php echo $comment['text']; ?></div>
        </div>
        <?php
     }   


}

private function print_parent($comment, $depth = 0)
{
    foreach ($comment as $c)
    {
        $this->format_comment($c, $depth);

        if (isset($this->children[$c['id']]))
        {
            $this->print_parent($this->children[$c['id']], $depth + 1);
        }
    }
}

public function print_comments()
{
    foreach ($this->parents as $c)
    {
        $this->print_parent($c);
    }
}}

$username = "Netra";
$SQL = "SELECT * FROM profile_comments WHERE name = '$username' ORDER BY datetime DESC";
$result = mysql_query($SQL) or die(mysql_error());

while($row = mysql_fetch_assoc($result)) {
    $id = $row['id'];
    $parent_id = $row['parent_id'];
    $name = $row['name'];
    $text = $row['text'];
    $datetime = $row['datetime'];

    $comments[] = array(
        'id' => $id,
        'parent_id' => $parent_id,
        'name' => $name,
        'text' => $text,
        'datetime' => $datetime
    );
}

    $threaded_comments = new Threaded_comments($comments);

    $threaded_comments->print_comments();

Solution

  • Pagination simply will change two things in your queries. It will set the LIMIT and OFFSET different based on the current page. There are a few parts involved, mainly knowing the offset. This is easy, it is always the (PAGE_NUMBER * NUMBER_PER_PAGE) - NUMBER_PER_PAGE. You then dynamically change your sql based on the current page!

    It looks something like this:

    <?php 
    
    class Pagination{
    
        public $total_results;
        public $total_pages;
        public $per_page;
        public $offset;
        public $page;
    
        public function __construct($per_page=20, $total_results=0, $page=1){
            $this->per_page = $per_page;
            $this->total_results = $total_results;
            $this->page = $page;
            $this->set_total_pages();
            $this->set_offset();
            $this->prepare_displays();
        }
    
        public function set_total_pages(){
            $this->total_pages = ceil($this->total_results / $this->per_page);
        }
    
        public function set_offset(){
            $this->offset = ($this->page * $this->per_page) - $this->per_page;
        }
    
        public function has_next_page(){
            if($this->page < $this->total_pages){
                return true;
            }else{
                return false;
            }
        }
    
        public function has_previous_page(){
            if($this->total_pages > 1 && $this->page > 1){
                return true;
            }else{
                return false;
            }
        }
    
    
        public function check_page_exists(){
            return (($this->total_pages > 0) && ($this->page > $this->total_pages)) || $this->page < 1 ? false : true;
        }
    
    
    }
    
    
    
    
    ?>