ueditor使用indexBD缓存草稿——多重防护编辑内容丢失
Author:zhoulujun Date:
本站phpcms使用ueditor编辑文件,phpcms登录失效了,会自动刷新编辑页面,这个时候之前辛辛苦苦的编辑内容,全部作废
虽然ueditor等编辑会自动保存草稿到到localstorage,但是如过你此篇文章未编辑完成,又编辑了其他文章,那么ueditor的草稿会被覆盖
所以,首先用indexDB,保所有的编辑内容,缓存到数据库。然后,用ajax去提交表单。
这样,文件草稿内容就不怕丢失了
indexDB保存草稿
草稿保存到indexDB
var dataBaseIndexDB; // 统一使用db变量存储数据库实例
// 初始化数据库
try {
var request = indexedDB.open('ueditor', 1);
request.onupgradeneeded = function (event) {
dataBaseIndexDB = event.target.result;
// 创建对象存储(如果不存在)
if (!dataBaseIndexDB.objectStoreNames.contains('v9_news_data')) {
dataBaseIndexDB.createObjectStore('v9_news_data', { keyPath: 'id' });
}
};
request.onsuccess = function (event) {
dataBaseIndexDB = event.target.result;
console.log("数据库打开成功!");
};
request.onerror = function (event) {
console.error("数据库打开失败:", event.target.error);
};
} catch (e) {
console.log(e)
}
var titleInput = document.getElementById('title')
var keywordsInput = document.getElementById('keywords')
var descriptionInput = document.getElementById('description')
function saveToIndexDB(content) { // 添加参数接收
if (!dataBaseIndexDB) {
console.error("数据库尚未初始化完成");
return;
}
// 使用正确的对象存储名称
const transaction = dataBaseIndexDB.transaction('v9_news_data', 'readwrite');
const store = transaction.objectStore('v9_news_data');
const request = store.put(content);
request.onsuccess = () => {
console.log("数据保存成功:");
};
request.onerror = (event) => {
console.error("保存失败:");
};
// 监听事务完成
transaction.oncomplete = () => {
console.log("事务已完成");
};
}
var tempContentId = Math.random().toString(3,10);
var searchParams = new URLSearchParams(window.location.search)
var contentId = searchParams.get('id')
function addContent(content) {
var id = contentId
if (!id) {
id = tempContentId
}
var title = titleInput && titleInput.value;
var keywords = keywordsInput && keywordsInput.value
var description = descriptionInput && descriptionInput.value
addContent({ id, content, title, keywords, description, time: new Date().getTime() })
}
function clearIndexContent(){
if(!tempContentId){
return
}
// TODO 清理indexDB
}
window.addEventListener('beforeunload ',clearIndexContent)
其次,在
phpcms/modules/content/templates/content_add.tpl.php 与 content_edit.tpl.php 修改refersh_window
<div class="fixed-but text-c">
<div class="button"><input value="<?php echo L('save_close');?>" type="submit" name="dosubmit" class="cu" style="width:145px;" onclick="refersh_window()"></div>
<div class="button"><input value="<?php echo L('save_continue');?>" type="submit" name="dosubmit_continue" class="cu" style="width:130px;" title="Alt+X" onclick="refersh_window()"></div>
<div class="button"><input value="<?php echo L('c_close');?>" type="button" name="close" onclick="refersh_window();close_window();" class="cu" style="width:70px;"></div>
</div>
refersh_window 里面增加清楚缓存 或者保存缓存的方法
Ajax 提交表单
$('#myform').submit(function(e){
e.preventDefault(); // 阻止默认表单提交
// 创建 FormData 对象(支持文件上传)
let formData = new FormData(this);
$.ajax({
url: $(this).attr('action'), // 保持原提交地址
type: 'POST',
data: formData,
processData: false, // 必须!避免jQuery处理FormData
contentType: false, // 必须!自动识别内容类型
dataType: 'json', // 期待返回JSON格式
success: function(response) {
if(response.status) {
alert('保存成功');
// 如果需要跳转(参考原系统逻辑)
if(response.url){
window.location.href = response.url;
}
} else {
alert('保存失败: ' + response.message);
}
},
error: function(xhr) {
alert('请求异常,请检查网络');
}
});
});
</script>
然后修改phpcms
// 在对应控制器方法中(content::add)
public function add() {
// ...原有处理逻辑...
// 改为判断ajax请求
if($this->input->is_ajax_request()){
if($result){ // 假设$result是保存结果
echo json_encode(['status' => 1, 'message' => '成功', 'url' => $return_url]);
}else{
echo json_encode(['status' => 0, 'message' => $error]);
}
exit; // 结束输出
}
// 原有非ajax处理逻辑...
}
转载本站文章《ueditor使用indexBD缓存草稿——多重防护编辑内容丢失》,
请注明出处:https://www.zhoulujun.cn/html/php/phpcms/2025_0310_9512.html