MENU

TP3.2博客开发遇到的坑

前言

鲁迅说过:“地上本来没有路,走的人多了,也便成了路”。作为程序猿也一样,开发之路走多了,当然遇到的坑也是多起来呀。

视图模型&&foreach循环解决文章列表页

上一篇博文基于 TP3.2 的个人博客开发中讲到了几个难点(对于我这个小白来说是个难点,对于大佬来说就是小菜一碟)。

  • 第一种方法---TP3.2中的视图模型,这个可以解决文章列表页面中的分类评论、以及评论列表页面文章标题,下面来详细说说解决的方法(就拿文章列表页面来说吧);

    当初我新建一篇文章时是直接将分类、标签的ID值存入数据库中的,为什么要怎么做?据说这样比 较高大上。
    13-1

    视图模型的方法解决
    首先我们需要在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>

这一句,这就是我们解决问题的关键。

标签: 博客
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码