TP3.2博客开发遇到的坑
前言
鲁迅说过:“地上本来没有路,走的人多了,也便成了路”。作为程序猿也一样,开发之路走多了,当然遇到的坑也是多起来呀。
视图模型&&foreach循环解决文章列表页
上一篇博文基于 TP3.2 的个人博客开发中讲到了几个难点(对于我这个小白来说是个难点,对于大佬来说就是小菜一碟)。
第一种方法---TP3.2中的视图模型,这个可以解决文章列表页面中的分类、评论、以及评论列表页面的文章标题,下面来详细说说解决的方法(就拿文章列表页面来说吧);
当初我新建一篇文章时是直接将分类、标签的
ID
值存入数据库中的,为什么要怎么做?据说这样比 较高大上。
视图模型的方法解决
首先我们需要在Model
层中创建ArticleViewModel.class.php
文件,然后在对应的控制器中(ArticleController.class.php
)实例化ArticleViewModel
对象,而不是Article
对象。<?php namespace Admin\Model; use Think\Model\ViewModel; class ArticleViewModel extends ViewModel { public $viewFields = array( 'Article' =>array('*','_type'=>'LEFT'), 'Category'=>array('name'=>'cname', '_on'=>'Article.category=Category.id'), ); }
通过
_on
来给视图模型定义关联查询条件,Article.category
为文章数据库中存该篇文章的的标签ID
,而Category.id
即为标签数据库中的标签ID
值。cname
就是为分配给模板的变量值。第二种方法---利用传统的
foreach
循环,虽然这种方法比较笨,但是它灵活性高,适用于各种比较复杂的项目中。这里就拿标签来做例子吧~~~~
首先,我将标签存入数据库中是用数组的形式来存储的,因此第一步我们必须先要用
foreach
遍历,然后用php自带explode
函数将,
除去,再对其循环查找Label
数据库中对应的值,再一步是又将每一篇文章的标签转成带,
形式的值,最后不用说就是将其转成数轴,方便模板中循环输出。$list = $article->order('id')->limit($Page->firstRow.','.$Page->listRows)->select(); $label = D('label'); foreach($list as $value){ $l = explode(',' ,$value['label']); $a = array(); $b = array(); foreach ($l as $key => $v){ $a[] = $label->id($v); $b[] = $a[$key]['name']; } $c[] = implode(", ",$b); }
$list
是文章数据库查询出来的所有值,$c[]
即为分配到模板的标签值。
in_array函数解决文章编辑页中标签
in_array
方法解决in_array()
函数搜索数组中是否存在指定的值,通过循环原来整个标签的值,用每一个标签的值跟文章数据库中的标签比对,看是否存在有该值。<foreach name="label" item="c"> <input name="label[]" type="checkbox" value="{$c.id}" <if condition="in_array($c['id'],$ldata)">checked='checked'</if> >{$c.name} </foreach>
$ldata
即为文章数据库中存储的标签的值得数轴。
利用volist同时循环两个数轴
在解决文章列表页时,我们在用第二种方法时出现两个数轴分配到模板中,那我们该如何解决?foreach?
不不不,应该用volist
,因为这个比foreach
强大,加了一个键值,因此我们可以完美解决这个困难。
<volist name="list" id="b" key = "k">
<tr>
<td><input type="checkbox" class="input-control" name="checkbox[]" value="" /></td>
<td class="article-title">{$b.title}</td>
<td>{$b.cname}</td>
<td class="hidden-sm">{$c[$k-1]}</td>
<td class="hidden-sm">{$b.commentnums}</td>
<td><?php echo date('Y-m-d H:i:s',$b['time']); ?></td>
<td>
<a href="__CONTROLLER__/updatearticle/id/{$b['id']}">修改</a>
<a href="__CONTROLLER__/delarticle/id/{$b['id']}" onclick="return confirm('确认删除')" >删除</a>
</td>
</tr>
</volist>
list
,c
为控制器中分配过来的,我们应该重点看
<td class="hidden-sm">{$c[$k-1]}</td>
这一句,这就是我们解决问题的关键。