创建控制器

admin 发表于 2018-05-14 18:44 上一篇 下一篇

首页 > 技术文档 > 开发一个模块

创建控制器
发表于 2018-05-14 18:44

创建

我们的模块虽然已经安装,但仍未能访问,因为我们还没创建这个模块的控制器。换言之,URL的第二部份还没有指定。

默认的控制器是default,但有时候我们并不想用这个名字,因此我们可以不创建这个控制器。我们用list替代默认的控制器。

在 controllers 文件夹里创建 ListController.php 控制器文件。写好一个默认的动作index。代码如下:

注意:类名的规则是要和文件名一致。因为IBOS3.0采用了命名空间的特性,所以要注意声明命名空间,并引入Controller全局组件。

ListController.php

nanamespace application\modules\messageboard\controllers;
use application\core\controllers\Controller;
use application\modules\messageboard\model\MessageBoard;
use application\modules\messageboard\utils\PageUtil;
class ListController extends Controller {
    /**
     * 列表页
     * @return void 
     */
    public function actionIndex() {
    }
}

所有的控制器都必须继承于或间接继承于Controller全局组件。

所有的公开可访问的动作都必须加action前缀

动作名首字大写。类名使用驼峰法。详细参见 编码规范

开始编写

接下来我们需要在utisl文件中创建一个PageUtil工具类,这个工具类主要是获得分页对象。

<?php

namespace application\modules\messageboard\utils\PageUtil;

use application\core\utils\Ibos;
use CDbCriteria;
use CPagination;

class PageUtil {

    private static $_offset = 0;
    private static $_limit = 10;

    public static function getPage($count, $pageSize = null) {
        $pages = new CPagination(intval($count));
        $pageSize = is_null($pageSize) ? Ibos::app()->params['basePerPage'] : $pageSize;
        $pages->setPageSize(intval($pageSize));
        self::$_offset = $pages->getOffset();
        self::$_limit = $pages->getLimit();
        $criteria = new CDbCriteria(array(
            'limit' => self::$_limit,
            'offset' => self::$_offset));
        $pages->applyLimit($criteria);
        return $pages;
    }

    public static function getOffset() {
        return self::$_offset;
    }

    public static function getLimit() {
        return self::$_limit;
    }

}

既然控制器是列表,那么这个列表的索引动作(index)要做些什么?

当然是索引留言的内容了。那么我们的index方法里便有如下逻辑:

public function actionIndex() {
    // 创建一个查询标准
    $criteria = array(
        'order' => 'time DESC',
        'condition' => 'status > 0'
    );
    // 获取留言条数
    $count = MessageBoard::model()->count( $criteria );
    // 调用分页组件
    $pages = PageUtil::getPage( $count );
    $criteria['limit'] = $pages->getLimit();
    $criteria['offset'] = $pages->getOffset();
    $data = array(
        'page' => $pages,
        'list' => MessageBoard::model()->fetchAll( $criteria ) // 查询数据
    );
    $this->setPageTitle( '留言版' );
    $this->setPageState( 'breadCrumbs', array(
        array( 'name' => '测试' ),
        array( 'name' => '留言板', 'url' => $this->createUrl( 'messageboard/list' ) ),
    ) );
    $this->render( 'index', $data );
}

这段代码的功能是:获取分页对象,查询以发表时间排序,条件为正常的留言,最后将分页对象与查询得到的列表数据赋值给一个数组,渲染视图输出(视图index里就可以直接调用$page对象及$list数组了)。

我们可以看到数据层的用法非常简单:静态调用该类的Model方法实例化该数据层的AR对象,即可以调用AR本身提供的方法或该数据层的扩展方法。

上例的count,fetchAll便是AR原生的方法。我们也可以在数据层把index方法里的处理写好,然后直接调用即可。

例如我们可以在MessageBoard.php里增加一个getList的方法,把创建数据对象与查询分页的处理写进去,这样index就不需要写过多的数据处理了。本来,也不推荐如上面代码的写法,只是为了演示方便。


现在我们还不能运行,因为还没创建视图,请接着看下一篇,创建视图。

以上信息是否对您有帮助?
0.0388s