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地址

















