Files
gallery3/modules/comment/helpers/comment.php
Bharat Mediratta 140736a1e4 Several large changes:
1) Changed the way that we get forms.  Now, if you want to get a form
   for a REST resource you prefix /form to the resource id.  So:
    /form/photo/1    : returns a form for editing photo id 1
    /form/comments/1 : returns a form for adding a comment to photo id 1
    /form/comment/1  : returns a form for editing comment id 1

2) Changed the comment module to have two controllers:
    comment:  deals with a single comment resource
    comments: deal with collections of comments attached to an item

Related stuff:
- Moved the comments js into the theme
- Reworked Comment_Helper for clarity
- Moved form generation code down into Comment_Helper
- Cleaned up routes (eliminating new comment ones added in recent rev)
- Added form() function to all REST controllers
- Changed comment module to use a block instead of an arbitrary helper call from the theme
- Comment controller only returns HTML currently, but returns a 201 Created status
  code when a new comment is added, which the Ajax code can catch and act upon.
- Got rid of a lot of extra views in comment module
2008-11-16 07:14:12 +00:00

161 lines
5.7 KiB
PHP

<?php defined("SYSPATH") or die("No direct script access.");
/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2008 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.
*/
/**
* This is the API for handling comments.
*
* Note: by design, this class does not do any permission checking.
*/
class Comment_Core {
const SECONDS_IN_A_MINUTE = 60;
const SECONDS_IN_AN_HOUR = 3600;
const SECONDS_IN_A_DAY = 86400;
const SECONDS_IN_A_MONTH = 2629744;
const SECONDS_IN_A_YEAR = 31556926;
/**
* Create a new photo.
* @param string $author author's name
* @param string $email author's email
* @param string $text comment body
* @param integer $item_id id of parent item
* @param integer $datetime optional comment date and time in Unix format
* @return Comment_Model
*/
static function create($author, $email, $text, $item_id, $datetime=NULL) {
if (is_null($datetime)) {
$datetime = time();
}
$comment = ORM::factory("comment");
$comment->author = $author;
$comment->email = $email;
$comment->text = $text;
$comment->datetime = $datetime;
$comment->item_id = $item_id;
return $comment->save();
}
static function get_add_form($item) {
$form = new Forge(url::site("comments/{$item->id}"), "", "post", array("id" => "gCommentForm"));
$group = $form->group(_("Add Comment"));
$group->input("author") ->label(_("Author")) ->id("gAuthor");
$group->input("email") ->label(_("Email")) ->id("gEmail");
$group->textarea("text")->label(_("Text")) ->id("gText");
$group->submit(_("Add"));
comment::_add_validation_rules("comment", $form);
return $form;
}
static function get_edit_form($comment) {
$form = new Forge(url::site("comment/{$comment->id}"), "", "post", array("id" => "gCommentForm"));
$group = $form->group(_("Edit Comment"));
$group->input("author") ->label(_("Author")) ->id("gAuthor") ->value($comment->author);
$group->input("email") ->label(_("Email")) ->id("gEmail") ->value($comment->email);
$group->textarea("text")->label(_("Text")) ->id("gText") ->value($comment->text);
$group->submit(_("Edit"));
comment::_add_validation_rules("comment", $form);
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 = "gComment";
$block->title = _("Comments");
$block->content = comment::get_comments($theme->item());
if ($show_add_form) {
$block->content .= comment::get_add_form($theme->item())->render("form.html");
}
return $block;
}
static function get_comments($item) {
$comments = array("<ul>");
foreach (ORM::factory('comment')->where('item_id', $item->id)
->orderby('datetime', 'asc')
->find_all() as $comment) {
$v = new View("comment.html");
$v->comment = $comment;
$comments[] = $v;
}
$comments[] = "</ul>";
return implode("\n", $comments);
}
/**
* 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;
}
}