文网站建设快站建站
Thinkphp框架
- 二级导航分类,模板继承,内置标签
 - Public 修改
 - MVC模块化 ——访问机制
 - 传参
 - 加载模版
 - 模版引入 分离
 - Runtime 缓存文件
 - 管理员添加
 - 数据验证及验证场景 控制器 validate
 
- 在sql执行(敏感操作)之前验证
 - 数据模板 分页
 - 数据表连接查询
 - TP 关联查询
 - -----------------
 
- 由于是3.2 版本的教程 后面会结合5.0版本进行改进 - 主要记录思路
 - 无限分类模块实现
 - 商品模块 设计
 - Session
 - 控制器初始化
 - 模板布局
 - 模板赋值
 - 请求与响应
 - 响应
 
- url及路由
 - url和路由
 

 
二级导航分类,模板继承,内置标签
模板继承

 {block name="title"}<title>网站标题</title>{/block}
 

 {block name="title"}<title>{$web_title}</title>{/block}
 

{block name="include"}{include file="Public:header" /}{/block}
 

 <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>{block name="title"}标题{/block}</title> </head> <body> {block name="menu"}菜单{/block}{block name="left"}左边分栏{/block} {block name="main"}主内容{/block} {block name="right"}右边分栏{/block}{block name="footer"}底部{/block} </body> 
</html>
 

 {extend name="base" /} {block name="title"}{$title}{/block}
 
{block name="menu"}<a href="/" >首页</a><a href="/info/" >资讯</a> <a href="/bbs/" >论坛</a> 
{/block} 
{block name="left"}
{/block} {block name="main"} 
{volist name="list" id="vo"}<a href="/new/{$vo.id}">{$vo.title}</a><br/> {$vo.content}{/volist} {/block} {block name="right"}最新资讯: {volist name="news" id="new"}<a href="/new/{$new.id}">{$new.title}</a><br/> {/volist}{/block} {block name="footer"} {__block__} @ThinkPHP 版权所有 {/block}
 

 {block name="footer"} {__block__}@ThinkPHP 版权所有 {/block}
 

 {extend name="Public:base" /}
 

 {extend name="./Template/Public/base.html" /}
 

 {block name="title"}<title>{$title}</title>{/block} <a href="/" >首页</a><a href="/info/" >资讯</a> <a href="/bbs/" >论坛</a>
 

内置标签
 
 
 
 循环输出标签
 
 $list = User::all(); $this->assign('list',$list);
 

 {volist name="list" id="vo"}{$vo.id}:{$vo.name}<br/>{/volist}
 

 {volist name="list" id="data"} {$data.id}:{$data.name}<br/> {/volist}
 

 {volist name="list" id="vo" offset="5" length='10'} {$vo.name}{/volist}
 

 {volist name="list" id="vo" mod="2" } {eq name="mod" value="1"}{$vo.name}{/eq} {/volist}
 

 {volist name="list" id="vo" mod="5" }{$vo.name} {eq name="mod" value="4"}<br/>{/eq}{/volist}
 

 {volist name="list" id="vo" empty="暂时没有数据" } {$vo.id}|{$vo.name} {/volist}
 

 $this->assign('empty','<span class="empty">没有数据</span>'); $this->assign('list',$list);
 

 {volist name="list" id="vo" empty="$empty" } {$vo.id}|{$vo.name} {/volist}
 

 {volist name="list" id="vo" key="k" } {$k}.{$vo.name} {/volist}
 

 {volist name="list" id="vo" } {$i}.{$vo.name} {/volist}
 

 {volist name="list" id="vo" }{$key}.{$vo.name} {/volist}
 

 {volist name=":fun('arg')" id="vo"} 
{$vo.name} 
{/volist}
 
FOREACH标签

 {foreach $list as $vo} {$vo.id}:{$vo.name} {/foreach}
 

 {foreach name="list" item="vo"}{$vo.id}:{$vo.name}{/foreach}
 

 {foreach name="list" item="vo" } {$key}|{$vo} {/foreach}
 

 {foreach name="list" item="vo" key="k" } {$k}|{$vo} {/foreach}
 
