sunnychomeup / hasoneedit
允许在CMS中直接编辑has_one对象的字段
Requires
- silverstripe/asset-admin: ~1.0 || ~2.0
- silverstripe/framework: ~4.0 || ~5.0
Replaces
README
此模块允许您直接编辑相关has_one
对象的字段,无需在GridField
或ModelAdmin
的链接中麻烦。如果相关的has_one
尚未存在,则此模块还会在首次写入时为您创建对象并设置关系。
此模块已在GridFieldDetailForm
和CMSMain
中的通用Page
中测试了编辑has_one
。
要求
SilverStripe 4.x。
已在4.0.x-dev上进行了基本测试。随着SS4变得更加稳定,可能需要进行广泛的测试。
使用方法
要使用此模块,只需在getCMSFields()
方法中将字段添加到对象的CMS字段中。字段的名称应该是HasOneName-_1_-FieldName
。
例如,假设您有一个名为Show
的has_one
,该has_one
有一个名为Title
的字段您想要编辑。您会添加字段TextField::create('Show-_1_-Title', 'Show Title')
。
如果您不需要输出的字段名称与您提供的值匹配,您也可以使用冒号作为分隔符而不是-_1_-
。
使用ProvidesHasOneInlineFields
特性生成字段
如果您只想显示相关对象的全部CMS字段,您可以将ProvidesHasOneInlineFields
特性添加到对象中。这将为您的DataObject
添加一个方法,该方法调用getCMSFields()
并返回该对象的FormField
。这些FormField
将被转换为与此模块一起使用,通过添加关系名称和分隔符到它们的名称。
在拥有对象的地方,您想在其中显示字段,调用HasOneEdit::getInlineFields($this, 'my_has_one_name', ['db'])
。这将返回添加到CMS的db
子集字段 - 例如,您可以通过调用$fields->addFieldsToTab('Root.RelatedObject', HasOneEdit::getInlineFields($this, 'Relation', ['db']))
来显示相关对象的字段在其自己的选项卡中。
这有一个优点,即运行整个getCMSFields()
调用树(例如,任何通过扩展提供的功能的updateCMSFields
)等,而无需在许多地方重复逻辑。
您还可以实现一个返回FieldList|FormField[]
的public function provideHasOneInlineFields($relationName)
方法,以提供与getCMSFields()
不同的自定义接口(例如,只是字段的一小部分)。在这种情况下,所有字段名称都应采用以下形式:$relationName . HasOneEdit::FIELD_SEPARATOR . $dataObjectFieldName
。即使您的类不使用ProvidesHasOneInlineFields
特性,此方法也会被HasOneEdit::getInlineFields
调用。
与您自己的表单一起使用
要为您的表单添加支持,您需要将Sunnysideup\HasOneEdit\UpdateFormExtension
扩展添加到您的控制器中,并在返回表单到模板之前调用$this->extend('updateEditForm', $form)
。如果没有这个,虽然保存将工作,但字段将不会用has_one
的值填充。