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.
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
Flavour B) - pagelist
Here's the code.
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 =
($_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
}
}
Replace the two occurrences of
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
$this->SetUser($this->LoadUser($user["name"]));
// forward
$this->SetMessage("User settings stored!");
$this->Redirect($this->href());
modified
$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
<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
<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