diff options
Diffstat (limited to 'modules/comment')
-rw-r--r-- | modules/comment/controllers/admin_comments.php | 121 | ||||
-rw-r--r-- | modules/comment/controllers/admin_manage_comments.php | 133 | ||||
-rw-r--r-- | modules/comment/controllers/comments.php | 9 | ||||
-rw-r--r-- | modules/comment/helpers/comment.php | 15 | ||||
-rw-r--r-- | modules/comment/helpers/comment_event.php | 8 | ||||
-rw-r--r-- | modules/comment/helpers/comment_installer.php | 10 | ||||
-rw-r--r-- | modules/comment/helpers/comment_rest.php | 74 | ||||
-rw-r--r-- | modules/comment/helpers/comment_rss.php | 13 | ||||
-rw-r--r-- | modules/comment/helpers/comments_rest.php | 62 | ||||
-rw-r--r-- | modules/comment/helpers/item_comments_rest.php | 50 | ||||
-rw-r--r-- | modules/comment/models/comment.php | 31 | ||||
-rw-r--r-- | modules/comment/module.info | 2 | ||||
-rw-r--r-- | modules/comment/tests/Comment_Event_Test.php | 1 | ||||
-rw-r--r-- | modules/comment/tests/Comment_Model_Test.php | 31 | ||||
-rw-r--r-- | modules/comment/views/admin_comments.html.php | 200 | ||||
-rw-r--r-- | modules/comment/views/admin_manage_comments.html.php | 201 | ||||
-rw-r--r-- | modules/comment/views/comment.mrss.php | 18 | ||||
-rw-r--r-- | modules/comment/views/comments.html.php | 16 |
18 files changed, 672 insertions, 323 deletions
diff --git a/modules/comment/controllers/admin_comments.php b/modules/comment/controllers/admin_comments.php index 68794638..fda3873c 100644 --- a/modules/comment/controllers/admin_comments.php +++ b/modules/comment/controllers/admin_comments.php @@ -18,116 +18,35 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Admin_Comments_Controller extends Admin_Controller { - private static $items_per_page = 20; - public function index() { - // Get rid of old deleted/spam comments once in a while - db::build() - ->delete("comments") - ->where("state", "IN", array("deleted", "spam")) - ->where("updated", "<", "UNIX_TIMESTAMP() - 86400 * 7") - ->execute(); - - // Redirect to the appropriate queue - url::redirect("admin/comments/queue/unpublished"); - } - - public function menu_labels() { - $menu = $this->_menu($this->_counts()); - print json_encode(array((string) $menu->get("unpublished")->label, - (string) $menu->get("published")->label, - (string) $menu->get("spam")->label, - (string) $menu->get("deleted")->label)); - } - - public function queue($state) { - $page = max(Input::instance()->get("page"), 1); - $view = new Admin_View("admin.html"); - $view->page_title = t("Manage comments"); + $view->page_title = t("Comment settings"); $view->content = new View("admin_comments.html"); - $view->content->counts = $this->_counts(); - $view->content->menu = $this->_menu($view->content->counts); - $view->content->state = $state; - $view->content->comments = ORM::factory("comment") - ->order_by("created", "DESC") - ->where("state", "=", $state) - ->limit(self::$items_per_page, ($page - 1) * self::$items_per_page) - ->find_all(); - $view->content->pager = new Pagination(); - $view->content->pager->initialize( - array("query_string" => "page", - "total_items" => $view->content->counts->$state, - "items_per_page" => self::$items_per_page, - "style" => "classic")); - + $view->content->form = $this->_get_admin_form(); print $view; } - private function _menu($counts) { - return Menu::factory("root") - ->append(Menu::factory("link") - ->id("unpublished") - ->label(t2("Awaiting Moderation (%count)", - "Awaiting Moderation (%count)", - $counts->unpublished)) - ->url(url::site("admin/comments/queue/unpublished"))) - ->append(Menu::factory("link") - ->id("published") - ->label(t2("Approved (%count)", - "Approved (%count)", - $counts->published)) - ->url(url::site("admin/comments/queue/published"))) - ->append(Menu::factory("link") - ->id("spam") - ->label(t2("Spam (%count)", - "Spam (%count)", - $counts->spam)) - ->url(url::site("admin/comments/queue/spam"))) - ->append(Menu::factory("link") - ->id("deleted") - ->label(t2("Recently Deleted (%count)", - "Recently Deleted (%count)", - $counts->deleted)) - ->url(url::site("admin/comments/queue/deleted"))); - } - - private function _counts() { - $counts = new stdClass(); - $counts->unpublished = 0; - $counts->published = 0; - $counts->spam = 0; - $counts->deleted = 0; - foreach (db::build() - ->select("state") - ->select(array("c" => 'COUNT("*")')) - ->from("comments") - ->group_by("state") - ->execute() as $row) { - $counts->{$row->state} = $row->c; - } - return $counts; - } - - public function set_state($id, $state) { + public function save() { access::verify_csrf(); - - $comment = ORM::factory("comment", $id); - $orig = clone $comment; - if ($comment->loaded()) { - $comment->state = $state; - $comment->save(); - } + $form = $this->_get_admin_form(); + $form->validate(); + module::set_var("comment", "access_permissions", + $form->comment_settings->access_permissions->value); + message::success(t("Comment settings updated")); + url::redirect("admin/comments"); } - public function delete_all_spam() { - access::verify_csrf(); - - db::build() - ->delete("comments") - ->where("state", "=", "spam") - ->execute(); - url::redirect("admin/comments/queue/spam"); + private function _get_admin_form() { + $form = new Forge("admin/comments/save", "", "post", + array("id" => "g-comments-admin-form")); + $comment_settings = $form->group("comment_settings")->label(t("Permissions")); + $comment_settings->dropdown("access_permissions") + ->label(t("Who can leave comments?")) + ->options(array("everybody" => t("Everybody"), + "registered_users" => t("Only registered users"))) + ->selected(module::get_var("comment", "access_permissions")); + $comment_settings->submit("save")->value(t("Save")); + return $form; } } diff --git a/modules/comment/controllers/admin_manage_comments.php b/modules/comment/controllers/admin_manage_comments.php new file mode 100644 index 00000000..bc1c9e64 --- /dev/null +++ b/modules/comment/controllers/admin_manage_comments.php @@ -0,0 +1,133 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2010 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class Admin_Manage_Comments_Controller extends Admin_Controller { + private static $items_per_page = 20; + + public function index() { + // Get rid of old deleted/spam comments once in a while + db::build() + ->delete("comments") + ->where("state", "IN", array("deleted", "spam")) + ->where("updated", "<", "UNIX_TIMESTAMP() - 86400 * 7") + ->execute(); + + // Redirect to the appropriate queue + url::redirect("admin/manage_comments/queue/unpublished"); + } + + public function menu_labels() { + $menu = $this->_menu($this->_counts()); + print json_encode(array((string) $menu->get("unpublished")->label, + (string) $menu->get("published")->label, + (string) $menu->get("spam")->label, + (string) $menu->get("deleted")->label)); + } + + public function queue($state) { + $page = max(Input::instance()->get("page"), 1); + + $view = new Admin_View("admin.html"); + $view->page_title = t("Manage comments"); + $view->content = new View("admin_manage_comments.html"); + $view->content->counts = $this->_counts(); + $view->content->menu = $this->_menu($view->content->counts); + $view->content->state = $state; + $view->content->comments = ORM::factory("comment") + ->order_by("created", "DESC") + ->where("state", "=", $state) + ->limit(self::$items_per_page, ($page - 1) * self::$items_per_page) + ->find_all(); + $view->content->pager = new Pagination(); + $view->content->pager->initialize( + array("query_string" => "page", + "total_items" => $view->content->counts->$state, + "items_per_page" => self::$items_per_page, + "style" => "classic")); + + print $view; + } + + private function _menu($counts) { + return Menu::factory("root") + ->append(Menu::factory("link") + ->id("unpublished") + ->label(t2("Awaiting Moderation (%count)", + "Awaiting Moderation (%count)", + $counts->unpublished)) + ->url(url::site("admin/manage_comments/queue/unpublished"))) + ->append(Menu::factory("link") + ->id("published") + ->label(t2("Approved (%count)", + "Approved (%count)", + $counts->published)) + ->url(url::site("admin/manage_comments/queue/published"))) + ->append(Menu::factory("link") + ->id("spam") + ->label(t2("Spam (%count)", + "Spam (%count)", + $counts->spam)) + ->url(url::site("admin/manage_comments/queue/spam"))) + ->append(Menu::factory("link") + ->id("deleted") + ->label(t2("Recently Deleted (%count)", + "Recently Deleted (%count)", + $counts->deleted)) + ->url(url::site("admin/manage_comments/queue/deleted"))); + } + + private function _counts() { + $counts = new stdClass(); + $counts->unpublished = 0; + $counts->published = 0; + $counts->spam = 0; + $counts->deleted = 0; + foreach (db::build() + ->select("state") + ->select(array("c" => 'COUNT("*")')) + ->from("comments") + ->group_by("state") + ->execute() as $row) { + $counts->{$row->state} = $row->c; + } + return $counts; + } + + 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(); + } + } + + public function delete_all_spam() { + access::verify_csrf(); + + db::build() + ->delete("comments") + ->where("state", "=", "spam") + ->execute(); + url::redirect("admin/manage_comments/queue/spam"); + } +} + diff --git a/modules/comment/controllers/comments.php b/modules/comment/controllers/comments.php index 9e0f86d2..c42ad24e 100644 --- a/modules/comment/controllers/comments.php +++ b/modules/comment/controllers/comments.php @@ -24,6 +24,9 @@ class Comments_Controller extends Controller { public function create($id) { $item = ORM::factory("item", $id); access::required("view", $item); + if (!comment::can_comment()) { + access::forbidden(); + } $form = comment::get_add_form($item); try { @@ -58,6 +61,7 @@ class Comments_Controller extends Controller { "view" => (string) $view, "form" => (string) comment::get_add_form($item))); } else { + $form = comment::prefill_add_form($form); print json_encode(array("result" => "error", "form" => (string) $form)); } } @@ -68,7 +72,10 @@ class Comments_Controller extends Controller { public function form_add($item_id) { $item = ORM::factory("item", $item_id); access::required("view", $item); + if (!comment::can_comment()) { + access::forbidden(); + } - print comment::get_add_form($item); + print comment::prefill_add_form(comment::get_add_form($item)); } } diff --git a/modules/comment/helpers/comment.php b/modules/comment/helpers/comment.php index e3486e83..92a286c7 100644 --- a/modules/comment/helpers/comment.php +++ b/modules/comment/helpers/comment.php @@ -33,7 +33,9 @@ class comment_Core { ->error_messages("required", t("You must enter a name for yourself")); $group->input("email") ->label(t("Email (hidden)")) - ->id("g-email"); + ->id("g-email") + ->error_messages("required", t("You must enter a valid email address")) + ->error_messages("invalid", t("You must enter a valid email address")); $group->input("url") ->label(t("Website (hidden)")) ->id("g-url"); @@ -45,14 +47,23 @@ class comment_Core { module::event("comment_add_form", $form); $group->submit("")->value(t("Add"))->class("ui-state-default ui-corner-all"); + return $form; + } + + static function prefill_add_form($form) { $active = identity::active_user(); if (!$active->guest) { + $group = $form->add_comment; $group->inputs["name"]->value($active->full_name)->disabled("disabled"); $group->email->value($active->email)->disabled("disabled"); $group->url->value($active->url)->disabled("disabled"); } - return $form; } + + static function can_comment() { + return !identity::active_user()->guest || + module::get_var("comment", "access_permissions") == "everybody"; + } } diff --git a/modules/comment/helpers/comment_event.php b/modules/comment/helpers/comment_event.php index 51e663e6..33d4cd05 100644 --- a/modules/comment/helpers/comment_event.php +++ b/modules/comment/helpers/comment_event.php @@ -51,11 +51,17 @@ class comment_event_Core { } static function admin_menu($menu, $theme) { + $menu->get("settings_menu") + ->append(Menu::factory("link") + ->id("comment") + ->label(t("Comments")) + ->url(url::site("admin/comments"))); + $menu->get("content_menu") ->append(Menu::factory("link") ->id("comments") ->label(t("Comments")) - ->url(url::site("admin/comments"))); + ->url(url::site("admin/manage_comments"))); } static function photo_menu($menu, $theme) { diff --git a/modules/comment/helpers/comment_installer.php b/modules/comment/helpers/comment_installer.php index 9ca47f1a..18d51758 100644 --- a/modules/comment/helpers/comment_installer.php +++ b/modules/comment/helpers/comment_installer.php @@ -47,14 +47,20 @@ class comment_installer { DEFAULT CHARSET=utf8;"); module::set_var("comment", "spam_caught", 0); - module::set_version("comment", 2); + module::set_var("comment", "access_permissions", "everybody"); + module::set_version("comment", 3); } static function upgrade($version) { $db = Database::instance(); if ($version == 1) { $db->query("ALTER TABLE {comments} CHANGE `state` `state` varchar(15) default 'unpublished'"); - module::set_version("comment", 2); + module::set_version("comment", $version = 2); + } + + if ($version == 2) { + module::set_var("comment", "access_permissions", "everybody"); + module::set_version("comment", $version = 3); } } diff --git a/modules/comment/helpers/comment_rest.php b/modules/comment/helpers/comment_rest.php new file mode 100644 index 00000000..bd3011cc --- /dev/null +++ b/modules/comment/helpers/comment_rest.php @@ -0,0 +1,74 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2010 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class comment_rest_Core { + static function get($request) { + $comment = rest::resolve($request->url); + access::required("view", $comment->item()); + + return array( + "url" => $request->url, + "entity" => $comment->as_restful_array(), + "relationships" => rest::relationships("comment", $comment)); + } + + static function put($request) { + // Only admins can edit comments, for now + if (!identity::active_user()->admin) { + access::forbidden(); + } + + $comment = rest::resolve($request->url); + $comment = ORM::factory("comment"); + $comment->text = $request->params->text; + $comment->save(); + } + + static function delete($request) { + if (!identity::active_user()->admin) { + access::forbidden(); + } + + $comment = rest::resolve($request->url); + access::required("edit", $comment->item()); + + $comment->delete(); + } + + static function relationships($resource_type, $resource) { + switch ($resource_type) { + case "item": + return array( + "comments" => array( + "url" => rest::url("item_comments", $resource))); + } + } + + static function resolve($id) { + $comment = ORM::factory("comment", $id); + if (!access::can("view", $comment->item())) { + throw new Kohana_404_Exception(); + } + return $comment; + } + + static function url($comment) { + return url::abs_site("rest/comment/{$comment->id}"); + } +} diff --git a/modules/comment/helpers/comment_rss.php b/modules/comment/helpers/comment_rss.php index eee6f750..26d98d21 100644 --- a/modules/comment/helpers/comment_rss.php +++ b/modules/comment/helpers/comment_rss.php @@ -35,19 +35,22 @@ class comment_rss_Core { $comments = ORM::factory("comment") ->viewable() - ->where("state", "=", "published") - ->order_by("created", "DESC"); + ->where("comments.state", "=", "published") + ->order_by("comments.created", "DESC"); if ($feed_id == "item") { - $comments->where("item_id", "=", $id); + $item = ORM::factory("item", $id); + $comments + ->where("items.left_ptr", ">=", $item->left_ptr) + ->where("items.right_ptr", "<=", $item->right_ptr); } $feed = new stdClass(); $feed->view = "comment.mrss"; - $feed->children = array(); + $feed->comments = array(); foreach ($comments->find_all($limit, $offset) as $comment) { $item = $comment->item(); - $feed->children[] = new ArrayObject( + $feed->comments[] = new ArrayObject( array("pub_date" => date("D, d M Y H:i:s T", $comment->created), "text" => nl2br(html::purify($comment->text)), "thumb_url" => $item->thumb_url(), diff --git a/modules/comment/helpers/comments_rest.php b/modules/comment/helpers/comments_rest.php new file mode 100644 index 00000000..1cedb80b --- /dev/null +++ b/modules/comment/helpers/comments_rest.php @@ -0,0 +1,62 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2010 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class comments_rest_Core { + /** + * Possible request parameters: + * start=# + * start at the Nth comment (zero based) + * + * num=# + * return up to N comments (max 100) + */ + static function get($request) { + $comments = array(); + + $p = $request->params; + $num = isset($p->num) ? min((int)$p->num, 100) : 10; + $start = isset($p->start) ? (int)$p->start : 0; + + foreach (ORM::factory("comment")->viewable()->find_all($num, $start) as $comment) { + $comments[] = rest::url("comment", $comment); + } + return array("url" => rest::url("comments"), + "members" => $comments); + } + + + static function post($request) { + $entity = $request->params->entity; + + $item = rest::resolve($entity->item); + access::required("edit", $item); + + $comment = ORM::factory("comment"); + $comment->author_id = identity::active_user()->id; + $comment->item_id = $item->id; + $comment->text = $entity->text; + $comment->save(); + + return array("url" => rest::url("comment", $comment)); + } + + static function url() { + return url::abs_site("rest/comments"); + } +} diff --git a/modules/comment/helpers/item_comments_rest.php b/modules/comment/helpers/item_comments_rest.php new file mode 100644 index 00000000..1fe5c35f --- /dev/null +++ b/modules/comment/helpers/item_comments_rest.php @@ -0,0 +1,50 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2010 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class item_comments_rest_Core { + static function get($request) { + $item = rest::resolve($request->url); + access::required("view", $item); + + $comments = array(); + foreach (ORM::factory("comment") + ->viewable() + ->where("item_id", "=", $item->id) + ->order_by("created", "DESC") + ->find_all() as $comment) { + $comments[] = rest::url("comment", $comment); + } + + return array( + "url" => $request->url, + "members" => $comments); + } + + static function resolve($id) { + $item = ORM::factory("item", $id); + if (!access::can("view", $item)) { + throw new Kohana_404_Exception(); + } + return $item; + } + + static function url($item) { + return url::abs_site("rest/item_comments/{$item->id}"); + } +} diff --git a/modules/comment/models/comment.php b/modules/comment/models/comment.php index 48084340..772e8b60 100644 --- a/modules/comment/models/comment.php +++ b/modules/comment/models/comment.php @@ -61,7 +61,7 @@ class Comment_Model extends ORM { if (!$array) { $this->rules = array( "guest_name" => array("callbacks" => array(array($this, "valid_author"))), - "guest_email" => array("rules" => array("email")), + "guest_email" => array("callbacks" => array(array($this, "valid_email"))), "guest_url" => array("rules" => array("url")), "item_id" => array("callbacks" => array(array($this, "valid_item"))), "state" => array("rules" => array("Comment_Model::valid_state")), @@ -145,6 +145,19 @@ class Comment_Model extends ORM { } /** + * Make sure that the email address is legal. + */ + public function valid_email(Validation $v, $field) { + if ($this->author_id == identity::guest()->id) { + if (empty($v->guest_email)) { + $v->add_error("guest_email", "required"); + } else if (!valid::email($v->guest_email)) { + $v->add_error("guest_email", "invalid"); + } + } + } + + /** * Make sure we have a valid associated item id. */ public function valid_item(Validation $v, $field) { @@ -162,4 +175,20 @@ class Comment_Model extends ORM { static function valid_state($value) { return in_array($value, array("published", "unpublished", "spam", "deleted")); } + + /** + * Same as ORM::as_array() but convert id fields into their RESTful form. + */ + public function as_restful_array() { + $data = array(); + foreach ($this->as_array() as $key => $value) { + if (strncmp($key, "server_", 7)) { + $data[$key] = $value; + } + } + $data["item"] = rest::url("item", $this->item()); + unset($data["item_id"]); + + return $data; + } } diff --git a/modules/comment/module.info b/modules/comment/module.info index c371cf27..cd34f140 100644 --- a/modules/comment/module.info +++ b/modules/comment/module.info @@ -1,3 +1,3 @@ name = "Comments" description = "Allows users and guests to leave comments on photos and albums." -version = 2 +version = 3 diff --git a/modules/comment/tests/Comment_Event_Test.php b/modules/comment/tests/Comment_Event_Test.php index 62ffec2f..7cae9297 100644 --- a/modules/comment/tests/Comment_Event_Test.php +++ b/modules/comment/tests/Comment_Event_Test.php @@ -25,6 +25,7 @@ class Comment_Event_Test extends Gallery_Unit_Test_Case { $comment->item_id = $album->id; $comment->author_id = identity::guest()->id; $comment->guest_name = "test"; + $comment->guest_email = "test@test.com"; $comment->text = "text"; $comment->save(); diff --git a/modules/comment/tests/Comment_Model_Test.php b/modules/comment/tests/Comment_Model_Test.php index f4e944f0..ee4d3d3c 100644 --- a/modules/comment/tests/Comment_Model_Test.php +++ b/modules/comment/tests/Comment_Model_Test.php @@ -22,6 +22,37 @@ class Comment_Model_Test extends Gallery_Unit_Test_Case { identity::set_active_user(identity::admin_user()); } + public function guest_name_and_email_is_required_test() { + try { + $comment = ORM::factory("comment"); + $comment->item_id = item::root()->id; + $comment->author_id = identity::guest()->id; + $comment->text = "text"; + $comment->save(); + } catch (ORM_Validation_Exception $e) { + $this->assert_equal(array("guest_name" => "required", + "guest_email" => "required"), + $e->validation->errors()); + return; + } + } + + public function guest_email_must_be_well_formed_test() { + try { + $comment = ORM::factory("comment"); + $comment->item_id = item::root()->id; + $comment->author_id = identity::guest()->id; + $comment->guest_name = "guest"; + $comment->guest_email = "bogus"; + $comment->text = "text"; + $comment->save(); + } catch (ORM_Validation_Exception $e) { + $this->assert_equal(array("guest_email" => "invalid"), + $e->validation->errors()); + return; + } + } + public function cant_view_comments_for_unviewable_items_test() { $album = test::random_album(); diff --git a/modules/comment/views/admin_comments.html.php b/modules/comment/views/admin_comments.html.php index f58267bd..dc6985b2 100644 --- a/modules/comment/views/admin_comments.html.php +++ b/modules/comment/views/admin_comments.html.php @@ -1,201 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> -<script type="text/javascript"> - var set_state_url = - <?= html::js_string(url::site("admin/comments/set_state/__ID__/__STATE__?csrf=$csrf")) ?>; - function set_state(state, id) { - $.get(set_state_url.replace("__STATE__", state).replace("__ID__", id), - {}, - function() { - $("#g-comment-" + id).slideUp(); - update_menu(); - }); - } - - var delete_url = - <?= html::js_string(url::site("admin/comments/delete/__ID__?csrf=$csrf")) ?>; - - function del(id) { - $.get(delete_url.replace("__ID__", id), - {}, - function() { - $("#g-comment-" + id).slideUp(); - update_menu(); - }); - } - - function update_menu() { - $.get(<?= html::js_string(url::site("admin/comments/menu_labels")) ?>, {}, - function(data) { - for (var i = 0; i < data.length; i++) { - $("#g-admin-comments-menu li:eq(" + i + ") a").html(data[i]); - } - }, - "json"); - } -</script> - -<div id="g-admin-comments" class="g-block"> - <h1> <?= t("Manage comments") ?> </h1> - +<div class="g-block"> + <h1> <?= t("Comment settings") ?> </h1> <div class="g-block-content"> - <!-- @todo: Highlight active menu option --> - <div id="g-admin-comments-menu" class="ui-helper-clearfix"> - <?= $menu->render() ?> - </div> - - <!-- @todo: Remove after setting active option? --> - <h2> - <? if ($state == "published"): ?> - <?= t("Approved comments") ?> - <? elseif ($state == "unpublished"): ?> - <?= t("Comments awaiting moderation") ?> - <? elseif ($state == "spam"): ?> - <?= t("Spam comments") ?> - <? elseif ($state == "deleted"): ?> - <?= t("Recently deleted comments") ?> - <? endif ?> - </h2> - - <? if ($state == "spam"): ?> - <div> - <? $spam_caught = module::get_var("comment", "spam_caught") ?> - <? if ($spam_caught > 0): ?> - <p> - <?= t2("Gallery has caught %count spam for you since you installed spam filtering.", - "Gallery has caught %count spam for you since you installed spam filtering.", - $spam_caught) ?> - </p> - <? endif ?> - <p> - <? if ($counts->spam): ?> - <?= t2("There is currently one comment in your spam queue. You can delete it with a single click, but there is no undo operation so you may want to check the message first to make sure that it really is spam.", - "There are currently %count comments in your spam queue. You can delete them all with a single click, but there is no undo operation so you may want to check the messages first to make sure that they really are spam. All spam messages will be deleted after 7 days automatically.", - $counts->spam) ?> - </p> - <p> - <a href="<?= url::site("admin/comments/delete_all_spam?csrf=$csrf") ?>"> - <?= t("Delete all spam") ?> - </a> - <? else: ?> - <?= t("Your spam queue is empty!") ?> - <? endif ?> - </p> - </div> - <? endif ?> - - <? if ($state == "deleted"): ?> - <div> - <p> - <?= t("These are messages that have been recently deleted. They will be permanently erased automatically after 7 days.") ?> - </p> - </div> - <? endif ?> - - <table id="g-admin-comments-list"> - <tr> - <th> - <?= t("Author") ?> - </th> - <th> - <?= t("Comment") ?> - </th> - <th> - <?= t("Actions") ?> - </th> - </tr> - <? foreach ($comments as $comment): ?> - <tr id="g-comment-<?= $comment->id ?>" class="<?= text::alternate("g-odd", "g-even") ?>"> - <td> - <a href="#"> - <img src="<?= $comment->author()->avatar_url(40, $theme->url("images/avatar.jpg", true)) ?>" - class="g-avatar" - alt="<?= html::clean_attribute($comment->author_name()) ?>" - width="40" - height="40" /> - </a> - <p><a href="mailto:<?= html::clean_attribute($comment->author_email()) ?>" - title="<?= html::clean_attribute($comment->author_email()) ?>"> <?= html::clean($comment->author_name()) ?> </a></p> - </td> - <td> - <div class="g-right"> - <? $item = $comment->item() ?> - <div class="g-item g-photo"> - <a href="<?= $item->url() ?>"> - <? if ($item->has_thumb()): ?> - <img src="<?= $item->thumb_url() ?>" - alt="<?= html::purify($item->title)->for_html_attr() ?>" - <?= photo::img_dimensions($item->thumb_width, $item->thumb_height, 75) ?> - /> - <? else: ?> - <?= t("No thumbnail") ?> - <? endif ?> - </a> - </div> - </div> - <p><?= gallery::date($comment->created) ?></p> - <?= nl2br(html::purify($comment->text)) ?> - </td> - <td> - <ul class="g-buttonset-vertical"> - <? if ($comment->state != "unpublished"): ?> - <li> - <a href="javascript:set_state('unpublished',<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-check"></span> - <?= t("Unapprove") ?> - </a> - </li> - <? endif ?> - <? if ($comment->state != "published"): ?> - <li> - <a href="javascript:set_state('published',<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-check"></span> - <?= t("Approve") ?> - </a> - </li> - <? endif ?> - <? if ($comment->state != "spam"): ?> - <li> - <a href="javascript:set_state('spam',<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-cancel"></span> - <?= t("Spam") ?> - </a> - </li> - <? endif ?> - <!-- - <li> - <a href="javascript:reply(<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-arrowreturnthick-1-w"></span> - <?= t("Reply") ?> - </a> - </li> - <li> - <a href="javascript:Edit(<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-pencil"></span> - <?= t("Edit") ?> - </a> - </li> - --> - <li> - <a href="javascript:set_state('deleted',<?=$comment->id?>)" - class="g-button ui-state-default ui-icon-left"> - <span class="ui-icon ui-icon-trash"></span> - <?= t("Delete") ?> - </a> - </li> - </ul> - </td> - </tr> - <? endforeach ?> - </table> - - <div class="g-paginator"> - <?= $pager ?> - </div> - + <?= $form ?> </div> </div> diff --git a/modules/comment/views/admin_manage_comments.html.php b/modules/comment/views/admin_manage_comments.html.php new file mode 100644 index 00000000..34a28986 --- /dev/null +++ b/modules/comment/views/admin_manage_comments.html.php @@ -0,0 +1,201 @@ +<?php defined("SYSPATH") or die("No direct script access.") ?> +<script type="text/javascript"> + var set_state_url = + <?= html::js_string(url::site("admin/manage_comments/set_state/__ID__/__STATE__?csrf=$csrf")) ?>; + function set_state(state, id) { + $.get(set_state_url.replace("__STATE__", state).replace("__ID__", id), + {}, + function() { + $("#g-comment-" + id).slideUp(); + update_menu(); + }); + } + + var delete_url = + <?= html::js_string(url::site("admin/manage_comments/delete/__ID__?csrf=$csrf")) ?>; + + function del(id) { + $.get(delete_url.replace("__ID__", id), + {}, + function() { + $("#g-comment-" + id).slideUp(); + update_menu(); + }); + } + + function update_menu() { + $.get(<?= html::js_string(url::site("admin/manage_comments/menu_labels")) ?>, {}, + function(data) { + for (var i = 0; i < data.length; i++) { + $("#g-admin-comments-menu li:eq(" + i + ") a").html(data[i]); + } + }, + "json"); + } +</script> + +<div id="g-admin-comments" class="g-block"> + <h1> <?= t("Manage comments") ?> </h1> + + <div class="g-block-content"> + <!-- @todo: Highlight active menu option --> + <div id="g-admin-comments-menu" class="ui-helper-clearfix"> + <?= $menu->render() ?> + </div> + + <!-- @todo: Remove after setting active option? --> + <h2> + <? if ($state == "published"): ?> + <?= t("Approved comments") ?> + <? elseif ($state == "unpublished"): ?> + <?= t("Comments awaiting moderation") ?> + <? elseif ($state == "spam"): ?> + <?= t("Spam comments") ?> + <? elseif ($state == "deleted"): ?> + <?= t("Recently deleted comments") ?> + <? endif ?> + </h2> + + <? if ($state == "spam"): ?> + <div> + <? $spam_caught = module::get_var("comment", "spam_caught") ?> + <? if ($spam_caught > 0): ?> + <p> + <?= t2("Gallery has caught %count spam for you since you installed spam filtering.", + "Gallery has caught %count spam for you since you installed spam filtering.", + $spam_caught) ?> + </p> + <? endif ?> + <p> + <? if ($counts->spam): ?> + <?= t2("There is currently one comment in your spam queue. You can delete it with a single click, but there is no undo operation so you may want to check the message first to make sure that it really is spam.", + "There are currently %count comments in your spam queue. You can delete them all with a single click, but there is no undo operation so you may want to check the messages first to make sure that they really are spam. All spam messages will be deleted after 7 days automatically.", + $counts->spam) ?> + </p> + <p> + <a href="<?= url::site("admin/manage_comments/delete_all_spam?csrf=$csrf") ?>"> + <?= t("Delete all spam") ?> + </a> + <? else: ?> + <?= t("Your spam queue is empty!") ?> + <? endif ?> + </p> + </div> + <? endif ?> + + <? if ($state == "deleted"): ?> + <div> + <p> + <?= t("These are messages that have been recently deleted. They will be permanently erased automatically after 7 days.") ?> + </p> + </div> + <? endif ?> + + <table id="g-admin-comments-list"> + <tr> + <th> + <?= t("Author") ?> + </th> + <th> + <?= t("Comment") ?> + </th> + <th> + <?= t("Actions") ?> + </th> + </tr> + <? foreach ($comments as $comment): ?> + <tr id="g-comment-<?= $comment->id ?>" class="<?= text::alternate("g-odd", "g-even") ?>"> + <td> + <a href="#"> + <img src="<?= $comment->author()->avatar_url(40, $theme->url("images/avatar.jpg", true)) ?>" + class="g-avatar" + alt="<?= html::clean_attribute($comment->author_name()) ?>" + width="40" + height="40" /> + </a> + <p><a href="mailto:<?= html::clean_attribute($comment->author_email()) ?>" + title="<?= html::clean_attribute($comment->author_email()) ?>"> <?= html::clean($comment->author_name()) ?> </a></p> + </td> + <td> + <div class="g-right"> + <? $item = $comment->item() ?> + <div class="g-item g-photo"> + <a href="<?= $item->url() ?>"> + <? if ($item->has_thumb()): ?> + <img src="<?= $item->thumb_url() ?>" + alt="<?= html::purify($item->title)->for_html_attr() ?>" + <?= photo::img_dimensions($item->thumb_width, $item->thumb_height, 75) ?> + /> + <? else: ?> + <?= t("No thumbnail") ?> + <? endif ?> + </a> + </div> + </div> + <p><?= gallery::date($comment->created) ?></p> + <?= nl2br(html::purify($comment->text)) ?> + </td> + <td> + <ul class="g-buttonset-vertical"> + <? if ($comment->state != "unpublished"): ?> + <li> + <a href="javascript:set_state('unpublished',<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-check"></span> + <?= t("Unapprove") ?> + </a> + </li> + <? endif ?> + <? if ($comment->state != "published"): ?> + <li> + <a href="javascript:set_state('published',<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-check"></span> + <?= t("Approve") ?> + </a> + </li> + <? endif ?> + <? if ($comment->state != "spam"): ?> + <li> + <a href="javascript:set_state('spam',<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-cancel"></span> + <?= t("Spam") ?> + </a> + </li> + <? endif ?> + <!-- + <li> + <a href="javascript:reply(<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-arrowreturnthick-1-w"></span> + <?= t("Reply") ?> + </a> + </li> + <li> + <a href="javascript:Edit(<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-pencil"></span> + <?= t("Edit") ?> + </a> + </li> + --> + <li> + <a href="javascript:set_state('deleted',<?=$comment->id?>)" + class="g-button ui-state-default ui-icon-left"> + <span class="ui-icon ui-icon-trash"></span> + <?= t("Delete") ?> + </a> + </li> + </ul> + </td> + </tr> + <? endforeach ?> + </table> + + <div class="g-paginator"> + <?= $pager ?> + </div> + + </div> +</div> diff --git a/modules/comment/views/comment.mrss.php b/modules/comment/views/comment.mrss.php index c2a4b538..809e7890 100644 --- a/modules/comment/views/comment.mrss.php +++ b/modules/comment/views/comment.mrss.php @@ -20,19 +20,19 @@ <? endif ?> <pubDate><?= $pub_date ?></pubDate> <lastBuildDate><?= $pub_date ?></lastBuildDate> - <? foreach ($feed->children as $child): ?> + <? foreach ($feed->comments as $comment): ?> <item> - <title><?= html::purify($child->title) ?></title> - <link><?= html::clean($child->item_uri) ?></link> - <author><?= html::clean($child->author) ?></author> - <guid isPermaLink="true"><?= $child->item_uri ?></guid> - <pubDate><?= $child->pub_date ?></pubDate> + <title><?= html::purify($comment->title) ?></title> + <link><?= html::clean($comment->item_uri) ?></link> + <author><?= html::clean($comment->author) ?></author> + <guid isPermaLink="true"><?= $comment->item_uri ?></guid> + <pubDate><?= $comment->pub_date ?></pubDate> <content:encoded> <![CDATA[ - <p><?= nl2br(html::purify($child->text)) ?></p> + <p><?= nl2br(html::purify($comment->text)) ?></p> <p> - <img alt="" src="<?= $child->thumb_url ?>" - height="<?= $child->thumb_height ?>" width="<?= $child->thumb_width ?>" /> + <img alt="" src="<?= $comment->thumb_url ?>" + height="<?= $comment->thumb_height ?>" width="<?= $comment->thumb_width ?>" /> <br /> </p> ]]> diff --git a/modules/comment/views/comments.html.php b/modules/comment/views/comments.html.php index e4322e08..da45f57b 100644 --- a/modules/comment/views/comments.html.php +++ b/modules/comment/views/comments.html.php @@ -1,17 +1,27 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> - <a href="<?= url::site("form/add/comments/{$item->id}") ?>#comment-form" id="g-add-comment" +<? if (comment::can_comment()): ?> +<a href="<?= url::site("form/add/comments/{$item->id}") ?>#comment-form" id="g-add-comment" class="g-button ui-corner-all ui-icon-left ui-state-default"> <span class="ui-icon ui-icon-comment"></span> <?= t("Add a comment") ?> </a> +<? endif ?> + <div id="g-comment-detail"> <? if (!$comments->count()): ?> <p class="g-no-comments"> + <? if (comment::can_comment()): ?> <?= t("No comments yet. Be the first to <a %attrs>comment</a>!", array("attrs" => html::mark_clean("href=\"" . url::site("form/add/comments/{$item->id}") . "\" class=\"showCommentForm\""))) ?> - </p> - <ul><li class="g-no-comments"> </li></ul> + <? else: ?> + <?= t("No comments yet.") ?> + <? endif ?> + </p> + <ul> + <li class="g-no-comments"> </li> + </ul> <? endif ?> + <? if ($comments->count()): ?> <ul> <? foreach ($comments as $comment): ?> |