Skip to content

Commit 6bea91f

Browse files
committed
First draft of FormBuilder API for v1.0
1 parent 57f7fc9 commit 6bea91f

9 files changed

Lines changed: 174 additions & 107 deletions

File tree

Component/Form/FormViewModel.php

Lines changed: 17 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@
22

33
namespace Loki\AdminComponents\Component\Form;
44

5+
use Loki\AdminComponents\Form\Fieldset\FieldsetsResolver;
6+
use Loki\AdminComponents\Form\Item\ItemResolver;
57
use Loki\AdminComponents\Ui\Button\ButtonsResolver;
68
use Loki\AdminComponents\Form\Field\Field;
79
use Loki\AdminComponents\Form\Field\FieldFactory;
8-
use Loki\AdminComponents\Form\Field\FieldResolver;
10+
use Loki\AdminComponents\Form\Field\FieldsResolver;
911
use Loki\AdminComponents\Form\Fieldset\Fieldset;
1012
use Loki\AdminComponents\Form\Fieldset\FieldsetFactory;
11-
use Loki\AdminComponents\Form\ItemConvertorInterface;
1213
use Loki\AdminComponents\Ui\Button\Button;
1314
use Loki\AdminComponents\Ui\Button\ButtonFactory;
1415
use Loki\Components\Component\ComponentViewModel;
1516
use Magento\Framework\App\RequestInterface;
16-
use Magento\Framework\DataObject;
1717
use Magento\Framework\Exception\LocalizedException;
1818
use Magento\Framework\ObjectManagerInterface;
1919
use Magento\Framework\UrlFactory;
20-
use Throwable;
2120

2221
/**
2322
* @method FormRepository getRepository()
@@ -32,8 +31,10 @@ public function __construct(
3231
protected FieldFactory $fieldFactory,
3332
protected FieldsetFactory $fieldsetFactory,
3433
protected RequestInterface $request,
35-
protected FieldResolver $fieldResolver,
34+
protected FieldsetsResolver $fieldsetsResolver,
35+
protected FieldsResolver $fieldsResolver,
3636
protected ButtonsResolver $buttonsResolver,
37+
protected ItemResolver $itemResolver,
3738
protected array $itemFilters = [],
3839
) {
3940
}
@@ -54,24 +55,12 @@ public function getJsData(): array
5455

5556
private function getItemData(): array
5657
{
57-
try {
58-
$item = $this->getRepository()->getItem();
59-
} catch (Throwable $e) {
60-
$this->getContext()->getMessageManager()->addErrorMessage($e->getMessage());
61-
62-
return [];
63-
}
64-
65-
if (false === $item instanceof DataObject) {
66-
return [];
67-
}
68-
69-
$itemConvertor = $this->getBlock()->getItemConvertor();
70-
if ($itemConvertor instanceof ItemConvertorInterface) {
71-
$item = $itemConvertor->afterLoad($item);
72-
}
58+
$item = $this->itemResolver->resolve(
59+
$this->getRepository(),
60+
$this->getBlock()
61+
);
7362

74-
return $item->toArray();
63+
return $item->getData();
7564
}
7665

7766
public function getIndexUrl(): string
@@ -85,9 +74,8 @@ public function getIndexUrl(): string
8574
public function getButtons(): array
8675
{
8776
return $this->buttonsResolver->resolve(
77+
$this->getRepository(),
8878
$this->getBlock(),
89-
$this->getRepository()->getProvider(),
90-
$this->getValue()
9179
);
9280
}
9381

@@ -96,61 +84,10 @@ public function getButtons(): array
9684
*/
9785
public function getFieldsets(): array
9886
{
99-
$fieldsetDefinitions = (array)$this->getBlock()->getFieldsets();
100-
$fieldsetLabel = 'Base';
101-
if (isset($fieldsetDefinitions['base'])) {
102-
$fieldsetLabel = $fieldsetDefinitions['base']['label'] ?? $fieldsetDefinitions['base']['code'];
103-
}
104-
105-
$fieldsets['base'] = $this->fieldsetFactory->create('base', $fieldsetLabel);
106-
107-
foreach ($fieldsetDefinitions as $fieldsetCode => $fieldsetDefinition) {
108-
if (empty($fieldsetCode)) {
109-
$fieldsetCode = 'base';
110-
}
111-
112-
if (array_key_exists($fieldsetCode, $fieldsets)) {
113-
continue;
114-
}
115-
116-
$fieldsets[$fieldsetCode] = $this->fieldsetFactory->create($fieldsetCode, $fieldsetDefinition['label']);
117-
}
118-
119-
$fieldDefinitions = (array)$this->getBlock()->getFields();
120-
121-
$fields = $this->fieldResolver->resolve($this->getRepository(), $fieldDefinitions);
122-
123-
foreach ($fields as $field) {
124-
$fieldsetCode = (string)$field->getFieldset();
125-
126-
if (isset($fieldDefinitions[$field->getCode()])) {
127-
unset($fieldDefinitions[$field->getCode()]);
128-
}
129-
130-
if (!empty($fieldsetCode) && array_key_exists($fieldsetCode, $fieldsets)) {
131-
$fieldsets[$fieldsetCode]->addField($field);
132-
continue;
133-
}
134-
135-
$fieldsets['base']->addField($field);
136-
}
137-
138-
foreach ($fieldDefinitions as $fieldDefinitionCode => $fieldDefinition) {
139-
if (!isset($fieldDefinition['code'])) {
140-
$fieldDefinition['code'] = $fieldDefinitionCode;
141-
}
142-
143-
$field = $this->fieldFactory->create($this->getBlock(), $fieldDefinition);
144-
145-
if (!empty($fieldsetCode) && array_key_exists($fieldsetCode, $fieldsets)) {
146-
$fieldsets[$fieldsetCode]->addField($field);
147-
continue;
148-
}
149-
150-
$fieldsets['base']->addField($field);
151-
}
152-
153-
return $fieldsets;
87+
return $this->fieldsetsResolver->resolve(
88+
$this->getRepository(),
89+
$this->getBlock(),
90+
);
15491
}
15592

15693
/**
@@ -160,12 +97,10 @@ public function getFieldsets(): array
16097
*/
16198
public function getFields(): array
16299
{
163-
$fields = $this->fieldResolver->resolve(
100+
return $this->fieldsResolver->resolve(
164101
$this->getRepository(),
165102
(array)$this->getBlock()->getFields(),
166103
);
167-
168-
return $fields;
169104
}
170105

171106
private function getIndexUri(): string

Form/Action/SaveAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Loki\AdminComponents\Form\Action;
44

5-
use Loki\AdminComponents\Form\ItemConvertorInterface;
5+
use Loki\AdminComponents\Form\Item\ItemConvertorInterface;
66
use Magento\Framework\DataObject;
77
use Magento\Framework\Message\Manager;
88
use Loki\AdminComponents\Component\Form\FormRepository;

Form/Field/FieldFactory.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ public function create(
2929
AbstractBlock $block,
3030
array $data = [],
3131
): Field {
32+
if (!isset($data['code']) && !empty($data['name'])) {
33+
$data['code'] = $data['name'];
34+
}
35+
36+
if (!isset($data['name']) && !empty($data['code'])) {
37+
$data['name'] = $data['code'];
38+
}
39+
3240
// @todo: Move this to form field data sanitizer or just some value object
3341
if (!isset($data['field_type']) || empty($data['field_type'])) {
3442
$data['field_type'] = 'input';
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
namespace Loki\AdminComponents\Form\Field;
44

55
use Loki\AdminComponents\Component\Form\FormRepository;
6-
use Loki\AdminComponents\Form\Field\Field;
7-
use Loki\AdminComponents\Form\Field\FieldFactory;
86
use Magento\Framework\View\Element\Template;
97
use Magento\Framework\View\LayoutInterface;
108

11-
class FieldResolver
9+
class FieldsResolver
1210
{
1311
public function __construct(
1412
private FieldFactory $fieldFactory,
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Loki\AdminComponents\Form\Fieldset;
5+
6+
use Loki\AdminComponents\Component\Form\FormRepository;
7+
use Loki\AdminComponents\Form\Field\FieldFactory;
8+
use Loki\AdminComponents\Form\Field\FieldsResolver;
9+
use Loki\AdminComponents\Provider\FormProviderInterface;
10+
use Magento\Framework\View\Element\AbstractBlock;
11+
12+
class FieldsetsResolver
13+
{
14+
public function __construct(
15+
private FieldsetFactory $fieldsetFactory,
16+
private FieldsResolver $fieldsResolver,
17+
private FieldFactory $fieldFactory
18+
) {
19+
}
20+
21+
/**
22+
* @return Fieldset[]
23+
*/
24+
public function resolve(
25+
FormRepository $formRepository,
26+
AbstractBlock $block,
27+
): array {
28+
$provider = $formRepository->getProvider();
29+
if ($provider instanceof FormProviderInterface) {
30+
return $provider->getForm()->getFieldsets();
31+
}
32+
33+
$fieldsetDefinitions = (array)$block->getFieldsets();
34+
35+
$fieldsetLabel = 'Base';
36+
if (isset($fieldsetDefinitions['base'])) {
37+
$fieldsetLabel = $fieldsetDefinitions['base']['label'] ?? $fieldsetDefinitions['base']['code'];
38+
}
39+
40+
$fieldsets['base'] = $this->fieldsetFactory->create('base', $fieldsetLabel);
41+
42+
foreach ($fieldsetDefinitions as $fieldsetCode => $fieldsetDefinition) {
43+
if (empty($fieldsetCode)) {
44+
$fieldsetCode = 'base';
45+
}
46+
47+
if (array_key_exists($fieldsetCode, $fieldsets)) {
48+
continue;
49+
}
50+
51+
$fieldsets[$fieldsetCode] = $this->fieldsetFactory->create($fieldsetCode, $fieldsetDefinition['label']);
52+
}
53+
54+
$fieldDefinitions = (array)$block->getFields();
55+
56+
$fields = $this->fieldsResolver->resolve($formRepository, $fieldDefinitions);
57+
58+
foreach ($fields as $field) {
59+
$fieldsetCode = (string)$field->getFieldset();
60+
61+
if (isset($fieldDefinitions[$field->getCode()])) {
62+
unset($fieldDefinitions[$field->getCode()]);
63+
}
64+
65+
if (!empty($fieldsetCode) && array_key_exists($fieldsetCode, $fieldsets)) {
66+
$fieldsets[$fieldsetCode]->addField($field);
67+
continue;
68+
}
69+
70+
$fieldsets['base']->addField($field);
71+
}
72+
73+
foreach ($fieldDefinitions as $fieldDefinitionCode => $fieldDefinition) {
74+
if (!isset($fieldDefinition['code'])) {
75+
$fieldDefinition['code'] = $fieldDefinitionCode;
76+
}
77+
78+
$field = $this->fieldFactory->create($this->getBlock(), $fieldDefinition);
79+
80+
if (!empty($fieldsetCode) && array_key_exists($fieldsetCode, $fieldsets)) {
81+
$fieldsets[$fieldsetCode]->addField($field);
82+
continue;
83+
}
84+
85+
$fieldsets['base']->addField($field);
86+
}
87+
88+
return $fieldsets;
89+
}
90+
}

Form/Form.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99

1010
class Form
1111
{
12-
/**
13-
* @var Field[]
14-
*/
15-
private array $fields = [];
16-
1712
/**
1813
* @var Fieldset[]
1914
*/
@@ -24,17 +19,6 @@ class Form
2419
*/
2520
private array $buttons = [];
2621

27-
public function addField(Field $field): Form
28-
{
29-
$this->fields[] = $field;
30-
return $this;
31-
}
32-
33-
public function getFields(): array
34-
{
35-
return $this->fields;
36-
}
37-
3822
public function addFieldset(Fieldset $fieldset): Form
3923
{
4024
$this->fieldsets[] = $fieldset;

Form/FormBuilder.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Loki\AdminComponents\Form\Fieldset\FieldsetFactory;
99
use Loki\AdminComponents\Ui\Button\Button;
1010
use Loki\AdminComponents\Ui\Button\ButtonFactory;
11-
use Magento\Framework\View\Element\AbstractBlock;
1211
use Magento\Framework\View\Element\Template;
1312
use Magento\Framework\View\LayoutInterface;
1413

@@ -31,6 +30,7 @@ public function createForm(string $code): Form
3130
public function createField(array $data = []): Field
3231
{
3332
$block = $this->layout->createBlock(Template::class);
33+
3434
return $this->fieldFactory->create($block, $data);
3535
}
3636

@@ -46,10 +46,14 @@ public function createButton(
4646
string $url = '',
4747
array $subButtons = [],
4848
bool $primary = false,
49-
): Button
50-
{
49+
): Button {
5150
return $this->buttonFactory->create(
52-
$method, $label, $cssClass, $url, $subButtons, $primary
51+
$method,
52+
$label,
53+
$cssClass,
54+
$url,
55+
$subButtons,
56+
$primary
5357
);
5458
}
5559
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
declare(strict_types=1);
33

4-
namespace Loki\AdminComponents\Form;
4+
namespace Loki\AdminComponents\Form\Item;
55

66
use Magento\Framework\DataObject;
77
use Magento\Framework\View\Element\Block\ArgumentInterface;

0 commit comments

Comments
 (0)