Zencart二次开发资料_第1页
Zencart二次开发资料_第2页
Zencart二次开发资料_第3页
Zencart二次开发资料_第4页
Zencart二次开发资料_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Zencart二次开发资料(由zencart-magento论坛整理)数据库分析模块机制分析admin后台管理目录cache缓存目录docs文档目录download用于存放下载类商品editors所见即所得编辑器email电子邮件模版目录extras测试文件目录images商品图片目录includes前台media媒体类商品目录pub公用目录(空)includes里面的目录:auto_loaders自动加载的脚本classes主要的类函数extra_cart_actions空extra_configures第三方模块设置文件extra_datafiles第三方模块数据表名定义functions

2、主要的功能函数index_filters过滤功能init_includes初始化功能languages语言文件包目录modules所有的模块目录templates模版目录zencart与oscommerce在某中意义上很相似,可以看做是一个升级版,两者之间共用了很多相同的函数或类,不同的是他们是按照不同的方式组织在一起zencart采用摸板,单一文件index.php入口,后面跟参数,参数决定显示的内容,基本上网页变换的部分只是中间的主区域重点介绍几个文件includes目录,该目录无疑是zencart的核心(前台),通常情况下index.php第一句话则是包含include目录下的appli

3、cation_top.php文件,如:require(includes/application_top.php);在该系统中application_top.php负责的是初始化工作,比如加载配置文件include(includes/configure.php);如果系统程序没检测到该文件的存在则会尝试调用安装文件,然后它会自动遍历include/extra_configures下的配置文件并包含进来在加载了系统配置文件以后接下来是一个非常重要的文件,这也导致了zencart和oscommerce感觉上很大不同的原因(事实上都一回事)首先调用一个文件require(includes/initsy

4、stem.php);在initsystem.php中最先加载include/auto_loaders/config.core.php,config.core.php是一一个二围数组$autoLoadConfig,即以数组的形式保存文件的信息供后面文件调用,然后系统会接着加载完include/auto_loaders目录下所有文件名匹配$loaderPrefix(默认为config)的文件上面程序执行完以后就可以加载自动执行程序了require(includes/autoload_func.php);在这里它会遍历$autoLoadConfig数组,它最终执行的效果会包含所有必须用到的函数或者类

5、的定义,还有变量的初始化,config.core.php里面的注释比较清楚比如$autoLoadConfig0=array(autoType=class,loadFile=class.base.php);在autoload_func.php里面执行完以后的效果就是require(DIR_WS_CLASSES.class.base.php),事实上本人是不赞成这种写法,大部分的初始化化工作是通过包含init_includes目录下的文件来实现的如:$autoLoadConfig110=array(autoType=init_script,loadFile=init_templates.php);

6、它在执行完autoload_func.php文件后就已经加载了init_includes目录下的init_templates.php文件,由于里面包含的文件太多,在这就不做一一介绍了下面我来介绍下zencart是怎么根据摸版把内容显示出来的require(includes/application_top.php);初始化所以需要用到的公共信息以后接下来就应该是显示了在index.php的第29行有句$directory_array=$template-get_template_part($code_page_directory,/Aheader_php/);由于所有初始化工作已经完成,所有我们

7、就可以在上面的文件找到他们的定义,如$autoLoadConfig100=array(autoType=classInstantiate,className=template_func,objectName=template);在这里就定义了$template=newtemplate_func();,然后$code_page_directory变量的定义是在init_includes/init_sanitize.php文件中定义在这里必须要对class/template_func.php中定义的template_func类比较熟悉,在改类中主要定义了两个方法get_template_dir()

