Ecshop实现多语言录入和展示



实现目的:通过后台的语言录入切换功能,将对产品或其他页面的多语言描述记录入数据库。前台通过切换按钮或者ip判断进行内容切换。
实现原理:通过对数据来源(页面和数据库)的控制,在尽量不改动系统业务逻辑的前提下实现该功能。
实现步骤:
1、将需要多语言的数据表复制多分,并以语言做后后缀,如 goods_info_en_us(英文表);
2、在前后台的init.php配置文件,数据库操作文件cls_mysql导入之前标明需要多语言操作的数据表;如下图:
Ecshop实现多语言录入和展示_第1张图片
3、改写cls_mysql的query函数,实现查询的时候添加以下几点的自动判断功能:(优先权限从下往上)
A、只要客户通过post或者get传输了页面查询的语言,如$_POST['_lang'] = 'en_us'; 则将查询的数据表改名为table_name_en_us;
B、用户如果没有进行查询语言限定,则调用数据库指定语言$GLOBALS['_CFG']['lang'];
C、查询时只要通过query函数,将查询形式type设置为"ALL"便会对所有相关语言表进行查询,如query($sql, 'ALL');
4、改写系统目录下的include/cls_template文件的fetch方法,添加系统默认语言(数据库指向语言)和系统当前活跃语言,如下图:
5、改写admin/include/lib_main文件的sys_msg方法,通过改写系统默认的提示方法,保证前端的ajax保存流程的正常运作:
-- 则此 php端的准备工作基本做完了,而后是编写js端程序

6、开发js端,目的,在不改动或少改动系统原先html和js等结构下,实现语言项的植入。
大概原理是:
1、列表页:通过在指定位置植入语言控制对象,点击语言按钮时通过在窗体url中加入“_lang={当前语言}”,再结合query函数里面的第一条规则,请求返回数据后重新刷新页面。而这一切,只需要在原先html模板中加入如下javascript语句:
Ecshop实现多语言录入和展示_第2张图片
2、列表页的编辑项:结合query函数的第三条规则,只要修改时默认指向修改全部内容,即可做到编辑一次,多表效果的效果。而通过改写admin中的listtable.js文件,如果用户只想修改中文表下的商品名或英文表下的商品名,只需要在原先的编辑语句上加上一个变量标示当前活跃语言即可:如下图
Ecshop实现多语言录入和展示_第3张图片
3、添加或修改页面:对该页面的监听会比较复杂,大概原理如下:
a、设置当前页面操作的数据库模型(包括表明、主键名、当前操作行标示以及想要操作的字段映射),模型也可以通过映射进行安全隐藏;
b、设置需要多语言支持的表单项以及你要操作的form;
c、设置更新或保存成功后跳转指向的链接;
d、改写文件提交形式为iframe提交,添加相应的后台响应控制器并返回上传成功的图片路径
e、改写form的onsubmit提交,将原先的onsubmit提交指向为return false,模拟callback形式,在原先onsubmit方法执行完后使用对象里的方法进行表单提交。
f、改写kindeditor编辑器,使其适应该javascript对象;
g、最终表单提交原理是通过ajax将每个语言对应的内容一次一次提交,且通过递归方法实现每次只能提交一个语言对于的内容。保证单通道和ajax的数据安全性。同时在插入数据时也通过每次返回已经插入的行标示来控制每个语言表插入的行标示的统一。
如下图:
Ecshop实现多语言录入和展示_第4张图片


7、防止多次关联表的数据插入:由于操作过程会对关联表进行重复操作,为了避免多次数据插入,在lib_common方法集中写了如下方法进行限制。你只需要在关联表插入时引入该函数并进行判断即可,该方法可考虑升级为自动判断(通过对操作表是否属于多语言,进行插入时的次数限制即可):
Ecshop实现多语言录入和展示_第5张图片

实现结果:效果图如下(具体后贴代码自己看了):

  Ecshop实现多语言录入和展示_第6张图片




你可能感兴趣的:(PHP)