创建
我们的模块虽然已经安装,但仍未能访问,因为我们还没创建这个模块的控制器。换言之,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就不需要写过多的数据处理了。本来,也不推荐如上面代码的写法,只是为了演示方便。
现在我们还不能运行,因为还没创建视图,请接着看下一篇,创建视图。