沙尘暴/crudforms

为Flow和Neos CMS中的域模型创建简单的CRUD表单

安装: 14 119

依赖项: 0

建议者: 0

安全: 0

星级: 22

关注者: 8

分支: 8

开放问题: 5

类型:neos-package

2.4.3 2023-01-11 14:35 UTC

README

为Flow和Neos CMS中的域模型创建简单且可扩展的CRUD(创建、读取、更新、删除)表单。通过域模型注解进行自定义。

功能

  • 以表格形式列出视图
  • 新建和更新表单
  • 自动创建控制器和模板的Kickstarter
  • 支持各种模板框架
    • Zurb Foundation 6
    • Neos UI后端
  • 通过约定和部分进行扩展
  • 适用于其他框架的扩展

兼容性和维护

此包目前正在为Neos 2.3 LTS和Neos 3.x维护。它很稳定,我们在我们的项目中使用它。

用法(Kickstart)

您可以使用 ./flow crudkickstart:crudcontroller 命令创建新的CRUD控制器和Fluid模板。您基本上只需要指定要列出/编辑的模型类名。

概览和表单的渲染默认通过反射模型类(使用反射)完成;然后根据注解属性类型触发相应的编辑器和列表部分。

自定义

CrudForms旨在高度可定制;因此,它提供了一些独立的部分供您使用;您可以更改和扩展每个部分

  • 一些特质可以包含到您的控制器中,以实现CRUD操作

  • 一个ViewHelper,它使用反射检查您的模型并生成元模型(因此是一组所有属性及其元信息,如标签)

  • 一组部分,提供默认的列表、编辑表单和每个屏幕的各个部分的渲染。与标准Flow不同,可以通过在本地包中放置具有相同名称的部分来覆盖这些部分。

请注意,您仍然会有一个控制器和一个非常基础的Fluid模板;因此,有一个清晰的扩展点,您可以使用它来添加自定义功能。

调整单个字段

在您的模型中,使用 @Crud\FormField 注解字段,它支持以下选项

  • label: 在列表表头和编辑屏幕中的字段使用的属性标签
  • position: 列表表单字段的位置。通常,您会将其设置为数值排序索引,尽管也支持如 before otherField 这样的语法,因为内部使用 PositionalArraySorter https://github.com/neos/flow-development-collection/blob/master/Neos.Utility.Arrays/Classes/PositionalArraySorter.php#L31
  • visible: 如果为FALSE,则从列表和表单中隐藏字段
  • visibleInOverview: 如果为FALSE,则从列表中隐藏字段
  • visibleInForm: 如果为FALSE,则从创建和更新表单中隐藏字段
  • readonly: 如果为TRUE,则仅显示值,但不可编辑
  • editor: 为表单配置不同的编辑器;下面将有更详细的描述。
  • listingType: 覆盖用于在列表中渲染此属性的类型名称
  • options: 为例如单选按钮或下拉列表指定选项值
  • repository:指定从其中检索选项值的存储库(格式:full\repository\class\name[::methodName])
  • configuration:一组通用的配置选项,可在任何地方进行自定义。基础类支持以下配置选项
  • formFieldWrapperClassName:应用于每个表单字段的包装元素的CSS类名(以便有字段特定的类)
  • required:指定表单字段是否为必填。支持的编辑器有DateTime、Radio、String和TextArea。

隐藏列表和表单中的属性,排序它们,标记它们

只需像下面这样使用@CrudForms\FormField注解

@CrudForms\FormField(label="my label", visibleInOverview=false)

调整编辑器

您可以使用FormField注解的编辑器属性来触发自定义编辑器的使用。此外,将自定义编辑器放置在Partials/CrudForms/Helpers/Editors/[EditorName].html

编辑器有以下模板变量可用

  • value:要编辑的值
  • object:要编辑的完整对象,如果需要的话。
  • field:当前编辑字段的元模型 - 它是一个具有以下属性的数组
    • Crud\FormField注解的所有属性(见上文)
    • property:要编辑的属性的名称。
  • formFieldClass:这个CSS类名应用作表单字段的CSS类名

示例

<f:for each="{field.options}" as="option">
    <br />
        <f:form.radio property="{field.property}" value="{option.value}" />
        {option.label}
</f:for>

以下编辑器是内置的,但当然可以覆盖

  • DateTime
  • Radio(使用"options"注解属性作为其值)
  • ResourceDownload
  • SingleSelect(使用"options"注解属性,或在使用"repository"时查询存储库以获取可能的值)
  • String(默认)
  • TextArea

自定义列表

