
4.3 显示一个新闻文章列表
上一节我们沿着M→C→V的顺序,根据条件从数据库中查询出一篇文章并在视图页面将之显示了出来。接下来,我们要在该页面继续添加一些内容,显示一个有5篇文章标题的列表。为此,我们将在Page模型中创建一个查询多条数据的方法getPages(Pages是复数形式,表明这个方法将得到多条数据),在NewsController控制器中使用该方法获取数据,然后将数据转换为一个数组对象,抛给视图页面将之循环输出。
我们在开始写代码之前,应在数据库中再插入几条文章数据,过程这里就不再赘述了,请大家自行添加。
4.3.1 扩充Page模型,添加getPages方法
ZF tool有为某一控制器增加方法的命令zf create action,却没有为模型中添加方法的命令,因为模型方法跟视图、测试文件什么的都没关系,直接新写一个方法就可以,不用考虑要同时创建其他文件。请打开application/models/Page.php文件,在getPage方法后增加一个getPages方法。
application/models/Page.php if($row){ return $row; } else{ return null; } } // 获取页面列表 public function getPages($where=array(), $order=null, $limit=null) { $select = $this->select(); if(count($where) > 0){ foreach($where as $key=>$value){ $select->where($key.'=?', $value); } }if( $order){ $select->order($order); } if($limit){ $select->limit($limit); } $result = $this->fetchAll($select); if($result->count() > 0){ return $result; } else{ return null; } } }
getPages方法与getPage方法相比,有一些不同:
● 因为查询的结果大多不止一条,所以除$where参数外,又增加了两个参数。增加了order参数以定义列表排序规则,增加了limit参数来定义获取数据条数。
● 查询采用了fetchAll方法,以查询多条数据,这相当于让哆啦A梦所有的手都去找东西。
4.3.2 扩充News控制器
设置好哆啦A梦的新功能以后,我们回到控制器里,发出新指令:
application/controllers/NewsController.php $modelPage = new Kh_Model_Page(); // 实例化模型对象 $where = array('top'=>1, 'star'=>4); // 定义查询条件 $starNews = $modelPage->getPage($where); // 使用模型的getPage // 方法获取文章 $this->view->starNews = $starNews; // 输出到view视图 // 新闻文章列表 $where_list = array('star'=>4, 'top'=>0); $order = 'createtime DESC'; $limit = 5; $newsList = $modelPage->getPages($where_list, $order, $limit); $this->view->newsList = $newsList; } }
因为方才哆啦A梦已经被召唤出来了,不用再次召唤,只需要把查询条件写好了,一股脑儿给它去执行就是。结果返回后放在$newsList里,交给视图去输出。
下一步丰富news首页视图。
巧妇难为无米之炊,不过视图这次取到的新材料有5份,被包在一起。要把这5份文章一一打开,把它们的标题整齐地摆放在一起,得用循环。打开application/views/scripts/news/index.phtml视图文件,在尾部添加以下代码:
application/views/scripts/news/index.phtml <?php echo "<h3>".$this->starNews->title."</h3>"; echo $this->starNews->body; if ($this->newsList){ echo "<ul>"; foreach($this->newsList as $newsList){ echo "<li>".$newsList['title']."</li>"; } echo "<ul>"; } ?>
刷新页面,5篇文章被排成列表,整齐地放在那里了。搞定交工!
4.3.3 使用partialLoop助手输出循环
但是且慢!这里有个新轮子!代替在视图中使用foreach输出循环的另一个好办法是使用视图助手partialLoop。使用partialLoop的感觉,就像使用魔法传送门:你把一个数组对象扔进去,它会在另一个地方出现,而且如你所愿,按你在HTML里希望的样子自行循环出来!
看看怎么来用这个传送门吧!将刚才的news/index.phtml修改一下:
application/views/scripts/news/index.phtml <?php echo "<h3>".$this->starNews->title."</h3>"; echo $this->starNews->body; if ($this->newsList){ echo "<ul class = 'listNews'>"; echo $this->partialLoop('partials/row-pages.phtml', $this-> newsList); echo "</ul>"; }
$this->partialLoop('partials/row-pages.phtml', $this->newsList) 就 是 传 送 门 了,把$this->newsList对象扔进去,partials/row-pages.phtml就是它变身出来的地方。在views/scripts目录下新建partials文件夹,在其中新建row-pages.phtml文件,输入以下代码:
application/views/scripts/partials/row-pages.phtml <li> <a href = "/page/detail/id/<?php echo $this->id; ?>"><?php ech$this->title; ?></a> <span>发布时间:<?php echo date('Y-m-d', $this->createtime); ?></span> </li>
这几乎是纯HTML代码,PHP只是输出一些内容,这里$this指针是谁?谁被扔进来,它就是谁,只要你有id、有title、有createtime,那我就把它们照单输出。是不是非常直观?而且这一新闻列表页面是可重用的,我们随后很快会感受到这一方便。
此时页面结果如图4-6所示。

图4-6 更完善的News页面