diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/comment/controllers/comments.php | 97 | ||||
-rw-r--r-- | modules/comment/helpers/comment.php | 152 | ||||
-rw-r--r-- | modules/comment/helpers/comment_block.php | 14 | ||||
-rw-r--r-- | modules/comment/js/comment.js | 11 | ||||
-rw-r--r-- | modules/comment/views/comment.html.php | 3 | ||||
-rw-r--r-- | modules/comment/views/comments.html.php | 14 |
6 files changed, 90 insertions, 201 deletions
diff --git a/modules/comment/controllers/comments.php b/modules/comment/controllers/comments.php index 7dce9d01..8c3f8428 100644 --- a/modules/comment/controllers/comments.php +++ b/modules/comment/controllers/comments.php @@ -28,7 +28,26 @@ class Comments_Controller extends REST_Controller { $item = ORM::factory("item", $this->input->get('item_id')); access::required("view", $item); - print comment::get_comments($item->id); + $comments = ORM::factory("comment") + ->where("item_id", $item->id) + ->orderby("created", "desc") + ->find_all(); + + switch (rest::output_format()) { + case "json": + rest::http_content_type(rest::JSON); + foreach ($comments as $comment) { + $data[] = $comment->as_array(); + } + print json_encode($data); + break; + + case "html": + $view = new View("comments.html"); + $view->comments = $comments; + print $view; + break; + } } /** @@ -36,22 +55,28 @@ class Comments_Controller extends REST_Controller { * @see Rest_Controller::_create($resource) */ public function _create($comment) { - $form = comment::get_add_form($this->input->post('item_id')); + rest::http_content_type(rest::JSON); + + $form = comment::get_add_form($this->input->post("item_id")); if ($form->validate()) { - $comment->author = $this->input->post('author'); - $comment->email = $this->input->post('email'); - $comment->text = $this->input->post('text'); + $comment->author = $this->input->post("author"); + $comment->email = $this->input->post("email"); + $comment->text = $this->input->post("text"); $comment->created = time(); - $comment->item_id = $this->input->post('item_id'); + $comment->item_id = $this->input->post("item_id"); $comment->save(); module::event("comment_created", $comment); - rest::http_status(rest::CREATED); - rest::http_location(url::site("comments/{$comment->id}")); + print json_encode( + array("result" => "success", + "resource" => url::site("comments/{$comment->id}"), + "form" => comment::get_add_form($this->input->post("item_id"))->__toString())); + } else { + print json_encode( + array("result" => "error", + "form" => $form->__toString())); } - // @todo Return appropriate HTTP status code indicating error. - print $form; } /** @@ -60,31 +85,12 @@ class Comments_Controller extends REST_Controller { * @see Rest_Controller::_show($resource) */ public function _show($comment) { - $output_format = rest::output_format(); - switch ($output_format) { - case "xml": - rest::http_content_type(rest::XML); - print xml::to_xml($comment->as_array(), array("comment")); - break; - - case "json": - rest::http_content_type(rest::JSON); - print json_encode($comment->as_array()); - break; - - case "atom": - rest::http_content_type(rest::XML); - print comment::get_atom_entry($comment); - break; - - case "html": - $view = new View("comment.$output_format"); + if (rest::output_format() == "json") { + print json_encode(array("result" => "success", "resource" => $comment)); + } else { + $view = new View("comment.html"); $view->comment = $comment; print $view; - break; - - default: - kohana::show_404(); } } @@ -93,19 +99,25 @@ class Comments_Controller extends REST_Controller { * @see Rest_Controller::_update($resource) */ public function _update($comment) { + rest::http_content_type(rest::JSON); + $form = comment::get_edit_form($comment); if ($form->validate()) { - $comment->author = $this->input->post('author'); - $comment->email = $this->input->post('email'); - $comment->text = $this->input->post('text'); + $comment->author = $this->input->post("author"); + $comment->email = $this->input->post("email"); + $comment->text = $this->input->post("text"); $comment->save(); module::event("comment_updated", $comment); - return; + print json_encode( + array("result" => "success", + "resource" => url::site("comments/{$comment->id}"))); + } else { + print json_encode( + array("result" => "error", + "html" => $form)); } - // @todo Return appropriate HTTP status code indicating error. - print $form; } /** @@ -113,8 +125,11 @@ class Comments_Controller extends REST_Controller { * @see Rest_Controller::_delete($resource) */ public function _delete($comment) { + rest::http_content_type(rest::JSON); + $comment->delete(); - rest::http_status(rest::OK); + print json_encode( + array("result" => "success")); } /** @@ -130,6 +145,6 @@ class Comments_Controller extends REST_Controller { * @see Rest_Controller::form_edit($resource) */ public function _form_edit($comment) { - print $form = comment::get_edit_form($comment); + print comment::get_edit_form($comment); } } diff --git a/modules/comment/helpers/comment.php b/modules/comment/helpers/comment.php index 7695cadb..51246444 100644 --- a/modules/comment/helpers/comment.php +++ b/modules/comment/helpers/comment.php @@ -75,157 +75,5 @@ class comment_Core { $form->add_rules_from($comment); return $form; } - - /** - * @todo Refactor this into a more generic location - */ - private static function _add_validation_rules($model_name, $form) { - $rules = ORM::factory($model_name)->validation_rules; - foreach ($form->inputs as $name => $input) { - if (isset($input->inputs)) { - comment::_add_validation_rules($model_name, $input); - } - if (isset($rules[$name])) { - $input->rules($rules[$name]); - } - } - } - - static function block($theme, $show_add_form=true) { - $block = new Block; - $block->id = "gComments"; - $block->title = _("Comments"); - $block->content = comment::get_comments($theme->item(), "html"); - - if ($show_add_form) { - $block->content .= comment::get_add_form($theme->item())->render("form.html"); - } - return $block; - } - - // @todo Set proper Content-Type in a central place (REST_Controller::dispatch?). - static function get_comments($item_id) { - $comments = ORM::factory('comment')->where('item_id', $item_id) - ->orderby('created', 'asc') - ->find_all(); - - if (!$comments->count()) { - rest::http_status(rest::BAD_REQUEST); - return; - } - - switch (rest::output_format()) { - case "atom": - rest::http_content_type(rest::XML); - print comment::get_atom_feed($comments); - break; - - case "xml": - rest::http_content_type(rest::XML); - return xml::to_xml($comments, array("comments", "comment")); - break; - - case "json": - rest::http_content_type(rest::JSON); - foreach ($comments as $comment) { - $data[] = $comment->as_array(); - } - return json_encode($data); - - default: - foreach ($comments as $comment) { - $v = new View("comment.html"); - $v->comment = $comment; - $html[] = $v; - } - if (!empty($html)) { - return "<ul>\n" . implode("\n", $html) . "</ul>\n"; - } - } - } - - public static function get_atom_entry($comment) { - $feed = new Gallery_Atom_Entry(); - $feed->updated($comment->created) - ->title(sprintf(_("Comment #%d"), $comment->id)) - ->content($comment->text) - ->author() - ->name($comment->author) - ->email($comment->email) - ->uri(url::abs_site("users/$comment->id")); - $feed->link()->related_atom("photos/$comment->item_id"); - $feed->link()->related_image("photos/$comment->item_id"); - - return $feed->as_xml(); - } - - /* - * @todo Show photo title instead of photo ID. - * @todo Put proper user ID into author URI. - */ - public static function get_atom_feed($comments) { - $latest_comment = $comments[0]->created; - $item_id = $comments[0]->item_id; - - /* Set up feed header. */ - $feed = new Gallery_Atom_Feed(); - $feed->title(sprintf(_("Comments on photo %d"), $item_id)); - $feed->updated($latest_comment); - $feed->link()->related_atom("photos/$item_id"); - $feed->link()->related_image("photos/$item_id"); - - /* Add individual comments. */ - foreach ($comments as $id => $comment) { - $feed->entry() - ->id(url::abs_site("comments/$comment->id")) - ->updated($comment->created) - ->title(sprintf(_("Comment #%d"), $comments->count() - $id)) - ->content($comment->text) - ->author() - ->name($comment->author) - ->email($comment->email) - ->uri(url::abs_site("users/$comment->id")); - } - return $feed->as_xml(); - } - - /** - * Format a human-friendly message showing the amount of time elapsed since the specified - * timestamp (e.g. 'said today', 'said yesterday', 'said 13 days ago', 'said 5 months ago'). - * - * @todo Take into account the viewer's time zone. - * @todo Properly pluralize strings. - * - * @param integer $timestamp Unix format timestamp to compare with - * @return string user-friendly string containing the amount of time passed - */ - static function format_elapsed_time($timestamp) { - $now = time(); - $time_difference = $now - $timestamp; - $date_info_now = getdate($now); - - /* Calculate the number of days, months and years elapsed since the specified timestamp. */ - $elapsed_days = round($time_difference / comment::SECONDS_IN_A_DAY); - $elapsed_months = round($time_difference / comment::SECONDS_IN_A_MONTH); - $elapsed_years = round($time_difference / comment::SECONDS_IN_A_YEAR); - $seconds_since_midnight = $date_info_now['hours'] * comment::SECONDS_IN_AN_HOUR + - $date_info_now['minutes'] * comment::SECONDS_IN_A_MINUTE + $date_info_now['seconds']; - - /* Construct message depending on how much time passed. */ - if ($elapsed_years > 0) { - $message = sprintf(_("said %d years ago"), $elapsed_years); - } else if ($elapsed_months > 0) { - $message = sprintf(_("said %d months ago"), $elapsed_months); - } else { - if ($time_difference < $seconds_since_midnight) { - $message = _("said today"); - } else if ($time_difference < $seconds_since_midnight + comment::SECONDS_IN_A_DAY) { - $message = _("said yesterday"); - } else { - $message = sprintf(_("said %d days ago"), $elapsed_days); - } - } - return $message; - } } diff --git a/modules/comment/helpers/comment_block.php b/modules/comment/helpers/comment_block.php index 47025a6c..7d132646 100644 --- a/modules/comment/helpers/comment_block.php +++ b/modules/comment/helpers/comment_block.php @@ -25,7 +25,19 @@ class comment_block_Core { } public static function photo_bottom($theme) { - return comment::block($theme, true); + $block = new Block; + $block->id = "gComments"; + $block->title = _("Comments"); + + $view = new View("comments.html"); + $view->comments = ORM::factory("comment") + ->where("item_id", $theme->item()->id) + ->orderby("created", "ASC") + ->find_all(); + + $block->content = $view; + $block->content .= comment::get_add_form($theme->item())->render("form.html"); + return $block; } public static function admin_dashboard_blocks($theme) { diff --git a/modules/comment/js/comment.js b/modules/comment/js/comment.js index 259b4826..d251ac96 100644 --- a/modules/comment/js/comment.js +++ b/modules/comment/js/comment.js @@ -4,16 +4,17 @@ $("document").ready(function() { function ajaxify_comment_form() { $("#gComments form").ajaxForm({ - complete: function(xhr, statusText) { - $("#gComments form").replaceWith(xhr.responseText); - if (xhr.status == 201) { - $.get(xhr.getResponseHeader("Location"), function(data, textStatus) { + dataType: 'json', + success: function(data) { + if (data.result == "success") { + $.get(data.resource, function(data, textStatus) { $("#gComments .gBlockContent ul:first").append("<li>"+data+"</li>"); $("#gComments .gBlockContent ul:first li:last").hide().slideDown(); }); $("#gComments form").clearForm(); } + $("#gComments form").replaceWith(data.form); ajaxify_comment_form(); } }); -} +}; diff --git a/modules/comment/views/comment.html.php b/modules/comment/views/comment.html.php index 4cd1663c..19886d28 100644 --- a/modules/comment/views/comment.html.php +++ b/modules/comment/views/comment.html.php @@ -2,8 +2,7 @@ <li id="gComment-<?= $comment->id; ?>"> <p> <a href="#" class="gAuthor"><?= $comment->author ?></a> - <?= comment::format_elapsed_time($comment->created) ?>, - <span class="gUnderstate"><?= strftime('%c', $comment->created) ?></span> + <?= date("Y-M-d H:i:s", $comment->created) ?> </p> <div> <?= $comment->text ?> diff --git a/modules/comment/views/comments.html.php b/modules/comment/views/comments.html.php new file mode 100644 index 00000000..f4b3d6dc --- /dev/null +++ b/modules/comment/views/comments.html.php @@ -0,0 +1,14 @@ +<? defined("SYSPATH") or die("No direct script access."); ?> +<ul> + <? foreach ($comments as $comment): ?> + <li id="gComment-<?= $comment->id; ?>"> + <p> + <a href="#" class="gAuthor"><?= $comment->author ?></a> + <?= date("Y-M-d H:i:s", $comment->created) ?> + </p> + <div> + <?= $comment->text ?> + </div> + </li> + <? endforeach ?> +</ul> |