From 950c58e6d37f68f69815d4d73df5577b9789679a Mon Sep 17 00:00:00 2001 From: Bharat Mediratta Date: Sat, 8 Nov 2008 09:28:11 +0000 Subject: Add support for in-place editing of data fields. --- core/controllers/album.php | 2 +- core/controllers/item.php | 41 ++++++++++++++++++++++++++++++++++++ core/controllers/photo.php | 2 +- core/libraries/Theme.php | 4 ++++ core/models/item.php | 4 ++++ core/views/in_place_edit.html.php | 38 +++++++++++++++++++++++++++++++++ lib/jquery.jeditable.js | 30 ++++++++++++++++++++++++++ themes/default/views/album.html.php | 6 +++--- themes/default/views/header.html.php | 6 +++--- themes/default/views/page.html.php | 3 +++ 10 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 core/controllers/item.php create mode 100644 core/views/in_place_edit.html.php create mode 100644 lib/jquery.jeditable.js diff --git a/core/controllers/album.php b/core/controllers/album.php index 788ff9e2..d6b457d6 100644 --- a/core/controllers/album.php +++ b/core/controllers/album.php @@ -20,7 +20,7 @@ class Album_Controller extends Template_Controller { public $template = "page.html"; - public function View($id) { + public function view($id) { $item = ORM::factory("item")->where("id", $id)->find(); if (empty($item->id)) { return Kohana::show_404(); diff --git a/core/controllers/item.php b/core/controllers/item.php new file mode 100644 index 00000000..bb670f8a --- /dev/null +++ b/core/controllers/item.php @@ -0,0 +1,41 @@ +where("id", $id)->find(); + if (empty($item->id)) { + return Kohana::show_404(); + } + + if (request::method() == 'get') { + if ($item->type == 'album') { + url::redirect("album/$id"); + } else { + url::redirect("photo/$id"); + } + } else { + $key = $this->input->post("key"); + $value = $this->input->post("value"); + $item->$key = $value; + $item->save(); + print $value; + } + } +} diff --git a/core/controllers/photo.php b/core/controllers/photo.php index 6f746e65..45db4b02 100644 --- a/core/controllers/photo.php +++ b/core/controllers/photo.php @@ -20,7 +20,7 @@ class Photo_Controller extends Template_Controller { public $template = "page.html"; - public function View($id) { + public function view($id) { $item = ORM::factory("item")->where("id", $id)->find(); if (empty($item->id)) { return Kohana::show_404(); diff --git a/core/libraries/Theme.php b/core/libraries/Theme.php index 0f195d08..239a4256 100644 --- a/core/libraries/Theme.php +++ b/core/libraries/Theme.php @@ -48,6 +48,10 @@ class Theme_Core { return $this->pagination->render(); } + public function in_place_edit() { + return new View("in_place_edit.html"); + } + public function blocks() { /** @todo: make this data driven */ $blocks = array( diff --git a/core/models/item.php b/core/models/item.php index a32becc9..b83fe5c3 100644 --- a/core/models/item.php +++ b/core/models/item.php @@ -185,6 +185,10 @@ class Item_Model extends ORM_MPTT { $this->owner = ORM::factory("user", $this->owner_id); } return $this->owner; + } else if (substr($column, -5) == "_edit") { + $real_column = substr($column, 0, strlen($column) - 5); + return "id}-{$real_column}\">" . + "{$this->$real_column}"; } else { return parent::__get($column); } diff --git a/core/views/in_place_edit.html.php b/core/views/in_place_edit.html.php new file mode 100644 index 00000000..adcad6c6 --- /dev/null +++ b/core/views/in_place_edit.html.php @@ -0,0 +1,38 @@ + + \ No newline at end of file diff --git a/lib/jquery.jeditable.js b/lib/jquery.jeditable.js new file mode 100644 index 00000000..fdc46ff4 --- /dev/null +++ b/lib/jquery.jeditable.js @@ -0,0 +1,30 @@ + +(function($){$.fn.editable=function(target,options){var settings={target:target,name:'value',id:'id',type:'text',width:'auto',height:'auto',event:'click',onblur:'cancel',loadtype:'GET',loadtext:'Loading...',placeholder:'Click to edit',loaddata:{},submitdata:{}};if(options){$.extend(settings,options);} +var plugin=$.editable.types[settings.type].plugin||function(){};var submit=$.editable.types[settings.type].submit||function(){};var buttons=$.editable.types[settings.type].buttons||$.editable.types['defaults'].buttons;var content=$.editable.types[settings.type].content||$.editable.types['defaults'].content;var element=$.editable.types[settings.type].element||$.editable.types['defaults'].element;var reset=$.editable.types[settings.type].reset||$.editable.types['defaults'].reset;var callback=settings.callback||function(){};if(!$.isFunction($(this)[settings.event])){$.fn[settings.event]=function(fn){return fn?this.bind(settings.event,fn):this.trigger(settings.event);}} +$(this).attr('title',settings.tooltip);settings.autowidth='auto'==settings.width;settings.autoheight='auto'==settings.height;return this.each(function(){var self=this;var savedwidth=$(self).width();var savedheight=$(self).height();if(!$.trim($(this).html())){$(this).html(settings.placeholder);} +$(this)[settings.event](function(e){if(self.editing){return;} +if(0==$(self).width()){settings.width=savedwidth;settings.height=savedheight;}else{if(settings.width!='none'){settings.width=settings.autowidth?$(self).width():settings.width;} +if(settings.height!='none'){settings.height=settings.autoheight?$(self).height():settings.height;}} +if($(this).html().toLowerCase().replace(/;/,'')==settings.placeholder.toLowerCase().replace(/;/,'')){$(this).html('');} +self.editing=true;self.revert=$(self).html();$(self).html('');var form=$('
');if(settings.cssclass){if('inherit'==settings.cssclass){form.attr('class',$(self).attr('class'));}else{form.attr('class',settings.cssclass);}} +if(settings.style){if('inherit'==settings.style){form.attr('style',$(self).attr('style'));form.css('display',$(self).css('display'));}else{form.attr('style',settings.style);}} +var input=element.apply(form,[settings,self]);var input_content;if(settings.loadurl){var t=setTimeout(function(){input.disabled=true;content.apply(form,[settings.loadtext,settings,self]);},100);var loaddata={};loaddata[settings.id]=self.id;if($.isFunction(settings.loaddata)){$.extend(loaddata,settings.loaddata.apply(self,[self.revert,settings]));}else{$.extend(loaddata,settings.loaddata);} +$.ajax({type:settings.loadtype,url:settings.loadurl,data:loaddata,async:false,success:function(result){window.clearTimeout(t);input_content=result;input.disabled=false;}});}else if(settings.data){input_content=settings.data;if($.isFunction(settings.data)){input_content=settings.data.apply(self,[self.revert,settings]);}}else{input_content=self.revert;} +content.apply(form,[input_content,settings,self]);input.attr('name',settings.name);buttons.apply(form,[settings,self]);$(self).append(form);plugin.apply(form,[settings,self]);$(':input:visible:enabled:first',form).focus();if(settings.select){input.select();} +input.keydown(function(e){if(e.keyCode==27){e.preventDefault();reset.apply(form,[settings,self]);}});var t;if('cancel'==settings.onblur){input.blur(function(e){t=setTimeout(function(){reset.apply(form,[settings,self]);},500);});}else if('submit'==settings.onblur){input.blur(function(e){form.submit();});}else if($.isFunction(settings.onblur)){input.blur(function(e){settings.onblur.apply(self,[input.val(),settings]);});}else{input.blur(function(e){});} +form.submit(function(e){if(t){clearTimeout(t);} +e.preventDefault();if(false!==submit.apply(form,[settings,self])){if($.isFunction(settings.target)){var str=settings.target.apply(self,[input.val(),settings]);$(self).html(str);self.editing=false;callback.apply(self,[self.innerHTML,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}}else{var submitdata={};submitdata[settings.name]=input.val();submitdata[settings.id]=self.id;if($.isFunction(settings.submitdata)){$.extend(submitdata,settings.submitdata.apply(self,[self.revert,settings]));}else{$.extend(submitdata,settings.submitdata);} +if('PUT'==settings.method){submitdata['_method']='put';} +$(self).html(settings.indicator);$.post(settings.target,submitdata,function(str){$(self).html(str);self.editing=false;callback.apply(self,[self.innerHTML,settings]);if(!$.trim($(self).html())){$(self).html(settings.placeholder);}});}} +return false;});});this.reset=function(){$(self).html(self.revert);self.editing=false;if(!$.trim($(self).html())){$(self).html(settings.placeholder);}}});};$.editable={types:{defaults:{element:function(settings,original){var input=$('');$(this).append(input);return(input);},content:function(string,settings,original){$(':input:first',this).val(string);},reset:function(settings,original){original.reset();},buttons:function(settings,original){var form=this;if(settings.submit){if(settings.submit.match(/>$/)){var submit=$(settings.submit).click(function(){if(submit.attr("type")!="submit"){form.submit();}});}else{var submit=$('