summaryrefslogtreecommitdiff
path: root/core/controllers
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2008-11-09 19:20:23 +0000
committerBharat Mediratta <bharat@menalto.com>2008-11-09 19:20:23 +0000
commit1b490c5fe6ce6ced7b02bbdf8c939a991f0378af (patch)
treed06cda6e05d7121f6ec08154115c15b148436d44 /core/controllers
parent065bbb2120ce0aaee96a3886bd06c90ca26da9bd (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/controllers')
-rw-r--r--core/controllers/album.php33
-rw-r--r--core/controllers/item.php75
-rw-r--r--core/controllers/photo.php25
-rw-r--r--core/controllers/welcome.php1
4 files changed, 88 insertions, 46 deletions
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");
}