From 8bf388a6f671faba94f46ad9e982139c211378ee Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Thu, 8 Jan 2009 02:50:23 +0000 Subject: Incremental improvement in comment moderation: 1) Akismet now detects when we change a comment's published state and submits info back to akismet.com as appropriate 2) We now show 4 different queues (all / approved / unapproved / spam) and let you move messages between the queues 3) We track and display "spam caught" stats. 4) You can delete comments entirely. --- modules/akismet/helpers/akismet.php | 2 +- modules/akismet/helpers/akismet_event.php | 17 ++++ modules/akismet/views/admin_akismet_stats.html.php | 15 ++- modules/comment/controllers/admin_comments.php | 107 ++++++++++++++++----- modules/comment/helpers/comment_installer.php | 1 + modules/comment/views/admin_comments.html.php | 74 +++++++++++--- 6 files changed, 176 insertions(+), 40 deletions(-) (limited to 'modules') diff --git a/modules/akismet/helpers/akismet.php b/modules/akismet/helpers/akismet.php index 132b9206..b34ed1ac 100644 --- a/modules/akismet/helpers/akismet.php +++ b/modules/akismet/helpers/akismet.php @@ -104,7 +104,7 @@ class akismet_Core { $comment_data["permalink"] = url::site("comments/{$comment->id}"); $comment_data["blog"] = url::base(false, "http"); $comment_data["user_agent"] = $comment->user_agent; - $comment_data["referrer"] = $_SERVER["HTTP_REFERER"]; + $comment_data["referrer"] = !empty($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : ""; $comment_data["comment_type"] = "comment"; $comment_data["comment_author"] = $comment->author; $comment_data["comment_author_email"] = $comment->email; diff --git a/modules/akismet/helpers/akismet_event.php b/modules/akismet/helpers/akismet_event.php index 8f530faa..2a42acb3 100644 --- a/modules/akismet/helpers/akismet_event.php +++ b/modules/akismet/helpers/akismet_event.php @@ -19,9 +19,14 @@ */ class akismet_event_Core { public static function comment_created($comment) { + if (TEST_MODE) { + return; + } + switch(akismet::check_comment($comment)) { case "spam": $comment->state = "spam"; + module::incr_var("comment", "spam_caught"); break; case "ham": @@ -34,4 +39,16 @@ class akismet_event_Core { } $comment->save(); } + + public static function comment_changed($old, $new) { + if (TEST_MODE) { + return; + } + + if ($old->state != "spam" && $new->state == "spam") { + akismet::submit_spam($new); + } else if ($old->state == "spam" && $new->state != "spam") { + akismet::submit_ham($new); + } + } } diff --git a/modules/akismet/views/admin_akismet_stats.html.php b/modules/akismet/views/admin_akismet_stats.html.php index a7431a18..d82704cd 100644 --- a/modules/akismet/views/admin_akismet_stats.html.php +++ b/modules/akismet/views/admin_akismet_stats.html.php @@ -1,6 +1,11 @@ - + +
+ +
diff --git a/modules/comment/controllers/admin_comments.php b/modules/comment/controllers/admin_comments.php index f518238f..7c88c1d9 100644 --- a/modules/comment/controllers/admin_comments.php +++ b/modules/comment/controllers/admin_comments.php @@ -19,44 +19,107 @@ */ class Admin_Comments_Controller extends Admin_Controller { - private function _get_base_view($state) { + public function index() { + $this->queue("all"); + } + + public function queue($state) { $view = new Admin_View("admin.html"); $view->content = new View("admin_comments.html"); + $view->content->all = $this->_query(array("published", "unpublished")); + $view->content->published = $this->_query(array("published")); + $view->content->unpublished = $this->_query(array("unpublished")); + $view->content->spam = $this->_query(array("spam")); $view->content->menu = Menu::factory("root") ->append(Menu::factory("link") - ->id("published") - ->label(_("Published")) - ->url(url::site("admin/comments/published"))) + ->id("all") + ->label(sprintf(_("All Comments (%d)"), + $view->content->all->count())) + ->url(url::site("admin/comments/queue/all"))) ->append(Menu::factory("link") ->id("unpublished") - ->label(_("Unpublished")) - ->url(url::site("admin/comments/unpublished"))) + ->label(sprintf(_("Awaiting Moderation (%d)"), + $view->content->unpublished->count())) + ->url(url::site("admin/comments/queue/unpublished"))) + ->append(Menu::factory("link") + ->id("published") + ->label(sprintf(_("Approved (%d)"), + $view->content->published->count())) + ->url(url::site("admin/comments/queue/published"))) ->append(Menu::factory("link") ->id("spam") - ->label(_("Spam")) - ->url(url::site("admin/comments/spam"))); - $view->content->comments = ORM::factory("comment") - ->where("state", $state) - ->orderby("created", "DESC") - ->find_all(); - - return $view; + ->label(sprintf(_("Spam (%d)"), $view->content->spam->count())) + ->url(url::site("admin/comments/queue/spam"))); + + switch ($state) { + case "all": + $view->content->comments = $view->content->all; + $view->content->title = _("All Comments"); + break; + + case "published": + $view->content->comments = $view->content->published; + $view->content->title = _("Approved Comments"); + break; + + case "unpublished": + $view->content->comments = $view->content->unpublished; + $view->content->title = _("Comments Awaiting Moderation"); + break; + + case "spam": + $view->content->title = _("Spam Comments"); + $view->content->comments = $view->content->spam; + $view->content->spam_caught = module::get_var("comment", "spam_caught"); + break; + } + + $view->content->queue = $state; + $view->content->pager = new Pagination(); + $view->content->pager->initialize( + array('query_string' => 'page', + 'total_items' => $view->content->comments->count(), + 'items_per_page' => 20, + 'style' => 'classic')); + + print $view; } - public function index() { - return $this->published(); + private function _query($states) { + $query = ORM::factory("comment") + ->orderby("created", "DESC"); + if ($states) { + $query->in("state", $states); + } + return $query->find_all(); } - public function published() { - print $this->_get_base_view("published"); + public function set_state($id, $state) { + access::verify_csrf(); + $comment = ORM::factory("comment", $id); + $orig = clone $comment; + if ($comment->loaded) { + $comment->state = $state; + $comment->save(); + module::event("comment_changed", $orig, $comment); + } } - public function unpublished() { - print $this->_get_base_view("unpublished"); + public function delete($id) { + access::verify_csrf(); + $comment = ORM::factory("comment", $id); + if ($comment->loaded) { + module::event("comment_before_delete", $comment); + $comment->delete(); + } } - public function spam() { - print $this->_get_base_view("spam"); + public function delete_all_spam() { + access::verify_csrf(); + ORM::factory("comment") + ->where("state", "spam") + ->delete_all(); + url::redirect("admin/comments/queue/spam"); } } diff --git a/modules/comment/helpers/comment_installer.php b/modules/comment/helpers/comment_installer.php index dbbb511f..08be8c29 100644 --- a/modules/comment/helpers/comment_installer.php +++ b/modules/comment/helpers/comment_installer.php @@ -39,6 +39,7 @@ class comment_installer { PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + module::set_var("comment", "spam_caught", 0); module::set_version("comment", 1); } } diff --git a/modules/comment/views/admin_comments.html.php b/modules/comment/views/admin_comments.html.php index b8527a46..022b9fee 100644 --- a/modules/comment/views/admin_comments.html.php +++ b/modules/comment/views/admin_comments.html.php @@ -1,18 +1,66 @@ + +
-

+

+ +
+ +

+ +

+ + + +
+

+ +

+

+ count()): ?> + count()) ?> +

+

+ + + + + + +

+
+ + +
+ +
+
- - + @@ -47,7 +99,7 @@ -- cgit v1.2.3
+ @@ -20,23 +68,27 @@
+ "/> author ?>
-
- url ?> | email ?> -
+
    +
  • url ?>
  • +
  • email ?>
  • +
text ?>
item(); ?> + <?= $item->title ?>thumb_width, $item->thumb_height, 75) ?> /> + %s"), $item->url(), $item->title) ?>