我们看完模板了,回到查询。
看看归档是如何实现的。
归档,故名思议就是按照月份,将你的博文分类在一块显示。
先看搜索。
归档对应的url 为 /year/month
这个是通过空模块空方法路由过去的。
![2015-06-30/5592b848418e9](http://box.kancloud.cn/2015-06-30_5592b848418e9.png)
然后archive 归档方法:
~~~
//归档
public function archive($year, $month){
$_GET['month'] = $month;
$_GET['year'] = $year;
$this->assign('title', "{$year}年{$month}月的文章");
$this->assign('year', $year);
$this->assign('month', $month);
$this->lists(I('get.page', 1));
$this->display('Index/index');
}
~~~
参数绑定后,定义了标题,赋值了year和month模板变量。
实际上还是走的lists方法。
而lists方法里 在之前deadline参数前面 有这么一段:
~~~
//归档搜索
if(isset($_GET['year']) && isset($_GET['month'])){
$year = CONTROLLER_NAME;
$month = ACTION_NAME;
$map['_string'] = "`deadline` LIKE binary('{$year}-{$month}%')";
}
~~~
就是当有归档时间参数时,直接这样查询 like查询,因为我们的deadlien 是datetime 格式的,显示时是2015-06-11 h:i:s 这种格式的,所以可以直接like。
注意:mysql 5.5 以上版本 日期格式字符串 like 要这样写才不会报错。
查询结束后,我们需要把所有文章的归档日期组装出来。
~~~
//获取归档
$list = $postModel->where($map)->order('`deadline` DESC,`id` DESC')->select();
$date = $time = array();
foreach ($list as $key => $value) {
if($value['deadline'])
$time[] = date('F Y', strtotime($value['deadline']));
}
$time = array_unique($time);
foreach ($time as $key => $value) {
$date[] = array(
'text'=> $value,
'link'=> date('Y/m', strtotime($value))
);
}
$this->assign('archive', $date);
~~~
这边先这种方式获取。
这里有两个优化点:
1. 查询归档时查询所有字段,当数据量大时,内存占用多,应该只查deadline字段;
2. 像标签和归档这些可以做一个缓存,当有数据删除或者新增时重新更新缓存,不过这个要看读写频次比了。
前台显示,和标签一样就是遍历显示了:
~~~
<div class="sidebar-module">
<h4>归档</h4>
<ol class="list-unstyled">
<volist name="archive" id="vo">
<li><a href="{:U($vo['link'])}">{$vo.text}</a></li>
</volist>
</ol>
</div>
~~~
- 序
- 前言
- 内容简介
- 目录
- 基础知识
- 起步
- 控制器
- 模型
- 模板
- 命名空间
- 进阶知识
- 路由
- 配置
- 缓存
- 权限
- 扩展
- 国际化
- 安全
- 单元测试
- 拿来主义
- 调试方法
- 调试的步骤
- 调试工具
- 显示trace信息
- 开启调试和关闭调试的区别
- netbeans+xdebug
- Socketlog
- PHP常见错误
- 小黄鸭调试法,每个程序员都要知道的
- 应用场景
- 第三方登录
- 图片处理
- 博客
- SAE
- REST实践
- Cli
- ajax分页
- barcode条形码
- excel
- 发邮件
- 汉字转全拼和首字母,支持带声调
- 中文分词
- 浏览器useragent解析
- freelog项目实战
- 需求分析
- 数据库设计
- 编码实践
- 前端实现
- rest接口
- 文章发布
- 文件上传
- 视频播放
- 音乐播放
- 图片幻灯片展示
- 注册和登录
- 个人资料更新
- 第三方登录的使用
- 后台
- 微信的开发
- 首页及个人主页
- 列表
- 归档
- 搜索
- 分页
- 总结经验
- 自我提升
- 进行小项目的锻炼
- 对现有轮子的重构和移植
- 写技术博客
- 制作视频教程
- 学习PHP的知识和新特性
- 和同行直接沟通、交流
- 学好英语,走向国际
- 如何参与
- 浏览官网和极思维还有看云
- 回答ThinkPHP新手的问题
- 尝试发现ThinkPHP的bug,告诉官方人员或者push request
- 开发能提高效率的ThinkPHP工具
- 尝试翻译官方文档
- 帮新手入门
- 创造基于ThinkPHP的产品,进行连带推广
- 展望未来
- OneThink
- ThinkPHP4
- 附录