FOR标签
 {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" } {/for}
 

 {for start="1" end="100"} {$i} {/for}
 
 for ($i=1;$i<100;$i+=1){echo $i; }
 
比较标签
 
 {比较标签 name="变量" value="值"}内容{/比较标签}
 

 
 {eq name="name" value="value"}value{/eq}
 
{equal name="name" value="value"}
value
{/equal}
 

 {eq name="name" value="value"} 相等{else/}不相等{/eq}
 

 {gt name="name" value="5"}value{/gt}
 

 {egt name="name" value="5"}value{/egt}
 

 {eq name="vo.name" value="5"}{$vo.name}{/eq}
 

 {eq name="vo:name" value="5"} {$vo.name} {/eq}
 

 {eq name="vo['name']" value="5"} {$vo.name}{/eq}
 

{eq name="vo:name|strlen" value="5"}{$vo.name}{/eq}
 

 {eq name="Think.get.name" value="value"}相等{else/}不相等{/eq}
 

 {eq name="vo:name" value="$a"}{$vo.name}{/eq}
 

 {compare name="name" value="5" type="eq"}value{/compare}
 

 {eq name="name" value="5" }value{/eq}
 

条件判断
SWITCH标签
 {switch name="变量" }{case value="值1" break="0或1"}输出内容1{/case} {case value="值2"}输出内容2{/case} {default /}默认情况{/switch}
 

 {switch name="User.level"} {case value="1"}value1{/case} {case value="2"}value2{/case} {default /}default {/switch}
 

 {switch name="Think.get.userId|abs"} {case value="1"}admin{/case} {default /}default {/switch}
 

 {switch name="Think.get.type"}{case value="gif|png|jpg"}图像格式{/case} {default /}其他格式 {/switch}
 

 {switch name="Think.get.userId|abs"} {case value="1" break="0"}admin{/case}{case value="2"}admin{/case}{default /}default{/switch}
 

 {switch name="User.userId"} {case value="$adminId"}admin{/case} {case value="$memberId"}member{/case}{default /}default {/switch}
 

 
 {switch $User.userId}{case $adminId}admin{/case}{case $memberId}member{/case} {/switch}
 
IF标签
 {if condition="($name == 1) OR ($name > 100) "} value1 {elseif condition="$name eq 2"/}value2 {else /} value3{/if}
 

 {if condition="strtoupper($user['name']) neq 'THINKPHP'"}ThinkPHP {else /}other Framework {/if}
 

 {if condition="$user.name neq 'ThinkPHP'"}ThinkPHP {else /} other Framework{/if}
 

{if condition="$user:name neq 'ThinkPHP'"}
ThinkPHP
{else /} 
other Framework{/if} 

 {if condition="表达式"} {if (表达式)} {if 表达式} 

 IN和NOTIN

 $id = 1; $this->assign('id',$id);
 

 {in name="id" value="1,2,3"} id在范围内 {/in}
 

 {notin name="id" value="1,2,3"}id不在范围内 {/notin}
 

 {in name="id" value="1,2,3"} id在范围内 {else/} id不在范围内 {/in}
 

 {in name="Think.get.id" value="1,2,3"} $_GET['id'] 在范围内{/in} 

 
 {in name="id" value="$range"}id在范围内 {/in}
 

 {in name="id" value="$Think.post.ids"} id在范围内 {/in}
 
BETWEEN 和 NOTBETWEEN
 
 {between name="id" value="1,10"} 输出内容1{/between}
 

 {notbetween name="id" value="1,10"}输出内容2{/notbetween}
 

 {between name="id" value="1,10"} 输出内容1 {else/} 输出内容2{/between}
 

 {between name="id" value="1,3,10"} 输出内容1 {/between}
 

 {between name="id" value="A,Z"} 输出内容1 {/between}
 

 {between name="Think.post.id" value="1,5"} 输出内容1{/between}
 

 {between name="id" value="$range"}输出内容1 {/between}
 

 {between name="id" value="$Think.get.range"} 输出内容1{/between}
 
RANGE

 {range name="id" value="1,2,3" type="in"} 输出内容1 {/range}
 

 PRESENT NOTPRESENT标签
 
 {present name="name"} name已经赋值 {/present}
 

 {notpresent name="name"} name还没有赋值 {/notpresent}
 

 {present name="name"}name已经赋值 {else /} name还没有赋值{/present}
 

 {present name="Think.get.name"}$_GET['name']已经赋值 {/present}
 
EMPTY NOTEMPTY 标签

 {empty name="name"} name为空值 {/empty}
 

 {notempty name="name"} name不为空 {/notempty}
 

 {empty name="name"} name为空{else /}name不为空 {/empty}
 

{empty name="Think.get.name"} $_GET['name']为空值 {/empty}
 
DEFINED 标签

 {defined name="NAME"} NAME常量已经定义 {/defined}
 

 
 {notdefined name="NAME"} NAME常量未定义 {/notdefined}
 

 {defined name="NAME"} NAME常量已经定义 {else /} NAME常量未定义{/defined}
 

Public 修改
- 入口文件位置
 


- tp3---->tp5根路径
 - tp5 —>public文件夹内

 - 入口重定向
域名 重定向
更改网站目录到public—>访问index
hosts配置 


MVC模块化 ——访问机制
application 应用模块 eg: index admin
模块里面 controller 控制器
 
- 访问非索引方法 ——自己写模块



 
传参


加载模版


- 没有 找到 方法fetch



 - 引入空间/引入空间类元素
 

- 继承(类用类方法)用限定方法引入类也可以
 - 使用引入空间 再继承相关类也可以



 - 限定模版名称


 
模版引入 分离




-  
复制模版进入
 -  
输出替换 --配置模版路径 tp3–>;


 -  
总config 和 分config之分

 -  
模版替换


 -  
拼装路径
 

- 静态文件 css images js



 



- 模版分离(公共文件)




 
Runtime 缓存文件
管理员添加




- 提交到 本文件下 即:list

 - 打印测试 与tp3.2 不同
 





 静态方法 —insert插入传出值

- 引入类







 - 添加一条数据


 - 批量添加 返回成功数据量
 
数据验证及验证场景 控制器 validate

-  
后端验证 3.2字段验证 5.0以后变化很大
 -  
validate创建验证文件




 -  
控制器 validate
实例化 验证类
数组 验证字段/规则
传入验证字段
执行 验证策略
Dump 执行结果 
在sql执行(敏感操作)之前验证

 
 
 
- 也可以引入 继承
 

- 打印调试验证规则
 - 创建 拦截器文件
 

- 注意TP的namespace的根命名空间
 

 
 
 

 
 
 
 
 



- 一个元素就是一个验证场景


 
数据模板 分页
-  
获取数据



 -  
创建model



 -  
分配到模板当中 名字/值
 -  
循环输出 分配过来的数组数据


 -  
空间类元素引入
 -  
完全限定名称





 -  
分页


 -  
排序 默认升序
 





- 查询数据 一维二维数组的区别



 - 调试查询功能结果



 

-  
修改数据 需要主键——判断哪一条数据
 -  
隐藏域 数据表主键


 -  
dump 一下 调试




 -  
数组传值

 -  
密码为空 不修改




 -  
验证 拦截器功能

 

- 数组传值

 - 看一下传值




 - 查看是否解析 (还是用数组写法)
 - 初始化管理员 不可动摇

 - 助手函数 (不用引用类了) 准备好那个id
 - 写入组件/where


 - 执行成功 跳回当前控制器





 - 条件判断 来隐藏初始化管理员

 

 


- 模型—>引入类 使用静态方法


 - 伪静态 .html可以不带










 


 











- id以隐藏于submit
 

 
- 控制器首字母要大写
 

 
 
 
 
 
 
 

 

- 唯一性验证


 

 
 

 

 



- 还是这样 重复造轮子 把上面的文档 复制 更改增加就行



 - 根据策划 数据库 来写拼搭前端页面







 - res 二维数组


 
- 前端 form 表单name 对应 数据库表单
 




























 - 调试 打印 上传图片信息


 - 调试 上传结果


 - 拼装路径





 
- 关联查询

 
数据表连接查询

- 生成sql查询 -->返回二维数组 ---->分配到模板
 
TP 关联查询



 

- 主 从表关系 相对关联关系

 - 关联好了 取数据





 
-  
文章修改


 -  
编辑





 

-  
Ctrl + F5



 -  
隐藏域标记



 -  
这里调整 删除路径的





 
- 验证码类 管理登录逻辑
TP 拓展类 (下一个完整版)- composer/官网
 
 













 




- model 模型 处理数据


 - 验证完 就执行



 - 登陆跳转

 - 写入session











 - 清除 session





 - 验证码配置放在公用 config内

 - 样式对齐

 - 字符提取 重置 点击刷新


 - 验证验证码




 

- 复用功能代码 拆分 到public 控制器

 - 代码继承

 - base class 继承Controller 且 公用base 已经继承 think本身controller
 

- 科学权限认证 公用机制
 
- 前端页面调用

前端后台控制器 变量接收 获得数据库 二维数组数据 写入模板
并 排序 

- 导航 链接 跳转 传参-当前栏目id

 - 伪静态

 - 加载模板

 - header 加载导航变量 引导页面
也要 添加需要的数据 -助手函数很方便(不用引用类) 

-  
其他页面 的操作方法
分配页面数据
- 控制器复用 直接继承
构造初始化方法 调试

 -  
继承

 -  
前端 base 复用方法
 


- 根据id 查询并分页

 - 数据 循环显示



 - 更改分页 查询


 - 调整样式
 



 
- 跳转到 文章页 分配



 - 内容补全



 - 时间戳变换

 

 

 
- 推荐 数据 查找 分配

 

 

- 首页 数据 分配
 

 
 
 
- 右侧栏 拆分
 

 
 
 
 

- 有一些图片 链接地址 更改
 
- 标签 关键字 字符替换


 - 保证写进数据库 的是 英文“ ,” 分割方便

 

- 相关文章调用



 - 数组合并

 - 重复 匹配了 处理


 - 去掉 数组里的 重复


 - 打印调试


 - 去重 数组变换



 
- 搜索功能 及分页
 



 
 
 
 
- input 数据 查询 分配到模板




 - 载入模板
 

 
-  
关键词 匹配逻辑 完整性


 -  
分页


 -  
model 处理分页查询问题


 -  
标签 也联系搜索

 
- 传参问题处理

 

-  
关键词 加亮

 -  
后台 tag管理

数组拆分 数据调用

 


 
 
 
 
-  
控制器







 -  
公用base 设定





类似于这种MVC架构的
可以写博客 CMS 或者公司宣传官网都可以 
-----------------
由于是3.2 版本的教程 后面会结合5.0版本进行改进 - 主要记录思路


- 环境搭建
 - SVN服务器 版本控制
 - 服务器端VisualSVN 客户端 TortoiseSVN



 - 导入账号
 

- 前后台分离 操作同一个数据库
 - 创建一个WWW下的网站地址 存放源码


 - 工作拷贝



 - 复制 后台框架

 - 配置前后台 apache虚拟命名

 

- 前后台模板搭建





 - 单独后台




 - 无限分类模块设计






 - 测试数据库

 - 遍历表中内容select






 
无限分类模块实现
- 字段排序
 - sql连接函数 取别名
 - 结果遍历
 

 调试一下
 
-  
取值 重新命名
再调试







 -  
添加 前台提交
 -  
添加方法





- 数据库操作



 
 - 数据库操作
 -  
AJAX 无限分类


 -  
js写的


 -  
通过AJAX到数据库 取值



 -  
public 取数据 需要的字段 返回数组
变为json对象格式

 -  
传过去Id


 -  
信息传回 ajax
后台 删除方法


 
商品模块 设计

 


 

 

-  
图片上传 异步处理
 -  
添加商品

 -  
测试数据


 -  
准备模板

 
Session


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
控制器初始化


 
 
模板布局

 
 
 
 
 
 
 
 
 
 


模板赋值

 
 
 
 
请求与响应

























 

响应





 







url及路由

url和路由


 

-  
参数调用




 -  
命名规范



 
 















 -  
定义路由


- 路由 + 传参
SEO不友好 搜索引擎收录不到 抓不到三层

比较友好 收录

 
 - 路由 + 传参
 -  
定义路由

























 



 -  
生成Url地址


















 
