mak001 / silverstripe-categorization
SilverStripe 分类模块。轻松地将分类添加到页面和数据对象中。
Requires
Requires (Dev)
This package is not auto-updated.
Last update: 2020-01-10 17:04:26 UTC
README
轻松地将分类添加到页面或数据对象,并允许通过友好的URL访问分类。
以 example.com
上的页面为例,其URL段为 page
,有一个名为 Categories
的关系。
可以通过访问 example.com/page/Categories
来访问分类。
访问 example.com/page/Categories/category
将返回具有 category
的 URLSegment
的 Categories
关系中的分类。
要求
- SilverStripe 4.0
安装
composer require mak001/silverstripe-categorization
使用
CategorizationExtension
要创建一个分类,请将 Mak001\Categorization\Extensions\CategorizationExtension
添加到数据对象。此扩展将为数据对象添加 标题
和 URLSegment
字段。
Category: extensions: - Mak001\Categorization\Extensions\CategorizationExtension
CategorizationControllerExtension
允许页面显示分类关系。这将选择 has_many
、many_many
和 belongs_many_many
关系,如果关系类已应用 CategorizationExtension
。
CategoryPageController: extensions: - Mak001\Categorization\Extensions\CategorizationControllerExtension
外部关系
外部关系也可以设置为可查看。当持有页面的子项具有关系,但持有者应具有可查看的关系时,这很有用。这可以通过以下方式完成
private static $external_relation = [ 'External' => RelationClass::class, ]; public function External() { return RelationClass::get(); }
所有外部关系都需要一个与关系名称相同的名称的方法。
关系URL段
关系段可以与关系名称不同。一个例子是 Categories
关系映射到 categories
。只需添加
private static $relation_segments = [ 'Categories' => 'example_segment', ];
现在访问 example.com/page/example_segment
将指向 Categories
关系,而 example.com/page/Categories
将无法找到。
它将默认为关系名称。
模板
取一个页面类型 NameSpace/CategoryPage
,它扩展了 Page
,URL段为 page
。当访问 example.com/page/Categories
时,可用的模板有
[ "NameSpace/CategoryPage_Categories", "Page_Categories", "NameSpace/CategoryPage", "Page", ]
它始终寻找 ClassName_Relation
,而不是寻找关系的 relation_segment
。
对于具有 singular_name
为 Category
和 url_segment
为 category
的分类对象,当访问 example.com/page/Categories/category
时,可用的模板有
[ "NameSpace/CategoryPage_Categories_Category", "Page_Categories_Category", "NameSpace/CategoryPage_Categories", "Page_Categories", "NameSpace/CategoryPage", "Page", ]
这些应该位于 Layouts
文件夹中。
当访问关系链接时,模板将传递一个包含关系中的分类的 Categorizations
变量。
当访问 example.com/page/Categories/category
时,模板将与上面相同。将添加一个包含具有给定 URLSegment 的指定关系中的分类的 Categorization
变量。
当访问关系链接或分类对象时,模板将传递一个 RelationName
变量,表示当前正在查看的关系。
非泛型变量
在控制器中将 $use_alternative_variables
设置为 true 将会使用关系名称和分类 $singular_name
来代替泛型的 Categorizations
和 Categorization
变量名称。
修改关系列表
使用泛型的 modifyCategorizationList($list, $request)
扩展点修改传递给模板的列表。这将适用于所有列表。为了更精细地控制特定的关系列表,请使用 modify{$relationName}List()
,将 {$relationName}
替换为关系的名称。