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
This commit is contained in:
Bharat Mediratta
2008-11-16 07:14:12 +00:00
parent b8b60df391
commit 140736a1e4
14 changed files with 230 additions and 140 deletions
+58 -16
View File
@@ -54,26 +54,68 @@ class Comment_Core {
return $comment->save();
}
static function show_comments($item_id) {
$v = new View('show_comments.html');
$v->comment_list = Comment::show_comment_list($item_id);
$v->comment_form = Comment::show_comment_form($item_id);
$v->render(true);
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 show_comment_list($item_id) {
$v = new View('comment_list.html');
$v->item_id = $item_id;
$v->comments = ORM::factory('comment')->where('item_id', $item_id)
->orderby('datetime', 'desc')
->find_all()->as_array();
return $v;
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;
}
static function show_comment_form($item_id) {
$v = new View('comment_form.html');
$v->item_id = $item_id;
return $v;
/**
* @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);
}
/**