1.8. 浏览所有公开的文章

现在,我们已经准备好了一个基本的应用,我们可以开始添加方法和视图代码。我们将从博客的首页开始。

1.8.1 “Index”方法

进入SYSTEM/source/acme/Acme/App/目录,并打开Blog.php文件。(在此示例中,我们使用vim编辑器,你可以选择自己最喜欢的)

$ cd SYSTEM/source/acme/Acme/App/
$ vim Blog.php

在actionIndex() 方法中添加如下代码:

<?php
    public function actionIndex()
    {
        // public blog articles in descending order, all result pages
        $fetch = array(
            'where' => array('blogs.status = ?' => 'public'),
            'order' => 'blogs.created DESC',
            'page'  => 'all',
        );
    
        // fetch all matching records
        $this->list = $this->_model->blogs->fetchAll($fetch);
    }

说明:

  • $fetch 数组定义了一系列查询从句来指明我们所需要的数据。该数组的键不仅包含查询命令的各个部分(cols、 where、join、 group、having、order和 limit),也包含模型的相关参数,例如:page 和 paging 分别表示检索第几页数据和每页显示多少条数据。

  • $this->list 属性的内容是通过调用blogs模型生成的。这样,我们就可以获取所有满足$fetch数组参数的记录。

    [Note]Note

    控制器的公共属性在渲染视图时会自动传递给视图,不需要手动传值。

1.8.2 “Index”视图代码

默认情况下,Solar页面控制器会渲染一个和方法名一致的视图。因此,我们需要为actionIndex()方法创建index.php视图文件。

$ vim Blog/View/index.php
[Note]Note

页面控制器视图继承自父控制器。因此,如果当前页面控制器不存在视图文件便会查找父控制中相同文件名的视图文件。

如果视图文件不为空则清空它,并在文件中输入以下代码:

<?php
    $title = $this->getTextRaw('TITLE_INDEX');
    $this->head()->setTitle($title);
?>

<h2><?php echo $this->getText('HEADING_INDEX'); ?></h2>

<?php if (! $this->list): ?>

    <p><?php echo $this->getText('ERR_NO_RECORDS'); ?></p>

<?php else: ?>

    <ul>
    
    <?php foreach ($this->list as $item): ?>
        <li><?php
            echo $this->escape($item->title);
            echo "&nbsp;&nbsp;";
            echo $this->action(
                "{$this->controller}/read/{$item->id}",
                'ACTION_READ'
            );
        ?></li>
    
    <?php endforeach; ?>
    
    </ul>
<?php endif; ?>

本质上来说,上面这个视图仅仅是取得$this->list的值,并把它显示成无序列表,每个列表项都链接到对应的文章内容页。

  • 页面控制器的公共属性会成为视图对像的属性。例如:视图中的$this->list对应于控制器的$list属性。

  • 页面控制器为默认为你创建一些公共属性(也即视图可用的属性),它们是:$this->controller_class、$this->controller、$this->action、$this->layout和 $this->errors。

  • 那此不以$this开头的变量都是属于视图脚本自己的。这样的话,我们很容易分辩哪些变量来自页面控制器,哪些变量是在视图中创建的。

  • $this->getTextRaw()、$this->head()、$this-getText()、$this->escape() 和 $this->action()属于视图的辅助方法。它们封装了一些在视图中反覆用到的代码。你可以在Solar_View_Helper 和 Solar_View_Helper_Form packages包中查阅所有的视图辅助方法。

  • 这里输出的消息使用全部大写的文本字符串,而不是将消息写死在$this->action()中,目的是为本地化做准备。

你现在可以浏览http://localhost/index.php/blog,并且可以看到所有公开的博客文章的列表。