诗意的边缘
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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页面