首先去检查是否缓存is_cached。由两个参数确定。caching==1和direct_output==0
如果静态缓存文件不存在,那么直接is_cached为否。立刻给smarty赋值。
如果缓存文件存在,并且缓存里面的数据生成格式不对或者这个缓存文件已经过期。那么直接is_cached为否。立刻给smarty赋值。
如果缓存文件存在,数据生成格式也正确,缓存文件也没过期,可是这个dwt模板修改时间大于缓存文件的创建时间,也同上。
如果以上都没发生。直接读静态缓存template_out,在fetch函数里。
下面在分析smarty赋值的操作:
主要是display函数分析。
分两部分:首先去fetch处理模板文件。然后分析模板文件里面的hash字串包含的动态insert部分。这部分不缓存。
那么最重要的就是第一部分fetch处理模板文件这块。下面主要就讲讲这边的处理过程。
如果模板文件是以str:开头的话。是存在数据库里面的smarty标签(例如:订单号:{$order.order_sn})内容。为什么存到数据库里呢?
因为这些是没有样式的类似发邮件的模板。就没必要做个lbi文件或者dwt文件了。最主要的是这块不需要写成静态缓存形式。
如果模板文件不是以上面开头的话,如果direct_output为真。则直接输出出来,不写成静态缓存形式。也不进行编译成动态的php文件了。
接上,如果direct_output为假,编译这个模板文件。并且如果有缓存id的话,则把静态缓存写入服务器。
那么接下来最重要的就是编译文件这个函数了。make_compiled,下面我就来分析下这块原理啊。
原理也很简单。就是:
如果lbi的模板文件在过期时间外没有被修改过。并且强制编译为否。则直接读编译后的php文件。
如果强制编译为真,或者过期之间后修改过lbi文件。则重新编译这个lbi文件。
那么编译的时候用到了fetch_str这个函数。是解析函数的灵魂。这个函数就是用this->select函数替换所有的{}标签。
那么不得不说说this->select这个函数。这个函数就是处理所有的smarty的标签。
这里不得不说说insert这个标签。他被this->_echash包着。他是针对动态内容可以自己定义的函数标签。可以自己写个
动态内容函数库。专门针对不需要缓存的模块。
因此,文件架构需要动态内容函数库,共用函数库,类文件。这都是必须的。
我在实际做的过程中遇到的问题总结:
困扰了我2天的是头部输出一个空格。我一直以为是模板解析的问题呢。那个模板类看了几十遍。也没有问题啊。后来我从模板转移到php上。
原来是初始化时候,引入了一个外部文件导致的。真郁闷。
困扰了我将近一个小时的问题是:编译文件没有生成。以及缓存文件没有生成的问题。原来是文件夹的权限问题。把cache以及compiled文件夹属性设成777也不好使。后来我直接把这俩个都删了。重新建的。就好了。
模板解析过程:首先把dwt中的所有的BeginLibraryItem转换成include file这样的。然后转成fetch形式。这时候就是编译成功。生成编译文件。
那么,入口是什么呢?就是第一步是什么呢。第一步就是is_cached,分析静态缓存的头部的$para['template'],这里的任意一个修改,那么缓存就失效。而这个数组是编译时候写入的。
下面附上文件结构解析
<?php
/*
ECShop 2.5.1 的结构图及各文件相应功能介绍
ECShop2.5.1_Beta upload 的目录
┣ activity.php 活动列表
┣ affiche.php 广告处理文件
┣ affiliate.php 生成商品列表
┣ article.php 文章内容
┣ article_cat.php文章分类
┣ auction.php 拍卖前台文件
┣ brand.php 品牌列表
┣ captcha.php 生成验证码
┣ catalog.php 列出所以分类及品牌
┣ category.php 商品分类
┣ comment.php 提交用户评论
┣ compare.php 商品比较程序
┣ cycle_image.php 轮播图片程序
┣ feed.php RSS Feed 生成程序
┣ flow.php 购物流程
┣ gallery.php 商品相册
┣ goods.php 商品详情
┣ goods_script.php 生成商品列表
┣ group_buy.php 团购商品前台文件
┣ index.php 首页文件
┣ myship.php 支付配送DEMO
┣ pick_out.php 选购中心
┣ receive.php 处理收回确认的页面
┣ region.php 地区切换程序
┣ respond.php 支付响应页面
┣ robots.txt
┣ search.php 搜索程序
┣ sitemaps.php google sitemap 文件
┣ snatch.php 夺宝奇兵前台页面
┣ tag_cloud.php 标签云
┣ topic.php 专题前台
┣ user.php 会员中心
┣ vote.php 调查程序
┣ wholesale.php 批发前台文件
┣ admin文件夹
┃ ┣ account_log.php 管理中心帐户变动记录
┃ ┣ admin_logs.php 记录管理员操作日志
┃ ┣ ads.php 广告管理程序
┃ ┣ adsense.php 站外JS投放的统计程序
┃ ┣ ad_position.php广告位置管理程序
┃ ┣ affiliate.php 程序说明
┃ ┣ affiliate_ck.php 程序说明
┃ ┣ agency.php 管理中心办事处管理
┃ ┣ area_manage.php 地区列表管理文件
┃ ┣ article.php 管理中心文章处理程序文件
┃ ┣ articlecat.php 文章分类管理程序
┃ ┣ article_auto.php
┃ ┣ attention_list.php
┃ ┣ attribute.php 属性规格管理
┃ ┣ auction.php 管理中心拍卖活动管理
┃ ┣ bonus.php 红包类型的处理
┃ ┣ brand.php管理中心品牌管理
┃ ┣ captcha_manage.php
┃ ┣ card.php 贺卡管理程序
┃ ┣ category.php 商品分类管理程序
┃ ┣ check_file_priv.php 系统文件检测
┃ ┣ comment_manage.php 用户评论管理程序
┃ ┣ convert.php 转换程序
┃ ┣ cron.php 计划任务
┃ ┣ database.php 数据库管理
┃ ┣ ebao_commend.php 易宝推荐
┃ ┣ edit_languages.php 管理中心语言项编辑(前台语言项)
┃ ┣ email_list.php 邮件列表管理
┃ ┣ favourable.php 管理中心优惠活动管理
┃ ┣ flashplay.php
┃ ┣ flow_stats.php 综合流量统计
┃ ┣ friend_link.php 友情链接管理
┃ ┣ gen_goods_script.php 生成显示商品的js代码
┃ ┣ get_password.php 找回管理员密码
┃ ┣ goods.php 商品管理程序
┃ ┣ goods_auto.php
┃ ┣ goods_batch.php 商品批量上传、修改
┃ ┣ goods_booking.php 缺货处理管理程序
┃ ┣ goods_export.php
┃ ┣ goods_type.php 商品类型管理程序
┃ ┣ group_buy.php 管理中心团购商品管理
┃ ┣ guest_stats.php 客户统计
┃ ┣ index.php 控制台首页
┃ ┣ integrate.php 第三方程序会员数据整合插件管理程序
┃ ┣ magazine_list.php
┃ ┣ mail_template.php 管理中心模版管理程序
┃ ┣ message.php 管理中心管理员留言程序
┃ ┣ navigator.php
┃ ┣ order.php 订单管理
┃ ┣ order_stats.php 订单统计
┃ ┣ pack.php 包装管理程序
┃ ┣ payment.php 支付方式管理程序
┃ ┣ picture_batch.php 图片批量处理程序
┃ ┣ privilege.php 管理员信息以及权限管理程序
┃ ┣ sale_general.php 销售概况
┃ ┣ sale_list.php 销售明细列表程序
┃ ┣ sale_order.php 商品销售排行
┃ ┣ searchengine_stats.php 搜索引擎关键字统计
┃ ┣ search_log.php
┃ ┣ shipping.php 配送方式管理程序
┃ ┣ shipping_area.php 配送区域管理程序
┃ ┣ shophelp.php 帮助信息管理程序
┃ ┣ shopinfo.php 网店信息管理页面
┃ ┣ shop_config.php 管理中心商店设置
┃ ┣ sitemap.php 站点地图生成程序
┃ ┣ sms.php 短信模块 之 控制器
┃ ┣ snatch.php 夺宝奇兵管理程序
┃ ┣ sql.php sql管理程序
┃ ┣ tag_manage.php 后台标签管理
┃ ┣ template.php 管理中心模版管理程序
┃ ┣ topic.php 专题管理
┃ ┣ users.php 会员管理程序
┃ ┣ users_order.php 会员排行统计程序
┃ ┣ user_account.php 会员帐目管理(包括预付款,余额)
┃ ┣ user_msg.php 客户留言
┃ ┣ user_rank.php 会员等级管理程序
┃ ┣ view_sendlist.php
┃ ┣ virtual_card.php 虚拟卡商品管理程序
┃ ┣ visit_sold.php 访问购买比例
┃ ┣ vote.php 调查管理程序
┃ ┣ wholesale.php 管理中心批发管理
┃ ┣ help 的目录 后台操作帮助文件
┃ ┣ images 的目录
┃ ┣ includes 的目录
┃ ┃ ┣ cls_exchange.php 后台自动操作数据库的类文件
┃ ┃ ┣ cls_google_sitemap.php Google sitemap 类
┃ ┃ ┣ cls_phpzip.php ZIP 处理类
┃ ┃ ┣ cls_sql_dump.php 数据库导出类
┃ ┃ ┣ inc_menu.php 管理中心菜单数组
┃ ┃ ┣ init.php 管理中心公用文件
┃ ┃ ┣ lib_goods.php 管理中心商品相关函数
┃ ┃ ┣ lib_main.php 管理中心公用函数库
┃ ┃ ┗ lib_template.php 管理中心模版相关公用函数库
┃ ┣ styles 的目录
┃ ┣ templates 的目录
┃ ┗ js 的目录
┃ ┣ colorselector.js
┃ ┣ common.js
┃ ┣ listtable.js
┃ ┣ md5.js
┃ ┣ selectzone.js
┃ ┣ tab.js
┃ ┣ todolist.js
┃ ┣ topbar.js
┃ ┗ validator.js 表单验证类
┣ api 的目录
┃ ┣ checkorder.php 检查订单 API
┃ ┣ cron.php
┃ ┗ init.php API 公用初始化文件
┣ cert 的目录
┣ data 的目录
┃ ┣ ffiliate.html
┃ ┣ goods_script.html
┃ ┣ order_print.html
┃ ┣ afficheimg 的目录
┃ ┣ brandlogo 的目录
┃ ┣ captcha 的目录 验证码背景图片存放位置
┃ ┣ cardimg 的目录
┃ ┣ feedbackimg 的目录
┃ ┣ images 的目录
┃ ┣ packimg 的目录
┃ ┗ sqldata 的目录
┣ images 的目录
┃ ┗ upload 的目录
┃ ┣ File 文件上传存放处
┃ ┣ Flash flash上传存放处
┃ ┣ Image 图片上传存放处
┃ ┗ Media 视频上传存放处
┣ includes 的目录
┃ ┣ cls_captcha.php 验证码图片类
┃ ┣ cls_ecshop.php 基础类
┃ ┣ cls_error.php 用户级错误处理类
┃ ┣ cls_iconv.php 字符集转换类
┃ ┣ cls_image.php 后台对上传文件的处理类(实现图片上传,图片缩小, 增加水印)
┃ ┣ cls_json.php JSON 类
┃ ┣ cls_mysql.php MYSQL 公用类库
┃ ┣ cls_rss.php RSS 类
┃ ┣ cls_session.php SESSION 公用类库
┃ ┣ cls_sms.php 短信模块 之 模型(类库)
┃ ┣ cls_smtp.php SMTP 邮件类
┃ ┣ cls_sql_executor.php SQL语句执行类。
┃ ┣ cls_template.php 模版类
┃ ┣ cls_transport.php 服务器之间数据传输器
┃ ┣ inc_constant.php 常量
┃ ┣ init.php 前台公用文件
┃ ┣ lib.debug.php
┃ ┣ lib_article.php 文章及文章分类相关函数库
┃ ┣ lib_clips.php ECSHOP 用户相关函数库
┃ ┣ lib_code.php 加密解密类
┃ ┣ lib_common.php 公用函数库
┃ ┣ lib_goods.php 商品相关函数库
┃ ┣ lib_insert.php 动态内容函数库
┃ ┣ lib_main.php 前台公用函数库
┃ ┣ lib_order.php 购物流程函数库
┃ ┣ lib_passport.php 用户帐号相关函数库
┃ ┣ lib_payment.php 支付接口函数库
┃ ┣ lib_time.php 时间函数
┃ ┣ lib_transaction.php ECSHOP 用户交易相关函数库
┃ ┣ codetable 的目录
┃ ┃ ┣ big5-gb.table
┃ ┃ ┣ big5_utf8.php
┃ ┃ ┣ gb-big5.table
┃ ┃ ┣ gb_utf8.php
┃ ┃ ┗ ipdata.dat
┃ ┣ fckeditor 的目录 fckeditor编辑器目录
┃ ┗ modules 的目录
┃ ┣ convert 的目录
┃ ┃ ┣ shopex46.php vshopex4.6转换程序插件
┃ ┃ ┗ shopex47.php shopex4.7转换程序插件
┃ ┣ cron 的目录
┃ ┃ ┣ auto_manage.php 自动上下架管理
┃ ┃ ┗ ipdel.php 定期删除
┃ ┣ integrates 的目录
┃ ┃ ┣ bmforum.php 会员数据处理类
┃ ┃ ┣ discuz.php
┃ ┃ ┣ discuz55.php
┃ ┃ ┣ dvbbs.php
┃ ┃ ┣ ecshop.php
┃ ┃ ┣ integrate.php
┃ ┃ ┣ ipb.php
┃ ┃ ┣ molyx.php
┃ ┃ ┣ phpbb.php
┃ ┃ ┣ phpwind.php
┃ ┃ ┣ phpwind5.php
┃ ┃ ┗ vbb.php
┃ ┣ payment 的目录
┃ ┃ ┣ alipay.php 支付宝插件
┃ ┃ ┣ balance.php 余额支付插件
┃ ┃ ┣ bank.php 银行汇款(转帐)插件
┃ ┃ ┣ cappay.php 首信易支付插件
┃ ┃ ┣ chinabank.php 网银在线插件
┃ ┃ ┣ cncard.php 云网支付插件
┃ ┃ ┣ cod.php 货到付款插件
┃ ┃ ┣ ctopay.php Ctopay 支付插件
┃ ┃ ┣ express.php express支付系统插件
┃ ┃ ┣ ips.php ips支付系统插件
┃ ┃ ┣ kuaiqian.php 快钱插件
┃ ┃ ┣ nps.php NPS支付插件
┃ ┃ ┣ pay800.php 800pay 支付宝插件
┃ ┃ ┣ paypal.php 贝宝插件
┃ ┃ ┣ paypalcn.php 贝宝中国插件
┃ ┃ ┣ post.php 邮局汇款插件
┃ ┃ ┣ tenpay.php 财付通插件
┃ ┃ ┣ udpay.php 网汇通插件
┃ ┃ ┣ xpay.php 易付通插件
┃ ┃ ┗ yeepay.php YeePay易宝插件
┃ ┗ shipping 的目录
┃ ┣ cac.php 上门取货插件
┃ ┣ city_express.php 城际快递插件
┃ ┣ ems.php EMS插件
┃ ┣ flat.php 邮政包裹插件
┃ ┣ fpd.php 到付运费插件
┃ ┣ post_express.php 邮政包裹插件
┃ ┣ post_mail.php 邮局平邮插件
┃ ┣ presswork.php 挂号印刷品插件
┃ ┣ sf_express.php 顺丰速运 配送方式插件
┃ ┣ sto_express.php 申通快递 配送方式插件
┃ ┣ yto.php 圆通速递插件
┃ ┗ zto.php 中通速递插件
┣ install 的目录 安装文件目录
┣ js 的目录
┃ ┣ auto_complete.js
┃ ┣ calendar.php
┃ ┣ common.js
┃ ┣ compare.js
┃ ┣ global.js
┃ ┣ lefttime.js
┃ ┣ myship.js
┃ ┣ region.js
┃ ┣ shopping_flow.js
┃ ┣ transport.js
┃ ┣ user.js
┃ ┣ utils.js
┃ ┗ calendar 的目录
┣ languages 的目录 语言风格文件
┃ ┣ zh_cn 的目录
┃ ┃ ┣
┃ ┃ ┣ admin 的目录
┃ ┃ ┣ convert 的目录
┃ ┃ ┣ cron 的目录
┃ ┃ ┣ payment 的目录
┃ ┃ ┗ shipping 的目录
┃ ┗ zh_tw 的目录
┃ ┣ admin 的目录
┃ ┣ convert 的目录
┃ ┣ cron 的目录
┃ ┣ payment 的目录
┃ ┗ shipping 的目录
┣ plugins 的目录
┣ templates 的目录
┃ ┣ backup 的目录
┃ ┃ ┗ ibrary 的目录
┃ ┣ caches 的目录
┃ ┗ compiled 的目录
┃ ┗ admin 的目录
┣ themes 的目录
┃ ┣ default 的目录
┃ ┃ ┣ images 的目录
┃ ┃ ┗ library 的目录
┃ ┗ sport 的目录
┣ wap 的目录
┃ ┣ article.php
┃ ┣ brands.php
┃ ┣ buy.php
┃ ┣ category.php
┃ ┣ comment.php
┃ ┣ goods.php
┃ ┣ goods_list.php
┃ ┣ index.php
┃ ┣ user.php
┃ ┣ includes 的目录
┃ ┃ ┣ init.php
┃ ┃ ┣ lib_main.php
┃ ┗ templates 的目录
┃ ┣ article.wml
┃ ┣ article_list.wml
┃ ┣ brands.wml
┃ ┣ buy.wml
┃ ┣ category.wml
┃ ┣ comment.wml
┃ ┣ goods.wml
┃ ┣ goods_img.wml
┃ ┣ goods_list.wml
┃ ┣ index.wml
┃ ┣ login.wml
┃ ┣ order_list.wml
┃ ┗ user.wml
┗ widget 的目录
┣ blog_sohu.php
┣ blog_sohu.xhtml
┗ images 的目录