在概览页面上,通过部分CrudForms/Helpers/ListingType/[type].html根据属性类型渲染属性值。type可以是简单数据类型(如PHP函数gettype返回的);或完全限定的类名,反斜杠被下划线替换。

在部分内部,您有value变量可用,包含要显示的当前值。

虚拟属性

您可以通过在模型中注解getter方法来向模型添加虚拟属性,使用@Crud\FormField注解。然后,调用相应的getter和setter来加载/存储值。

动态属性

有时,您可能需要根据运行时决策动态地决定要显示哪些字段。一个例子是您有一个具有数组字段"extraProperties"的对象,并根据设置存储不同的值。

要实现这一点,您需要编写一个继承自\Sandstorm\CrudForms\FieldGeneratorInterface的类,然后注解您的模型类为@Crud\FieldGenerator(className="Your\Field\GeneratorClass")

FieldGeneratorInterface需要返回一个数组,以属性路径作为键,以FormField注解类作为值。要表示嵌套属性,只需在属性路径中使用点(.)即可。

待办事项示例 待办事项上下文

在对象的列表前后添加内容

简单地修改您的Index.html模板,例如通过将表包裹在<f:widget.paginate>-ViewHelper中。

在表单周围添加内容

简单地修改您的Edit.html或New.html模板。

为每个列表元素自定义操作

有时,对每个对象的概览中的简单“编辑”和“删除”操作是不够的;您可能希望例如实现一个“克隆”按钮来克隆对象。

这可以通过在CrudForms/Actions/Fully_Qualified_Class_Name_With_Underscores_instead_of_Backslash.html中放置部分来实现。

此部分将当前对象作为object提供。

API

API由两部分组成 - 公共API和内部API

您将仅使用公共API,直到您不需要为表单和列表实现附加的基本模板。如果您需要这样做,您将依赖于“内部”API。

这对于版本升级非常重要

  • 公共API保证在次要版本变化(1.X.Y)中不包含破坏性更改
  • 内部API保证只在修补程序级别版本变化(1.2.X)中不包含破坏性更改。这意味着它可能在次要版本中发生变化。请参阅发布说明了解升级信息。

公共控制器API

  • Sandstorm\CrudForms\Controller\CrudControllerTrait实现了模型对象的列出、创建、编辑、删除。
  • 必须在Controller中重写方法protected function getModelType();它必须返回控制器负责的对象的类名。
use Sandstorm\CrudForms\Controller\CrudControllerTrait;
class AddressController extends ActionController
{
    use CrudControllerTrait;

    protected function getModelType()
    {
        // this method must return the class-name of the object this controller is responsible for
        return Address::class;
    }
}
  • 如果只想自动生成某些操作,可以将use CrudControllerTrait替换为以下特性
    • BaseControllerTrait始终需要
    • IndexControllerTrait包含对象的列出(index操作)
    • CreateControllerTrait创建新对象(newcreate操作)
    • UpdateControllerTrait更新对象(editupdate操作)
    • RemoveControllerTrait删除对象(remove操作)
use Sandstorm\CrudForms\Controller\BaseControllerTrait;
use Sandstorm\CrudForms\Controller\IndexControllerTrait;
use Sandstorm\CrudForms\Controller\CreateControllerTrait;
use Sandstorm\CrudForms\Controller\UpdateControllerTrait;
use Sandstorm\CrudForms\Controller\RemoveControllerTrait;

class AddressController extends ActionController
{
    use BaseControllerTrait;
    
    // here, you can remove certain trait imports and manually implement these actions.
    use IndexControllerTrait;
    use CreateControllerTrait;
    use UpdateControllerTrait;
    use RemoveControllerTrait;

    protected function getModelType()
    {
        return Address::class;
    }
}

公共模板API

公共模板API包含

  • crud:formDefinition 和 crud:listDefinition 视图助手
  • 主表单和编辑部分的定位
  • 创建新编辑器时的约定
  • 创建新操作时的约定
  • 创建新列出对象类型时的约定

私有API

如果您覆盖了主Form.html和Listing,则依赖于私有API,这意味着您必须使用正确的参数调用正确的ViewHelpers,并且正确地触发渲染,就像在包含的Listing.html和Form.html中所做的那样。

如果您将这些模板复制到实现另一个CSS框架,请考虑创建一个pull request,这样每个人都可以从中受益。

下一步/可能进一步的发展

  • 支持更多框架
  • 支持单一视图
  • 支持自定义列出部分
  • 开箱即用的关系编辑器

许可 & 版权

MIT许可,(c)Sandstorm Media GmbH 2016-2017