maxime-rainville / anyfield
添加 Silverstripe CMS 字段,可用于管理任何关系
Requires
- php: ^8.1
- league/uri: ^7.1
- league/uri-components: ^7.1
- maxime-rainville/silverstripe-react: ^0.1
- silverstripe/admin: ^2
- silverstripe/framework: ^5
Requires (Dev)
- maxime-rainville/silverstripe-linkfield-tester: dev-master
- silverstripe/linkfield: dev-pulls/3/anyfield-compat
- silverstripe/recipe-testing: ^3
- squizlabs/php_codesniffer: ^3
This package is auto-updated.
Last update: 2024-09-19 00:47:02 UTC
README
此模块提供了两个简单的表单字段,用于管理父记录的 has-one 和 has-many 关系。
AnyField
和 ManyAnyField
最适合于管理紧密耦合到其所有者的简单 DataObjects。此模块对于具有复杂关系的 DataObjects 可能效果不佳。
silverstripe/linkfield
是 AnyField
的绝佳补充。
安装
composer require maxime-rainville/anyfield
此模块需要 Silverstripe CMS 5 或更高版本。
展示
Screencast.from.10-08-23.21.46.36.webm
- 轻松管理
has_one
或has_many
关系 - 通过单个字段管理多个 Dataobject 类
- 允许内容创作者在其父页面的模态中编辑子 DataObjects
- 在常规 Entwine 表单和 Elemental 块中运行
示例用法
<?php use SilverStripe\CMS\Model\SiteTree; use SilverStripe\LinkField\Models\Link; use SilverStripe\AnyField\Form\AnyField; use SilverStripe\AnyField\Form\ManyAnyField; class Page extends SiteTree { private static array $has_one = [ 'SingleLink' => Link::class, ]; private static array $has_many = [ 'ManyLinks' => Link::class, ]; public function getCMSFields() { $fields = parent::getCMSFields(); $fields->addFieldsToTab( 'Root.Main', [ AnyField::create('SingleLink'), ManyAnyField::create('ManyLinks'), ] ) return $fields; } }
自定义字段中 DataObject 的外观
Any DataObject 都可以通过 AnyField 和 ManyAnyField 进行管理,无需任何特殊调整。但是,您可以通过一些简单的调整获得更多价值。这些调整可以通过 DataExtension 应用。
自定义标题
AnyFields 显示所选 DataObject 的标题。通过为 DataObject 类定义 getTitle
方法,您可以自定义在字段中显示的标题。
显示摘要
AnyFields 在所选 DataObject 的标题下方显示其类型。您还可以通过在您的 DataObject 类上实现 getSummary
方法来显示摘要。这也可以通过 DataExtension 实现。
显示图标
您可以通过为 DataObject 的每个类定义 private static $icon
配置值来自定义要显示的图标。
Silverstripe CMS 随附一些预定义的图标,您可以使用。或者,将 icon
值添加为 CSS 类到相关的按钮,然后您可以使用自己的自定义图标来定位它。
# This will add a `font-icon-link` class to the AnyField when managing a Book class. App\Models\Book: icon: book
排序 ManyManyField
ManyManyField
可以配置以排序其结果。通过调用 setSort
定义应使用哪个字段来排序结果。
ManyAnyField::create('Pets')->setSort('Sort')
可以将方便的扩展应用到您的 DataObject 类,以添加所需的字段使它们可排序。该扩展将自动添加 Sort
整数字段,定义默认排序顺序,并将 Sort
字段从 CMS 表单中隐藏。
App\Models\FooBar: extension: - SilverStripe\AnyField\Extensions\Sortable
高级用例
自动发布和级联删除
AnyFields 不允许您独立于其所有者发布或删除子 DataObjects。为了避免孤立对象或未发布的 DataObject,您应该在所有者 DataObject 类上明确定义 所属权 和 级联规则。
<?php use SilverStripe\CMS\Model\SiteTree; use SilverStripe\LinkField\Models\Link; use SilverStripe\AnyField\Form\AnyField; use SilverStripe\AnyField\Form\ManyAnyField; class Page extends SiteTree { private static array $has_one = [ 'SingleLink' => Link::class, ]; private static array $has_many = [ 'ManyLinks' => Link::class, ]; /** Publishing the page will automatically publish those relations */ private static $owns = [ 'SingleLink', 'ManyLinks' ]; /** The relations will be deleted when the page is deleted */ private static $cascade_deletes = [ 'SingleLink', 'ManyLinks' ]; /** The relations will be duplicated when the page is duplicated */ private static $cascade_duplicates = [ 'SingleLink', 'ManyLinks' ]; public function getCMSFields() { $fields = parent::getCMSFields(); $fields->addFieldsToTab( 'Root.Main', [ AnyField::create('SingleLink'), ManyAnyField::create('ManyLinks'), ] ) return $fields; } }
控制通过 AnyFields 可以创建哪些 DataObject 类
AnyField 和 ManyAnyField 通过在其父对象上查找匹配的关系来自动检测它们打算管理的 DataObject 类。
如果您决定将AnyFields命名为与其预期关系不同的名称,您需要明确告诉它使用哪个DataObject类。
AnyField::create('MyItem', 'My Item', $this->Item)->setBaseClass(Link::class);
默认情况下,AnyField会自动发现基类的任何子类,并允许最终用户创建这些子类。您可以通过调用setRecursivelyAddChildClass
来关闭此行为。
AnyField::create('MyItem')->setRecursivelyAddChildClass(false);
您还可以排除个别类。
// The filed will allow you to create child classes of Link, but not a plain Link AnyField::create('MyLink')->setBaseClass(Link::class)->addExcludedClass(Link::class);