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') { $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) { // @todo Productionize this code // 1) Add security checks // 2) Support owner_ids properly switch ($this->input->post('type')) { case 'album': $new_item = album::create( $item->id, $this->input->post('name'), $this->input->post('title'), $this->input->post('description')); break; case 'photo': $new_item = photo::create( $item->id, $_FILES['file']['tmp_name'], $_FILES['file']['name'], $this->input->post('title'), $this->input->post('description')); break; } print url::redirect("{$new_item->type}/{$new_item->id}"); return; } public function delete($item) { // @todo Production this code // 1) Add 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. // These fields are safe to change foreach ($this->input->post() as $key => $value) { switch ($key) { case "title": case "description": $item->$key = $value; break; } } // @todo Support additional fields // These fields require additional work if you change them // parent_id, owner_id $item->save(); print $item->{$this->input->post('__return')}; } }