Wiki source for PagedComments


Show raw source

===== Paged Comments =====
>>Working for 1.1.6.0 to 1.1.6.4 (latest)
Slight changes in the code in the vicinity of this modification, nothing serious.>>{{lastedit show="3"}}

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:
~-the page can take too long to load (especially for users with 56k dial-up connections)
~- navigation between comments becomes difficult.

I've written a configurable **comments pager** 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 a **$limit_comments** session parameter, that can be changed in UserSettings.
Paged comments come in two "flavours".

----
==Screenshots:==

**Flavour A) - previous/next links**
http://wikka.jsnx.com/images/pagedcomments.jpg

**Flavour B) - pagelist**
http://wikka.jsnx.com/images/pagedcomments2.jpg

----

Here's the code.

==1. Create function ##""LoadCommentPage()""## in ##wikka.php##==

%%(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##==

%%(php)
if ($this->GetConfigValue("hide_comments") != 1)
{
// set default number of comments per page
$d = ($_SESSION["limit_comments"])? $_SESSION["limit_comments"] : "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:

/*
// FLAVOUR A) - next/previous links

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

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

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

*/


// FLAVOUR B) - pagelist

if ($showall == 0 && $n > $l) {
$i = 0;
while ($i < $n) {
if ($i == $s) {
$pager .= ($i+1)."-".($i+$l)." | \n";
} else {
$pager .= "<a href=\"".$this->Href("","","l=".$l."&s=".($i))."#comments\">".($i+1)."-".($i + $l)."</a> | \n";
}
$i = $i + $l;
}
}


// create switcher link
switch($showall) {

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

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


// 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"> </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"%%


== 4. Update ##actions/usersettings.php##==

These modifications allow users to store their preferred //number of comments per page// in a session parameter.
Modify the two following code blocks:

==A)==
**original**
%%(php)
$this->SetUser($this->LoadUser($user["name"]));

// forward
$this->SetMessage("User settings stored!");
$this->Redirect($this->href());
%%

**modified**
%%(php)
$this->SetUser($this->LoadUser($user["name"]));
$_SESSION["limit_comments"] = ($_REQUEST["limit_comments"])? $_REQUEST["limit_comments"] : "10";

// forward
$this->SetMessage("User settings stored!");
$this->Redirect($this->href());
%%

==B)==

**original**
%%(php)
<tr>
<td align="right">Page revisions list limit:</td>
<td><input name="revisioncount" value="<?php echo htmlspecialchars($user["revisioncount"]) ?>" size="40" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Update Settings" /> <input type="button" value="Logout" onClick="document.location='<?php echo $this->href("", "", "action=logout"); ?>'" /></td>
</tr>
%%

**modified**
%%(php)
<tr>
<td align="right">Page revisions list limit:</td>
<td><input name="revisioncount" value="<?php echo htmlspecialchars($user["revisioncount"]) ?>" size="40" /></td>
</tr>
<tr>
<td align="right">Comments per page:</td>
<?php
$limit_comments = ($_SESSION["limit_comments"])? $_SESSION["limit_comments"] : "10";
?>
<td><input name="limit_comments" value="<?php echo $limit_comments ?>" size="40" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Update Settings" /> <input type="button" value="Logout" onClick="document.location='<?php echo $this->href("", "", "action=logout"); ?>'" /></td>
</tr>
%%

----
CategoryDevelopmentHandlers
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki