diff options
Diffstat (limited to 'core/controllers/item.php')
-rw-r--r-- | core/controllers/item.php | 75 |
1 files changed, 64 insertions, 11 deletions
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']}; } } |