# 列表行为
### [](https://octobercms.com/docs/backend/lists#extend-list-behavior)扩展列表行为
有时您可能希望修改默认列表行为,并且有几种方法可以执行此操作。
* [覆盖控制器动作](https://octobercms.com/docs/backend/lists#overriding-action)
* [覆盖视图](https://octobercms.com/docs/backend/lists#overriding-views)
* [扩展列定义](https://octobercms.com/docs/backend/lists#extend-list-columns)
* [注入CSS行类](https://octobercms.com/docs/backend/lists#inject-row-class)
* [扩展过滤范围](https://octobercms.com/docs/backend/lists#extend-filter-scopes)
* [扩展模型查询](https://octobercms.com/docs/backend/lists#extend-model-query)
* [自定义列类型](https://octobercms.com/docs/backend/lists#custom-column-types)
### [](https://octobercms.com/docs/backend/lists#overriding-action)覆盖控制器动作
您可以`index`对控制器中的action方法使用自己的逻辑,然后有选择地调用List behavior`index`父方法。
~~~
public function index()
{
//
// Do any custom code here
//
// Call the ListController behavior index() method
$this->asExtension('ListController')->index();
}
~~~
### [](https://octobercms.com/docs/backend/lists#overriding-views)覆盖视图
该`ListController`行为具有一个主容器视图,您可以通过`_list_container.htm`在控制器目录中创建一个特殊文件来覆盖它。以下示例将向边栏添加一个边栏:
~~~
<?php if ($toolbar): ?>
<?= $toolbar->render() ?>
<?php endif ?>
<?php if ($filter): ?>
<?= $filter->render() ?>
<?php endif ?>
<div class="row row-flush">
<div class="col-sm-3">
[Insert sidebar here]
</div>
<div class="col-sm-9 list-with-sidebar">
<?= $list->render() ?>
</div>
</div>
~~~
该行为将调用一个`Lists`小部件,该小部件还包含许多您可以覆盖的视图。通过指定[列表配置选项](https://octobercms.com/docs/backend/lists#configuring-list)`customViewPath`中所述的选项,可以实现此目的。小部件将首先在此路径中查找视图,然后退回到默认位置。[](https://octobercms.com/docs/backend/lists#configuring-list)
~~~
# Custom view path
customViewPath: $/acme/blog/controllers/reviews/list
~~~
> **注意**:例如`list`,最好使用子目录以避免冲突。
例如,要修改列表主体行标记,请`list/_list_body_row.htm`在控制器目录中创建一个名为的文件。
~~~
<tr>
<?php foreach ($columns as $key => $column): ?>
<td><?= $this->getColumnValue($record, $column) ?></td>
<?php endforeach ?>
</tr>
~~~
### [](https://octobercms.com/docs/backend/lists#extend-list-columns)扩展列定义
您可以通过`extendListColumns`在控制器类上调用static方法从外部扩展另一个控制器的列。此方法可以接受两个参数,**$ list**将代表Lists小部件对象,而**$ model则**代表列表使用的模型。以这个控制器为例:
~~~
class Categories extends \Backend\Classes\Controller
{
public $implement = ['Backend.Behaviors.ListController'];
public $listConfig = 'list_config.yaml';
}
~~~
使用该`extendListColumns`方法,可以将多余的列添加到此控制器呈现的任何列表中。检查**$ model**的类型正确是一个好主意。这是一个例子:
~~~
Categories::extendListColumns(function($list, $model)
{
if (!$model instanceof MyModel) {
return;
}
$list->addColumns([
'my_column' => [
'label' => 'My Column'
]
]);
});
~~~
您还可以通过覆盖`listExtendColumns`控制器类内部的方法在内部扩展列表列。
~~~
class Categories extends \Backend\Classes\Controller
{
[...]
public function listExtendColumns($list)
{
$list->addColumns([...]);
}
}
~~~
$ list对象上可以使用以下方法。
| 方法 | 描述 |
| --- | --- |
| **addColumns** | 将新列添加到列表 |
| **removeColumn** | 从列表中删除一列 |
每种方法都采用类似于[列表列配置](https://octobercms.com/docs/backend/lists#list-columns)的列数组。
### [](https://octobercms.com/docs/backend/lists#inject-row-class)注入CSS行类
您可以通过`listInjectRowClass`在控制器类上添加方法来注入自定义css行类。此方法可以使用两个参数,**$ record**将代表单个模型记录,而**$ definition**包含List小部件定义的名称。您可以返回任何包含行类的字符串值。这些类将添加到行的HTML标记中。
~~~
class Lessons extends \Backend\Classes\Controller
{
[...]
public function listInjectRowClass($lesson, $definition)
{
// Strike through past lessons
if ($lesson->lesson_date->lt(Carbon::today())) {
return 'strike';
}
}
}
~~~
`nolink`即使为List小部件定义了`recordUrl`or`recordOnClick`选项,也可以使用特殊的CSS类来强制行不可单击。在事件中返回此类将使您使记录不可单击-例如,对于软删除的行或信息行:
~~~
public function listInjectRowClass($record, $value)
{
if ($record->trashed()) {
return 'nolink';
}
}
~~~
### [](https://octobercms.com/docs/backend/lists#extend-filter-scopes)扩展过滤范围
您可以通过`extendListFilterScopes`在控制器类上调用static方法从外部扩展另一个控制器的过滤范围。此方法可以使用参数**$ filter**,它将表示Filter小部件对象。以这个控制器为例:
~~~
Categories::extendListFilterScopes(function($filter) {
// Add custom CSS classes to the Filter widget itself
$filter->cssClasses = array_merge($filter->cssClasses, ['my', 'array', 'of', 'classes']);
$filter->addScopes([
'my_scope' => [
'label' => 'My Filter Scope'
]
]);
});
~~~
> 提供的范围数组类似于[列表过滤器配置](https://octobercms.com/docs/backend/lists#list-filters)。
您还可以在内部将过滤器作用域扩展到控制器类,只需覆盖该`listFilterExtendScopes`方法即可。
~~~
class Categories extends \Backend\Classes\Controller
{
[...]
public function listFilterExtendScopes($filter)
{
$filter->addScopes([...]);
}
}
~~~
在$ filter对象上可以使用以下方法。
| 方法 | 描述 |
| --- | --- |
| **addScopes** | 向过滤器小部件添加新范围 |
| **removeScope** | 从过滤器小部件中删除范围 |
### [](https://octobercms.com/docs/backend/lists#extend-model-query)扩展模型查询
可以通过覆盖控制器类内部的方法来扩展对列表[数据库模型](https://octobercms.com/docs/database/model)的查找查询`listExtendQuery`。通过将**withTrashed**范围应用于查询,此示例将确保软删除的记录包括在列表数据中:
~~~
public function listExtendQuery($query)
{
$query->withTrashed();
}
~~~
该[列表筛选](https://octobercms.com/docs/backend/lists#list-filters)模型的查询,也可以通过重写扩展`listFilterExtendQuery`方法:
~~~
public function listFilterExtendQuery($query, $scope)
{
if ($scope->scopeName == 'status') {
$query->where('status', '<>', 'all');
}
}
~~~
### [](https://octobercms.com/docs/backend/lists#extend-records-collection)扩展记录收集
通过覆盖`listExtendRecords`控制器类内部的方法,可以扩展列表使用的记录的集合。本示例使用[记录集合](https://octobercms.com/docs/database/collection)`sort`上的方法来更改[记录](https://octobercms.com/docs/database/collection)的排序顺序。
~~~
public function listExtendRecords($records)
{
return $records->sort(function ($a, $b) {
return $a->computedVal() > $b->computedVal();
});
}
~~~
### [](https://octobercms.com/docs/backend/lists#custom-column-types)自定义列类型
可以使用[Plugin注册类](https://octobercms.com/docs/plugin/registration#registration-methods)的`registerListColumnTypes`方法在后端注册自定义列表列类型。该方法应返回一个数组,其中键是类型名称,值是可调用函数。可调用函数接收三个参数,本机,定义对象和模型对象。[](https://octobercms.com/docs/plugin/registration#registration-methods)`$value``$column``$record`
~~~
public function registerListColumnTypes()
{
return [
// A local method, i.e $this->evalUppercaseListColumn()
'uppercase' => [$this, 'evalUppercaseListColumn'],
// Using an inline closure
'loveit' => function($value) { return 'I love '. $value; }
];
}
public function evalUppercaseListColumn($value, $column, $record)
{
return strtoupper($value);
}
~~~
使用自定义列表列类型就像使用`type`选项按名称调用一样简单。
~~~
# ===================================
# List Column Definitions
# ===================================
columns:
secret_code:
label: Secret code
type: uppercase
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图