summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/comment/controllers/comments.php97
-rw-r--r--modules/comment/helpers/comment.php152
-rw-r--r--modules/comment/helpers/comment_block.php14
-rw-r--r--modules/comment/js/comment.js11
-rw-r--r--modules/comment/views/comment.html.php3
-rw-r--r--modules/comment/views/comments.html.php14
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>