Revision [2626]

This is an old revision of PagedComments made by DarTar on 2004-11-29 13:49:26.

 

Paged Comments

Last edited by DarTar:
Code for paged comments - let me know if you want to test it on this server
Mon, 29 Nov 2004 13:49 UTC [diff]


Screenshot:
http://wikka.jsnx.com/images/pagedcomments.jpg

When the number of comments at the bottom of a page is too large (there is virtually no limit to their number), the comments block becomes user-unfriendly:

I've written a pager for comments to address this issue. The pager allows to switch between a "paged" and a "showall" view. The default number of comments per page is set by the $d variable.
In the future, this value might be selected in the user settings.

Here's the code.

1. Create function LoadCommentPage() in wikka.php

        function LoadCommentPage($tag, $start, $limit) {
            return $this->LoadAll("SELECT * FROM ".$this->config["table_prefix"]."comments WHERE page_tag = '".mysql_real_escape_string($tag)."' ORDER BY time LIMIT ".$start.",".$limit);
        }


2. Modify the comments block in handlers/page/show.php

        if ($this->GetConfigValue("hide_comments") != 1)
        {
            // set default number of comments per page
            $d = "10";

            // set default visualization to "paged"
            $showall = ($_REQUEST["showall"])? $_REQUEST["showall"] : "0";

            // get total number of comments for current page
            $n = count($this->LoadComments($this->tag));
           
            // calculate starting item of last page
            $lastcomments = ceil($n/$d)*$d;
            $start = ($n > $d)? ($lastcomments-$d) : "0";

            // set starting item and limit
            $s = (isset($_REQUEST["s"]))? $_REQUEST["s"] : $start;
            $l = (isset($_REQUEST["l"]))? $_REQUEST["l"] : $d;         
            // set no limits for showall visualization
            if ($showall == 1) {
                $s = "0";
                $l = "999";
            }

            // Build pager links:

            // show "previous" link if needed
            if($s > 0) {
                $prev = " <a href=\"" .$this->Href("","","l=".$l."&s=".($s-$l))."#comments\">&laquo;</a>  ";
            }

            // show "next" link if needed
            if($n > ($s + $l)) {
                $next = " <a href=\"".$this->Href("","","l=".$l."&s=".($s+$l))."#comments\">&raquo;</a> ";
            }

            // create switcher link
            switch($showall) {
                case "0":
                $switcher = ($n > $l)? " [<a href=\"".$this->Href("","","showall=1")."#comments\">Show all</a>] " : "";
                break;

                case "1":
                $switcher = ($n > $d)? " [<a href=\"".$this->Href("","","showall=0")."#comments\">Show paged</a>] " : "";
            }

            // create pager links
            $pager = ($prev || $next)? $prev.($s+1)."-".($s+$l).$next : "";        

            // load comments for this page with limits
            $comments = $this->LoadCommentPage($this->tag, $s, $l);

            // store comments display in session
            $tag = $this->GetPageTag();
            if (!isset($_SESSION["show_comments"][$tag]))
                $_SESSION["show_comments"][$tag] = ($this->UserWantsComments() ? "1" : "0");
            if (isset($_REQUEST["show_comments"])){
                switch($_REQUEST["show_comments"])
                {
                case "0":
                    $_SESSION["show_comments"][$tag] = 0;
                    break;
                case "1":
                    $_SESSION["show_comments"][$tag] = 1;
                    break;
                }
            }
            // display comments!
            if ($_SESSION["show_comments"][$tag])
            {
                // display comments header
                ?>
                <div class="commentsheader">
                <span id="comments">&nbsp;</span>Comments <?php echo "(".$n.") ".$pager.$switcher; ?>[<a href="<?php echo $this->href("", "", "show_comments=0") ?>">Hide comments/form</a>]
                </div>
                <?php
                // display comments themselves
                if ($comments)
                {
                    $current_user = $this->GetUserName();
                    foreach ($comments as $comment)
                    {
                        print("<div class=\"comment\">\n");
                        print("<span id=\"comment_".$comment["id"]."\"></span>".$comment["comment"]."\n");
                        print("\t<div class=\"commentinfo\">\n-- ".$this->Format($comment["user"])." (".$comment["time"].")\n");
                        $current_user = $this->GetUserName();
                            if ($this->UserIsOwner() || $current_user == $comment["user"] || ($this->config['anony_delete_own_comments'] && $current_user == $comment["user"]) )
                        {
                        ?>
                        <?php echo $this->FormOpen("delcomment"); ?>
                           <input type="hidden" name="comment_id" value="<?php echo $comment["id"] ?>" />
                           <input type="submit" value="Delete Comment" accesskey="d" />
                        <?php echo $this->FormClose(); ?>
                        <?php
                        }
                        print("\n\t</div>\n");
                        print("</div>\n");
                    }
                    // Show bottom pager link
                    if ($showall == 0 && $n > $l) {
                        print "<div class=\"commentsheader\">".$pager.$switcher."</div>\n";
                    }
                }
                // display comment form
                print("<div class=\"commentform\">\n");
                if ($this->HasAccess("comment"))
                {?>
                        <?php echo $this->FormOpen("addcomment"); ?>
                    <label for="commentbox">Add a comment to this page:<br />
                    <textarea id="commentbox" name="body" rows="6" cols="78"></textarea><br />
                    <input type="submit" value="Add Comment" accesskey="s" />
                        </label>
                    <?php echo $this->FormClose(); ?>
                <?php
                }
                print("</div>\n");
            }
            else
            {
            ?>
                <div class="commentsheader">
                <?php
                switch ($n)
                {
                case 0:
                    print("<p>There are no comments on this page. ");
                    $showcomments_text = "Add comment";
                    break;
                case 1:
                    print("<p>There is one comment on this page. ");
                    $showcomments_text = "Display comment";
                    break;
                default:
                    print("<p>There are ".$n." comments on this page. ");
                    $showcomments_text = "Display comments";
                }
                ?>
                [<a href="<?php echo $this->href("", "", "show_comments=1#comments")."\">$showcomments_text"; ?></a>]</p>
                </div>
                <?php
            }
        }


3. Update actions/recentlycommented.php

Replace the two occurrences of

"show_comments=1"


with

"show_comments=1&showall=1"



CategoryDevelopment
There are 6 comments on this page. [Show comments]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki