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

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了。
下次有时间改的通用些。
好的,您可以在 `edit_diary` 函数添加以下代码来创建一个 "保存" 按钮: ``` def edit_diary(): # 创建新窗口 edit_window = tk.Toplevel(root) edit_window.title("修改日记内容") # 设置子窗口大小为300x300,并让窗口居显示 window_width = 300 window_height = 300 screen_width = edit_window.winfo_screenwidth() screen_height = edit_window.winfo_screenheight() x_coordinate = int((screen_width - window_width) / 2) y_coordinate = int((screen_height - window_height) / 2) edit_window.geometry(f"{window_width}x{window_height}+{x_coordinate}+{y_coordinate}") # 创建 Text 组件 text_widget = tk.Text(edit_window) text_widget.pack(fill='both', expand=True) # 获取当前选的日记条目的索引和内容 selected_item = text_widget.tag_ranges(tk.SEL) if selected_item: start, end = selected_item index = int(text_widget.get(f"{start} linestart", f"{start} lineend")) content = diary[index-1] else: tk.messagebox.showwarning("警告", "请先选修改的日记条目!") return # 在 Text 组件显示当前选的日记内容 text_widget.insert(tk.END, content) # 创建保存按钮 save_button = tk.Button(edit_window, text="保存", command=lambda: save_edited_diary(text_widget, index)) save_button.pack(side=tk.BOTTOM, pady=10) ``` 其 `save_edited_diary` 是一个新函数,用于保存用户修改后的日记内容。您需要自己实现这个函数,以下是一个可能的实现: ``` def save_edited_diary(text_widget, index): # 获取用户修改后的日记内容 edited_content = text_widget.get('1.0', tk.END).strip() if edited_content: # 更新日记列表对应的内容 diary[index-1] = edited_content # 更新 Text 组件对应的内容 text_widget.delete('1.0', tk.END) for i, entry in enumerate(diary): entry_with_number = f"{i + 1}. {entry}" text_widget.insert(tk.END, entry_with_number + '\n\n') # 关闭编辑窗口 tk.messagebox.showinfo("提示", "日记内容已保存!") edit_window.destroy() else: tk.messagebox.showwarning("警告", "日记内容不能为空!") ``` 当用户在日记列表某一条目并点击 "修改" 按钮后,程序会弹出一个新的窗口,显示当前选的日记内容,并提供一个 "保存" 按钮,用于保存用户修改后的内容。当用户点击 "保存" 按钮时,程序会调用 `save_edited_diary` 函数来更新日记列表和 Text 组件对应的内容,并关闭编辑窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值