diff options
Diffstat (limited to 'modules/comment')
-rw-r--r-- | modules/comment/controllers/admin_manage_comments.php | 39 | ||||
-rw-r--r-- | modules/comment/helpers/comment_installer.php | 19 | ||||
-rw-r--r-- | modules/comment/models/comment.php | 4 | ||||
-rw-r--r-- | modules/comment/module.info | 6 | ||||
-rw-r--r-- | modules/comment/views/admin_manage_comments.html.php | 211 | ||||
-rw-r--r-- | modules/comment/views/admin_manage_comments_queue.html.php | 157 |
6 files changed, 232 insertions, 204 deletions
diff --git a/modules/comment/controllers/admin_manage_comments.php b/modules/comment/controllers/admin_manage_comments.php index 9bd1d7f6..72684e70 100644 --- a/modules/comment/controllers/admin_manage_comments.php +++ b/modules/comment/controllers/admin_manage_comments.php @@ -28,8 +28,10 @@ class Admin_Manage_Comments_Controller extends Admin_Controller { ->where("updated", "<", db::expr("UNIX_TIMESTAMP() - 86400 * 7")) ->execute(); - // Redirect to the appropriate queue - url::redirect("admin/manage_comments/queue/unpublished"); + $view = new Admin_View("admin.html"); + $view->content = new View("admin_manage_comments.html"); + $view->content->menu = $this->_menu($this->_counts()); + print $view; } public function menu_labels() { @@ -43,25 +45,32 @@ class Admin_Manage_Comments_Controller extends Admin_Controller { 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") + $view = new Gallery_View("admin_manage_comments_queue.html"); + $view->counts = $this->_counts(); + $view->menu = $this->_menu($view->counts); + $view->state = $state; + $view->comments = ORM::factory("comment") ->order_by("created", "DESC") ->order_by("id", "DESC") ->where("state", "=", $state) ->limit(self::$items_per_page) ->offset(($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")); + + // This view is not themed so we can't use $theme->url() in the view and have to + // reproduce Gallery_View::url() logic here. + $atn = theme::$admin_theme_name; + $view->fallback_avatar_url = url::abs_file("themes/$atn/images/avatar.jpg"); + + $view->page = $page; + $view->page_type = "collection"; + $view->page_subtype = "admin_comments"; + $view->page_size = self::$items_per_page; + $view->children_count = $this->_counts()->$state; + $view->max_pages = ceil($view->children_count / $view->page_size); + + // Also we want to use $theme->paginator() so we need a dummy theme + $view->theme = $view; print $view; } diff --git a/modules/comment/helpers/comment_installer.php b/modules/comment/helpers/comment_installer.php index 48b6ee21..5c6bd586 100644 --- a/modules/comment/helpers/comment_installer.php +++ b/modules/comment/helpers/comment_installer.php @@ -37,8 +37,8 @@ class comment_installer { `server_http_referer` varchar(255) default NULL, `server_http_user_agent` varchar(128) default NULL, `server_query_string` varchar(64) default NULL, - `server_remote_addr` varchar(32) default NULL, - `server_remote_host` varchar(64) default NULL, + `server_remote_addr` varchar(40) default NULL, + `server_remote_host` varchar(255) default NULL, `server_remote_port` varchar(16) default NULL, `state` varchar(15) default 'unpublished', `text` text, @@ -48,7 +48,7 @@ class comment_installer { module::set_var("comment", "spam_caught", 0); module::set_var("comment", "access_permissions", "everybody"); - module::set_version("comment", 3); + module::set_version("comment", 4); } static function upgrade($version) { @@ -62,6 +62,19 @@ class comment_installer { module::set_var("comment", "access_permissions", "everybody"); module::set_version("comment", $version = 3); } + + if ($version == 3) { + // 40 bytes for server_remote_addr is enough to swallow the longest + // representation of an IPv6 addy. + // + // 255 bytes for server_remote_host is enough to swallow the longest + // legit DNS entry, with a few bytes to spare. + $db->query( + "ALTER TABLE {comments} CHANGE `server_remote_addr` `server_remote_addr` varchar(40)"); + $db->query( + "ALTER TABLE {comments} CHANGE `server_remote_host` `server_remote_host` varchar(255)"); + module::set_version("comment", $version = 4); + } } static function uninstall() { diff --git a/modules/comment/models/comment.php b/modules/comment/models/comment.php index d5e952eb..7c189a0e 100644 --- a/modules/comment/models/comment.php +++ b/modules/comment/models/comment.php @@ -98,8 +98,8 @@ class Comment_Model_Core extends ORM { $this->server_http_referer = substr($input->server("HTTP_REFERER"), 0, 255); $this->server_http_user_agent = substr($input->server("HTTP_USER_AGENT"), 0, 128); $this->server_query_string = substr($input->server("QUERY_STRING"), 0, 64); - $this->server_remote_addr = substr($input->server("REMOTE_ADDR"), 0, 32); - $this->server_remote_host = substr($input->server("REMOTE_HOST"), 0, 64); + $this->server_remote_addr = substr($input->server("REMOTE_ADDR"), 0, 40); + $this->server_remote_host = substr($input->server("REMOTE_HOST"), 0, 255); $this->server_remote_port = substr($input->server("REMOTE_PORT"), 0, 16); } diff --git a/modules/comment/module.info b/modules/comment/module.info index cd34f140..4e7df6f1 100644 --- a/modules/comment/module.info +++ b/modules/comment/module.info @@ -1,3 +1,7 @@ name = "Comments" description = "Allows users and guests to leave comments on photos and albums." -version = 3 +version = 4 +author_name = "Gallery Team" +author_url = "http://codex.gallery2.org/Gallery:Team" +info_url = "http://codex.gallery2.org/Gallery3:Modules:comment" +discuss_url = "http://gallery.menalto.com/forum_module_comment" diff --git a/modules/comment/views/admin_manage_comments.html.php b/modules/comment/views/admin_manage_comments.html.php index 34a28986..e3c8546c 100644 --- a/modules/comment/views/admin_manage_comments.html.php +++ b/modules/comment/views/admin_manage_comments.html.php @@ -2,200 +2,45 @@ <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), + var set_state = function(state, id) { + $("#g-comment-" + id).fadeOut("fast", function() { + $.get(set_state_url.replace("__STATE__", state).replace("__ID__", id), {}, - function() { - $("#g-comment-" + id).slideUp(); - update_menu(); - }); + 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() { + var update_menu = function() { $.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]); + $("#g-admin-comments ul 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> + // Paginator clicks load their href in the active tab panel + var fix_links = function() { + $(".g-paginator a, a#g-delete-all-spam").click(function(event) { + event.stopPropagation(); + $.scrollTo(0, 800, { easing: "swing" }); + $(this).parents(".ui-tabs-panel").load( + $(this).attr("href"), + function() { + fix_links(); + }); + return false; + }); + } - <div class="g-paginator"> - <?= $pager ?> - </div> + $(document).ready(function() { + $("#g-admin-comments").tabs({ + show: fix_links, + }); + }); +</script> - </div> +<div id="g-admin-comments" class="g-block"> + <?= $menu->render() ?> </div> diff --git a/modules/comment/views/admin_manage_comments_queue.html.php b/modules/comment/views/admin_manage_comments_queue.html.php new file mode 100644 index 00000000..d847d729 --- /dev/null +++ b/modules/comment/views/admin_manage_comments_queue.html.php @@ -0,0 +1,157 @@ +<?php defined("SYSPATH") or die("No direct script access.") ?> +<div class="g-block-content"> + <? 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 id="g-delete-all-spam" + 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 ?> + + <div class="g-paginator"> + <?= $theme->paginator() ?> + </div> + <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, $fallback_avatar_url) ?>" + 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" && $comment->state != "deleted"): ?> + <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> + <? if ($state == "deleted"): ?> + <?= t("Undelete") ?> + <? else: ?> + <?= t("Approve") ?> + <? endif ?> + </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> + --> + <? if ($comment->state != "deleted"): ?> + <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> + <? endif ?> + </ul> + </td> + </tr> + <? endforeach ?> + </table> + + <div class="g-paginator"> + <?= $theme->paginator() ?> + </div> +</div> |