沙尘暴 / crudforms
为Flow和Neos CMS中的域模型创建简单的CRUD表单
Requires
- neos/flow: ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0
Conflicts
- typo3/flow: <=3.3
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#L31visible
: 如果为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
创建新对象(new
和create
操作)UpdateControllerTrait
更新对象(edit
和update
操作)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