修改edit_in_place插件,将“(点击编辑)”放入内容中

龚弘业
2023-12-01
edit_in_place确实是个不错的效果。但是对于 主流用户 来说,输入框还有优于它的。为什么呢?因为你EIP在那,很多人不知道是可以点击修改的。好吧。你说后面加个提示,行,然后发现用户华丽的去点后面的提示,发现不能改……
不知道本身这个插件有没有这个功能。没找到。知道的望告诉一下
那么,我们就把提示放进内容中吧。
我用的代码比较HARD,以后再更新,先能用。
打开jrails_in_place_macros_helper.rb 在plugins里,这个是helper的东西。
看到in_place_editor_field方法。也就是平时我们用在页面中的方法:
其中

tag.to_content_tag(tag_options.delete(:tag), tag_options) + in_place_editor(tag_options[:id], in_place_editor_options)

假设我们用的是模型pair, 字段name,在页面得到是:
<span class="in_place_editor_field" id="pair_name_1_in_place_editor">或许只是传说</span><script type="text/javascript">
//<![CDATA[
$('#pair_name_1_in_place_editor').editInPlace({update_value:'value', url:'/admin/lovetrees/set_pair_name/1'})
//]]>
</script>

其中span里的是tag.to_content_tag得到的。javascript是后面in_place_editor得到了。我们想把提示加入到内容中,就应该得到:
<span class="in_place_editor_field" id="pair_name_1_in_place_editor">或许只是传说(点击编辑)</span>

大概这样的效果。
也就是说应该是需要改动tag.to_content_tag部分。这个方法到底什么用的。我们看看API:

# File actionpack/lib/action_view/helpers/form_helper.rb, line 624
def to_content_tag(tag_name, options = {})
content_tag(tag_name, value(object), options)
end

哦。明白了。其中value(object)就是输出pair.name的值。那我们需要改动to_content_tag。但是我们不知道其他还有什么地方用到了。那就只改tag的这个方法吧。于是。我们在in_place_editor_field中这样改:

def in_place_editor_field(object, method, tag_options = {}, in_place_editor_options = {})
tag = ::ActionView::Helpers::InstanceTag.new(object, method, self)

#
def tag.to_content_tag(tag_name, str="", options = {})
content_tag(tag_name, value(object) + str, options)
end
#
#etc..
tag.to_content_tag(tag_options.delete(:tag), content_tag(:span, "(点击编辑)", :class => "notice"), tag_options) + in_place_editor(tag_options[;id], in_place_editor_options)
end

OK,重启一下,原来的“或许只是传说”变成了“或许只是传说(点击编辑)”并且你点这个提示,就会出现编辑效果了。
---
但是问题出来了!
当我们点击这个提示时,输入框里面的内容也多了这个提示内容!
追寻一下原因。这就不是rails的事儿了。是js的事儿了。
打开public/jquery_inplac.pack.js,不用去改plugins里面的js(以前博客修改eip中文提示提到过)
这个文件压缩过。就不细谈了。找到对应页面的输出内容:
'<input type="text" name="inplace_value" class="inplace.field" value="' + jQuery(this).text().trim().escape_html() + '"/>'

里面的jQuery(this).text().trim().escape_html()就是从原来的页面获取的内容。也就是说这一段代码得到了“或许只是传说(点击编辑)”而不是我们本来想要的“或许只是传说”。
好吧。既然是HARD CODE。那就直接替换掉。
'<input type="text" name="inplace_value" class="inplace.field" value="' + jQuery(this).text().trim().escape_html().escape_html().replace('(点击编辑)', '') + '"/>'

好了,当我们再看页面的时候,点击内容,提示就不会再出现在编辑框重了。对应的textarea也是同样的改发。
或许认为事情结束了。然后打开有select(EIP)的页面。发现当当点击编辑的时候,不能得到原始值了。比如,我们本来选择“心情”用EIP的SELECT,当点击编辑时,SELECT应该指到我选择的心情,但是现在给的是默认的“选择。。”
当然,还是修改public/jquery_inplac.pack.js。由于压缩过后用了很多变量来替代,select的代码很复杂。但是我们不难发现其中有句:
[quote]var K=N==H?'selected="selected"': #etc[/quote]
太明显不过了。再找找N H分别是什么。发现了代码:H=jQuery(this).html()也就是得到EIP之前的内容。
这就简单了。修改H? nono,这一改全乱了。我们只修改SELECT当中的,改成:
var K=N==jQuery(this).text().trim().escape_html().replace('(点击编辑)','')?'selected="selected"': #etc

好了,虽然HARD但是能用就OK了。
下次有时间改的通用些。
 类似资料: