A reusable approach to a form field which allows you to create and delete rows in either custom built forms or in Userforms.
This is designed to work on the front-end with limited javascript (i.e it does
not require GridField
or entwine).
Each row can relate to a DataObject subclass or simply to be used to capture the data as an array.
composer require fullscreeninteractive/silverstripe-manyfield
use FullscreenInteractive\ManyField\ManyField;
$fields = new FieldList(
$many = ManyField::create('SwabList', [
TextField::create('Swab'),
TextField::create('TestSite'),
TextField::create('Description'),
TextField::create('Material')
])
);
Data will either be saved as setSwabList($data)
, SwabList
database field or
in the SwabList
relation. If you are saving into a relation such as HasMany
or ManyMany
list then make sure you include a hidden field in your field list.
$many = ManyField::create('SwabList', [
HiddenField::create('ID', ''),
TextField::create('Swab'),
TextField::create('TestSite'),
TextField::create('Description'),
TextField::create('Material')
]);
Include a Hidden field Sort
and make sure sorting is enabled.
$many = ManyField::create('SwabList', [
HiddenField::create('ID', ''),
HiddenField::create('Sort', ''),
TextField::create('TestSite')
])->setCanSort(true);
$many = ManyField::create('SwabList', [
TextField::create('TestSite')->setRequired(true)
])->setCanSort(true);
If you have UI handlers that need to run when fields are added or removed
(such as Date Pickers) create a handler on your <body>
element and listen for
either:
manyFieldAdded
manyFieldRemoved
Make sure your form encoding is set to the correct MIME type.
$form->setEncType(Form::ENC_TYPE_MULTIPART);
BSD 3-Clause License