💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 列表行为 ### [](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 ~~~