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

View File

@@ -21,50 +21,29 @@ class Comment_Controller extends REST_Controller {
protected $resource_type = "comment";
/**
* Return the form for adding comments.
* Present a form for editing a comment
* @see Rest_Controller::form($resource)
*/
public function _get_form($comment) {
$form = new Forge(url::current(true), "", "post", array("id" => "gComment"));
$group = $form->group(_("Add Comment"));
$group->input("author")
->label(_("Author"))
->id("gAuthor")
->class(null)
->value($comment->author);
$group->input("email")
->label(_("Email"))
->id("gEmail")
->class(null)
->value($comment->email);
$group->textarea("text")
->label(_("Text"))
->id("gText")
->class(null)
->value($comment->text);
$group->hidden("item_id")
->value($comment->item_id);
$group->submit(_("Add"));
$this->_add_validation_rules(ORM::factory("comment")->validation_rules, $form);
return $form;
public function _form($comment) {
$form = comment::get_edit_form($comment);
print $form->render("form.html");
}
/**
* @todo Refactor this into a more generic location
* Get an existing comment.
* @see Rest_Controller::_get($resource)
*/
private function _add_validation_rules($rules, $form) {
foreach ($form->inputs as $name => $input) {
if (isset($input->inputs)) {
$this->_add_validation_rules($rules, $input);
}
if (isset($rules[$name])) {
$input->rules($rules[$name]);
}
}
public function _get($comment) {
$v = new View("comment.html");
$v->comment = $comment;
print $v;
}
public function add($item_id) {
/**
* Update existing comment.
* @see Rest_Controller::_put($resource)
*/
public function _put($comment) {
$comment = ORM::factory('comment');
$comment->item_id = $item_id;
@@ -77,43 +56,16 @@ class Comment_Controller extends REST_Controller {
$comment->datetime = time();
$comment->item_id = $this->input->post('item_id');
$comment->save();
$data = array('valid' => true, 'html' => sprintf(comment::show_comment_list($item_id)));
} else {
$data = array('valid' => false, 'html' => sprintf($form->render()));
return;
}
if (request::method() == "get") {
print $data['html'];
} else if (request::method() == "post") {
print json_encode($data);
}
}
public function get_item_comments($item_id) {
print comment::show_comment_list($item_id);
}
/**
* Get an existing comment.
* @see Rest_Controller::_get($resource)
*/
public function _get($user) {
throw new Exception("@todo Comment_Controller::_get NOT IMPLEMENTED");
}
/**
* Update existing comment.
* @see Rest_Controller::_put($resource)
*/
public function _put($resource) {
throw new Exception("@todo Comment_Controller::_put NOT IMPLEMENTED");
print $form->render();
}
/**
* Add a new comment
* @see Rest_Controller::_post($resource)
*/
public function _post($user) {
public function _post($comment) {
throw new Exception("@todo Comment_Controller::_post NOT IMPLEMENTED");
}