diff options
author | Bharat Mediratta <bharat@menalto.com> | 2008-11-09 19:20:23 +0000 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2008-11-09 19:20:23 +0000 |
commit | 1b490c5fe6ce6ced7b02bbdf8c939a991f0378af (patch) | |
tree | d06cda6e05d7121f6ec08154115c15b148436d44 /core | |
parent | 065bbb2120ce0aaee96a3886bd06c90ca26da9bd (diff) |
Make Gallery3 more RESTful.
Create Item_Controller as a common superclass for Album_Controller and
Photo_Controller. Change routes to route requests to Item_Controller
for dispatching, which in turn will generate get/post/put/delete
requests to the controlller so that each controller has a RESTful
surface.
Change in_place editing to take advantage of this.
Diffstat (limited to 'core')
-rw-r--r-- | core/config/routes.php | 3 | ||||
-rw-r--r-- | core/controllers/album.php | 33 | ||||
-rw-r--r-- | core/controllers/item.php | 75 | ||||
-rw-r--r-- | core/controllers/photo.php | 25 | ||||
-rw-r--r-- | core/controllers/welcome.php | 1 | ||||
-rw-r--r-- | core/views/in_place_edit.html.php | 4 |
6 files changed, 92 insertions, 49 deletions
diff --git a/core/config/routes.php b/core/config/routes.php index 5314d913..5c34acb7 100644 --- a/core/config/routes.php +++ b/core/config/routes.php @@ -17,6 +17,5 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ - -$config['^(\w+)/(\d+)$'] = '$1/view/$2'; +$config['^(\w+)/(\d+)$'] = '$1/dispatch/$2'; $config['_default'] = 'welcome'; diff --git a/core/controllers/album.php b/core/controllers/album.php index d6b457d6..c94bcbef 100644 --- a/core/controllers/album.php +++ b/core/controllers/album.php @@ -17,33 +17,24 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -class Album_Controller extends Template_Controller { - public $template = "page.html"; - - public function view($id) { - $item = ORM::factory("item")->where("id", $id)->find(); - if (empty($item->id)) { - return Kohana::show_404(); - } - +class Album_Controller extends Item_Controller { + public function get($item) { /** @todo: these need to be pulled from the database */ $theme_name = "default"; $page_size = 9; + $template = new View("page.html"); + $page = $this->input->get("page", "1"); - $theme = new Theme($theme_name, $this->template); + $theme = new Theme($theme_name, $template); - $this->template->content = new View("album.html"); - $this->template->set_global('page_size', $page_size); - $this->template->set_global('item', $item); - $this->template->set_global('children', $item->children($page_size, ($page-1) * $page_size)); - $this->template->set_global('parents', $item->parents()); - $this->template->set_global('theme', $theme); + $template->set_global('page_size', $page_size); + $template->set_global('item', $item); + $template->set_global('children', $item->children($page_size, ($page-1) * $page_size)); + $template->set_global('parents', $item->parents()); + $template->set_global('theme', $theme); + $template->content = new View("album.html"); - /** @todo: move this up to a base class */ - if (Session::instance()->get("use_profiler", false)) { - $profiler = new Profiler(); - print $profiler->render(); - } + print $template->render(); } } diff --git a/core/controllers/item.php b/core/controllers/item.php index bb670f8a..013b00c6 100644 --- a/core/controllers/item.php +++ b/core/controllers/item.php @@ -18,24 +18,77 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Item_Controller extends Controller { - public function view($id) { + + public function dispatch($id) { + /** @todo this needs security checks */ $item = ORM::factory("item")->where("id", $id)->find(); if (empty($item->id)) { return Kohana::show_404(); } + /** + * We're expecting to run in an environment that only supports GET/POST, so expect to tunnel + * PUT/DELETE through POST. + */ if (request::method() == 'get') { - if ($item->type == 'album') { - url::redirect("album/$id"); - } else { - url::redirect("photo/$id"); + $this->get($item); + + if (Session::instance()->get("use_profiler", false)) { + $profiler = new Profiler(); + print $profiler->render(); + } + return; + } + + switch ($this->input->post('__action')) { + case 'put': + return $this->put($item); + + case 'delete': + return $this->delete($item); + + default: + return $this->post($item); + } + } + + public function get($item) { + // Redirect to the more specific resource type, since it will render + // differently. We could also just delegate here, but it feels more appropriate + // to have a single canonical resource mapping. + return url::redirect("{$item->type}/$item->id"); + } + + public function put($item) { + } + + public function delete($item) { + /** @todo: needs security checks */ + $parent = $item->parent(); + if ($parent->id) { + $item->delete(); + } + url::redirect("{$parent->type}/{$parent->id}"); + } + + public function post($item) { + /** @todo Productionize this. */ + // 1) Figure out how to do the right validation here. Validate the form input and apply it to + // the model as appropriate. + // 2) Figure out how to dispatch according to the needs of the client. Ajax requests from + // jeditable will want the changed field back, and possibly the whole item in json. + // + // For now let's establish a simple protocol where the client passes in a __return parameter + // that specifies which field it wants back from the item. Later on we can expand that to + // include a data format, etc. + + $post = $this->input->post(); + foreach (array("title", "description") as $field) { + if (array_key_exists($field, $post)) { + $value = $item->$field = $post[$field]; } - } else { - $key = $this->input->post("key"); - $value = $this->input->post("value"); - $item->$key = $value; - $item->save(); - print $value; } + $item->save(); + print $item->{$post['__return']}; } } diff --git a/core/controllers/photo.php b/core/controllers/photo.php index 45db4b02..55ab6247 100644 --- a/core/controllers/photo.php +++ b/core/controllers/photo.php @@ -17,22 +17,19 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -class Photo_Controller extends Template_Controller { - public $template = "page.html"; +class Photo_Controller extends Item_Controller { + public function get($item) { + $template = new View("page.html"); - public function view($id) { - $item = ORM::factory("item")->where("id", $id)->find(); - if (empty($item->id)) { - return Kohana::show_404(); - } - - $this->template->content = new View("photo.html"); + /** @todo: this needs to be data-driven */ + $theme = new Theme("default", $template); - $this->template->set_global('item', $item); - $this->template->set_global('children', $item->children()); - $this->template->set_global('parents', $item->parents()); + $template->set_global('item', $item); + $template->set_global('children', $item->children()); + $template->set_global('parents', $item->parents()); + $template->set_global('theme', $theme); + $template->content = new View("photo.html"); - /** @todo: this needs to be data-driven */ - $this->template->set_global('theme', new Theme("default", $this->template)); + print $template->render(); } } diff --git a/core/controllers/welcome.php b/core/controllers/welcome.php index c05cba68..786d7bcc 100644 --- a/core/controllers/welcome.php +++ b/core/controllers/welcome.php @@ -119,6 +119,7 @@ class Welcome_Controller extends Template_Controller { public function profiler() { Session::instance()->set("use_profiler", $this->input->get("use_profiler", false)); + $this->auto_render = false; url::redirect("welcome"); } diff --git a/core/views/in_place_edit.html.php b/core/views/in_place_edit.html.php index 2cf0c8a1..8d60df64 100644 --- a/core/views/in_place_edit.html.php +++ b/core/views/in_place_edit.html.php @@ -3,8 +3,10 @@ $(document).ready(function() { ajax_update = function(className, id) { return function(value, settings) { + var post_data = {'__return': settings.name}; + post_data[settings.name] = value; $.post("<?= url::site("item/__ID__") ?>".replace("__ID__", id), - {"key": settings.name, "value": value}, + post_data, function(data, textStatus) { if (textStatus == "success") { $(className).html(data); |