添加 Silverstripe CMS 字段,可用于管理任何关系

安装次数: 1,096

依赖项: 5

建议者: 0

安全性: 0

星级: 2

关注者: 2

分支: 0

开放性问题: 20

类型:silverstripe-vendormodule

0.0.0 2023-09-28 05:44 UTC

README

此模块提供了两个简单的表单字段,用于管理父记录的 has-one 和 has-many 关系。

AnyFieldManyAnyField 最适合于管理紧密耦合到其所有者的简单 DataObjects。此模块对于具有复杂关系的 DataObjects 可能效果不佳。

silverstripe/linkfieldAnyField 的绝佳补充。

安装

composer require maxime-rainville/anyfield

此模块需要 Silverstripe CMS 5 或更高版本。

展示

Screencast.from.10-08-23.21.46.36.webm
  • 轻松管理 has_onehas_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);