Skip to content

Commit 3cc6fcc

Browse files
committed
feat: add support for IsNumeric
1 parent a6b7ac4 commit 3cc6fcc

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

src/EditableKeyValueField.php

+15-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace FullscreenInteractive\KeyValueField;
44

5+
use SilverStripe\Forms\CheckboxField;
56
use SilverStripe\Forms\FieldList;
7+
use SilverStripe\Forms\NumericField;
68
use SilverStripe\Forms\TextareaField;
79
use SilverStripe\UserForms\Model\EditableFormField;
810

@@ -17,7 +19,8 @@ class EditableKeyValueField extends EditableFormField
1719
private static $plural_name = 'Key Value Fields';
1820

1921
private static $db = [
20-
'Keys' => 'Text'
22+
'Keys' => 'Text',
23+
'IsNumeric' => 'Boolean',
2124
];
2225

2326
private static $table_name = 'EditableKeyValueField';
@@ -29,6 +32,7 @@ public function getCMSFields()
2932
{
3033
$this->beforeUpdateCMSFields(function (FieldList $fields) {
3134
$fields->addFieldsToTab('Root.Main', TextareaField::create('Keys')->setDescription('One key per line'));
35+
$fields->addFieldsToTab('Root.Main', CheckboxField::create('IsNumeric', 'Validate field values as numeric values?')->setDescription('Validates that all the values are numeric'));
3236
});
3337

3438
return parent::getCMSFields();
@@ -37,8 +41,16 @@ public function getCMSFields()
3741

3842
public function getFormField()
3943
{
40-
$field = KeyValueField::create($this->Name, $this->Title ?: false)
41-
->setKeys($this->getKeysAsArray());
44+
$field = KeyValueField::create($this->Name, $this->Title ?: false);
45+
46+
if ($this->IsNumeric) {
47+
$field->setValueFieldClass(NumericField::class);
48+
$field->setFieldCallback(function ($field) {
49+
$field->setHTML5(true);
50+
});
51+
}
52+
53+
$field->setKeys($this->getKeysAsArray());
4254

4355
$this->doUpdateFormField($field);
4456

src/KeyValueField.php

+40-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace FullscreenInteractive\KeyValueField;
44

55
use SilverStripe\Core\Convert;
6+
use SilverStripe\Core\Injector\Injector;
67
use SilverStripe\Forms\CompositeField;
78
use SilverStripe\Forms\FieldList;
89
use SilverStripe\Forms\LabelField;
@@ -16,6 +17,16 @@ class KeyValueField extends CompositeField
1617
*/
1718
protected $keys = 0;
1819

20+
/**
21+
* @var string
22+
*/
23+
protected $fieldClass = TextField::class;
24+
25+
/**
26+
* @var ?callable
27+
*/
28+
protected $fieldCallback = null;
29+
1930

2031
public function __construct($name, $title = null, $value = null)
2132
{
@@ -42,6 +53,28 @@ public function HolderID()
4253
}
4354

4455

56+
/**
57+
* Set the class to use for the value fields.
58+
*/
59+
public function setValueFieldClass(string $class)
60+
{
61+
$this->fieldClass = $class;
62+
63+
return $this;
64+
}
65+
66+
67+
/**
68+
* Set a callback to be called on each field.
69+
*/
70+
public function setFieldCallback(callable $callback)
71+
{
72+
$this->fieldCallback = $callback;
73+
74+
return $this;
75+
}
76+
77+
4578
public function buildChildren()
4679
{
4780
$children = new FieldList();
@@ -54,8 +87,14 @@ public function buildChildren()
5487
$fieldName = sprintf("%s[%s]", $name, $i);
5588
$value = isset($this->value[$i]) ? $this->value[$i] : '';
5689

57-
$field = TextField::create($fieldName, $key, $value)
90+
$field = Injector::inst()->create($this->fieldClass, $fieldName, $key, $value)
5891
->addExtraClass('key__value');
92+
93+
if (is_callable($this->fieldCallback)) {
94+
// call fieldCallback
95+
($this->fieldCallback)($field);
96+
}
97+
5998
$this->invokeWithExtensions('updateKeyValueField', $field, $key, $i);
6099

61100
$children->push($field);

0 commit comments

Comments
 (0)