8、和get_template_part();这两个方法在zencart的摸版中起到了决定性的作用我简单的说下get_template_dir方法functionget_template_dir($template_code,$current_template,$current_page,$template_dir,$debug=false)它定义了5个参数,第一个参数一般是个文件名,它是用来判断后两个参数组成的目录中有没有匹配$template_code的这个文件,该类复写了默认的系统函数file_exists所以很多初学者可能会比较迷惑functionget_template_dir($tem

9、plate_code,$current_template,$current_page,$template_dir,$debug=false)/echotemplate_default/.$template_dir.=.$template_code;if($this-file_exists($current_template.$current_page,$template_code)return$current_template.$current_page./;elseif($this-file_exists(DIR_WS_TEMPLATES.template_default/.$current

10、_page,ereg_replace(/,$template_code),$debug)returnDIR_WS_TEMPLATES.template_default/.$current_page;elseif($this-file_exists($current_template.$template_dir,ereg_replace(/,$template_code),$debug)return$current_template.$template_dir;elsereturnDIR_WS_TEMPLATES.template_default/.$template_dir;/return$c

11、urrent_template.$template_dir;/*如includes/templates/zccn/indexincludes/templates/template_default/indexincludes/templates/zccn/commonincludes/templates/template_default/common*/get_template_part()方法有两个函数,第一个参数是文件目录,第二个参数是匹配的条件,执行的结果是包含该目录下所有文件名匹配这个条件的文件比如$directory_array=$template-get_template_part(

12、$code_page_directory,header_php/);这句话执行的结果就是返回目录下$code_page_directory所有文件名以header_php开头的文件如此时的url( HYPERLINK http:/localhost/zencart/index.php?main_page=product_info&cPath=49_27&products_id=83 http:/localhost/zencart/index.php?main_page=product_info&cPath=49_27&products_id=83)你现在应该查看init_sanitize.ph

13、p中$code_page_directory的定义此时的$code_page_directory的值应该是includes/modules/product_info/所以它就应该包含该目录下所有以header_php开头的文件,在这里好象就只有一个header_php.php$directory_array=$template-get_template_part($code_page_directory,/Aheader_php/);这个包含文件其实是初始化前台不同页面显示所需要用到的变量函数,主要是初始化数据库的东西,因为每个页面需要的数据资料都有可能不同,所以index.php?main_

14、page=index当main_page的值不同是在includes/modules/目录下都会有个对应的目录,这里是index目录只要知道了这两个方法的用法,你就会知道模板文件都是怎么显示出来的了再来解释一require($template-get_template_dir(html_header.php,DIR_WS_TEMPLATE,$current_page_base,common)./html_header.php);假设当前 HYPERLINK http:/localhost/zencart/index.php?main_page=index&cPath=48 http:/loca

15、lhost/zencart/index.php?main_page=index&cPath=48DIR_WS_TEMPLATE定义是在includes/init_templates.php中定义define(DIR_WS_TEMPLATE,DIR_WS_TEMPLATES.$template_dir./);,因为我现在用的是默认的zccn模板所以现在的DIR_WS_TEMPLATE=includes/templates/zccn/$current_page_base在这里已经就是index上面已经解释了$template-get_template_dir()的方法了程序会依次在includes

16、/templates/zccn/indexincludes/templates/template_default/indexincludes/templates/zccn/commonincludes/templates/template_default/common这四个目录下找html_header.php,在这里,最终在template_defaultcommon目录下找到html_header.php到这里就可以自己写摸板文件了,因为$template-get_template_dir()是按顺序找的,所以你只要在你的模板文件中存在该文件即可zencart的sidebox机制zenca

17、rt的左右边栏很有特色,由一块一块的sidebox拼合起来的,在模板的sidebox文件夹建立一个sidebox程序,登陆管理后台后,选择外观控制,系统会自动检测到新增加的sidebox程序,并提醒你操作。并把所有的sidebox配置信息存储在layout_boxes的表格中。程序调用边栏是通过includes/modules目录下的columneft.php,和column_right.php控制。分析下源码也非常简单:首页查询layout_boxes数据表,检索出在左栏和或右栏显示的所有sidebox,再直接require进来layout_box_name字段标记的sidebox名称。随便

18、打开一个sidebox的源代码,如系统自带的includes/modules/sideboxes/banner_box.php,banner_box.php只要用来获取sidebox显示所要的数据,再通过require($template-get_template_dir(tpl_banner_box.php,DIR_WS_TEMPLATE,$current_page_base,sideboxes),载入显示这个sidebox的模板,其实这个所谓的模板就是生成一个$content的字符串,然后再require($template-get_template_dir($column_box_def

19、ault,DIR_WS_TEMPLATE,$current_page_base,common)./.$column_box_default)再用一个显示sidebox的公共模板,在$column_box_default中打印出$content的内容,这样一个sidebox就显示完成了!如何添加一个自己的sidebox?其实很简单,在includes/modules/sideboxes/模板目录/建立一个文件,就是一个sidebox了,可以在后台控制是否显示在默认的左右边栏和排序。在这个文件中就输出任何内容了,当然可以按照标准的模式,再在includes/templates/模板目录/sideb

20、oxes下建立一个模板文件require进来,尽量做到M/V的分离,这样以后修改也会比较方便!在zencart左侧栏目中,每个小模块都是用box方式显示的。zencart函数zen_get_box_id()主要是对box_id进行处理.while(strstr($box_id,_)$box_id=str_replace(_,”,$box_id);$box_id=str_replace(.php,$box_id);return$box_id;看的出来,他的主要作用是除去_和.phquot;的后缀,形成一个新的字符串,形成的注释中会有!-/bof:/-quot;style=width:quotgt

21、;quotgtlt;?phpecho$title;?氏/山3借助$box_id还可以形成样式html的id前台首页分析Index.php加载需要的所有文件,简称入口文件。/*/main_template_vars.php会根据$_GETmain_page显示不同的模板require($template-get_template_dir(main_template_vars.php,DIR_WS_TEMPLATE,$current_page_base,common)./main_template_vars.php);后台首页分析首部导航菜单栏机制index.php-header.php-head

22、er_navigation.php-includes/boxes/*.dhtml.php-functionzen_draw_admin_box($za_heading,$za_contents)二次开发导航实例主要改动tpl_main_page.php(改后非zencart的tpl_main_pagephp,为了继承系统功能应用,需要为tpl_main_pages.php提供页面参数判断转入功能。但还是有indexphp入口文件引导)定义整个页面样式,可以定义自己的整个风格和数据库操作(更改了zencart的MVC模式,使页面和业务逻辑处于同一个请求页面),如果需要用到zencart本身的功能

23、,则重新定义一个tpl_main_pagesphp(属于zencart的tpl_main_page.php的重命名同文件-至少保留$body_code中心部位,由自定义tpl_main_pagephp页面转入)。Tpl_headerphp和tpl_footerphp可以自定义其页面,一般还有自定义左右分栏tpl_left.php和tpl_right.php(以上文件供自定义tpl_main_pagephp引入使用)经过页面改动,自定义页面上的url基本硬编码路径Zencart类和函数及特别变量分析/*获取模板目录$page_directory下,含$template_part并后缀为php的文

24、件*/Functionget_template_part($page_directory,$template_part,$file_extension=php)$directory_array=array();if($dir=dir($page_directory)while($file=$dir-read()$file_extension&if(!is_dir($page_directory$file)if(substr($file,strrpos($file,)preg_match($template_part,$file)$directory_array=$file;sort($dire

25、ctory_array);$dir-close();return$directory_array;2/*获取当前模板($current_template/$current_page或者$current_template/$template_dir或者DIR_WS_TEMPLATES.template_default/.$template_dir组成的模板目录文件)含$template_code的文件的目录*/functionget_template_dir($template_code,$current_template,$current_page,$template_dir,$debug=f

26、alse)/echotemplate_default/.$template_dir.=.$template_code;if($this-file_exists($current_template.$current_page,$template_code)return$current_template.$current_page./;elseif($this-file_exists(DIR_WS_TEMPLATES.template_default/.$current_page,preg_replace(/,$template_code),$debug)returnDIR_WS_TEMPLATE

27、S.template_default/.$current_page;elseif($this-file_exists($current_template.$template_dir,preg_replace(/,$template_code),$debug)return$current_template.$template_dir;elsereturnDIR_WS_TEMPLATES.template_default/.$template_dir;/return$current_template.$template_dir;3*methodtodobindvariablestoaquery将字

28、符串$sql中的$bindVarString绑定为值$bindVarVaue且类型$bindVarType*/functionbindVars($sql,$bindVarString,$bindVarValue,$bindVarType,$debug=false)$bindVarTypeArray=explode(:,$bindVarType);$sqlNew=$this-getBindVarValue($bindVarValue,$bindVarType);$sqlNew=str_replace($bindVarString,$sqlNew,$sql);return$sqlNew;/*传递参

29、数(&$rent_page_number,每页数量$max_rows_per_page,原始&$sql_query要显示的结果总数&$query_num_rows),返回新&b$sql_query.=limit.$offset.,.$max_rows_per_page和$query_num_rows以及$num_pages、$offset*/functionsplitPageResults(&$current_page_number,$max_rows_per_page,&$sql_query,&$query_num_rows)$reviews_count=$db-Execute($sql);

30、$query_num_rows=$reviews_count-fieldstotal;$num_pages=ceil($query_num_rows/$max_rows_per_page);if($current_page_number$num_pages)$current_page_number=$num_pages;$offset=($max_rows_per_page*($current_page_number-1);/fixoffseterroronsomeversionsif($offset区域插入javascript函数如下:functiongetXMLRequester()var

31、xmlhttp_request=false;tryif(window.ActiveXObject)for(vari=5;i;i-)tryif(i=2)xmlhttp_request=newActiveXObject(Microsoft.XMLHTTP);elsexmlhttp_request=newActiveXObject(Msxml2.XMLHTTP.+i+.0);xmlhttp_request.setRequestHeader(Content-Type,text/xml);xmlhttp_request.setRequestHeader(Content-Type,gb2312);brea

32、k;catch(e)xmlhttp_request=false;elseif(window.XMLHttpRequest)xmlhttp_request=newXMLHttpRequest();if(xmlhttp_request.overrideMimeType)xmlhttp_request.overrideMimeType(text/xml);catch(e)xmlhttp_request=false;returnxmlhttp_request;functionIDRequest(n)/定义收到服务器的响应后需要执行的javascript函数url=n+document.getEleme

33、ntByld(163id)value;定义网址参数xmlhttp_request=getXMLRequester();调用创建XMLHttpRequest的函数xmlhttp_request.onreadystatechange=doContents;/调用doContents函数xmlhttp_requestopen(GET,url,true);xmlhttp_requestsend(null);functiondoContents()if(xmlhttp_requestreadyState=4)/收到完整的服务器响应if(xmlhttp_request.status=200)/HTTP服务

34、器响应的值OKdocumentgetElementByld(message)innerHTML=xmlhttp_requestresponseText;/将服务器返回的字符串写到页面中ID为message的区域elsealert(http_request.status);在vbody区域建立一个文本框,id为163id再建一个id为messsge的空白区域用来显示返回字符串(也可以通过javascript函数截取一部分字符串显示):vdivid=messagev/div这样,一个基于AJAX技术的用户名检测页面就做好了,不过这个页面将返回服务器响应生成页面的所有字符串,当然还可以对返回的字符串

35、进行一些操作,便于应用到不同的需要当中。实例二:以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在在上面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性。该属性包含了服务器返回响应文件的内容。现在我们以XMLDocument对象方式返回响应,此时将不再需要reponseText属性而使用responseXML属性。首先登陆金山通行证注册页面,我们发现金山通行证用户名的检测方式为:/ksgweb/jsp/login/uid.jsp?uid二用户名,并且返回XML数据:isExistedUid-2当result值为-1时表示此用户名已

36、被注册,当result值为-2时表示此用户名尚未注册,因此通过对result值的判断可以知道用户名是否被注册。对上例代码进行修改:首先找到document.getElementById(message).innerHTML=xmlhttp_request.responseText;改为:varresponse=xmlhttp_request.responseXML.documentElement;varresult=response.getElementsByTagName(result)0.firstChild.data;/返回result节点数据if(result=-2)document.

37、getElementById(message).innerHTML=用户名+document.getElementByld(163id).value+尚未注册;elseif(result=-1)document.getElementById(message).innerHTML=对不起,用户名+document.getElementByld(163id).value+已经注册;通过以上两个实例说明了AJAX的客户端基础应用,采用的是网易和金山现成的服务器端程序,当然为了开发合适自己页面的程序,还需要对自己编写服务器端程序,这设计到程序语言及数据库的操作,对于有一定程序基础的读者一定不是很难的事

38、情,本文着重讨论了客户端AJAX的应用体验,广大读者可以根据本文讲的原理结合各种样式表现手法作出绚丽多彩的应用,希望本文能够起到抛砖引玉的作用。附录(一)HTTP1.1支持的状态代码Continue初始的请求已经接受,客户应当继续发送请求的其余部分SwitchingProtocols服务器将遵从客户的请求转换到另外一种协议OK一切正常,对GET和POST请求的应答文档跟在后面。Created服务器已经创建了文档,Location头给出了它的URL。Accepted已经接受请求,但处理尚未完成。Non-AuthoritativeInformation文档已经正常地返回,但一些应答头可能不正确,因

39、为使用的是文档的拷贝NoContent没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的ResetContent没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容PartialContent客户发送了一个带有Range头的GET请求,服务器完成了它MultipleChoices客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。MovedPermanently客户请求的文档在其他地方,新的URL在Location头中

40、给出,浏览器应该自动地访问新的URL。Found类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。SeeOther类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取NotModified客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。UseProxy客户请求的文档应该通过Location头所指明的代理服务器提取307TemporaryRedirect和302(Found)相同。许多浏览器会

41、错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。BadRequest请求出现语法错误。Unauthorized客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。Forbidden资源不可用。NotFound无法找到指定位置的资源MethodNotAllowed请求方法(GET、POS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论