Skip to content

Commit e2c28ba

Browse files
committed
Think everything's working
1 parent 49c70d8 commit e2c28ba

File tree

5 files changed

+108
-36
lines changed

5 files changed

+108
-36
lines changed

Diff for: modules/json_form_widget/README.md

+92-29
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,100 @@
1+
## High level
2+
3+
```mermaid
4+
sequenceDiagram
5+
participant FormBuilder
6+
participant FieldTypeRouter
7+
participant Element Handlers
8+
participant SchemaUiHandler
9+
10+
loop each $property in $form
11+
FormBuilder ->> FieldTypeRouter: getFormElement()
12+
FieldTypeRouter ->> Element Handlers: handler functions<br />on helper classes
13+
Note over FieldTypeRouter, Element Handlers: Initial build of property<br />Elements
14+
Element Handlers ->> FormBuilder: Return default element for $property
15+
end
16+
17+
FormBuilder ->> SchemaUiHandler: applySchemaUi()
18+
Note over FormBuilder, SchemaUiHandler: Now apply SchemaUi to full $form
19+
loop each $property
20+
SchemaUiHandler ->> SchemaUiHandler: applyOnBaseField()
21+
SchemaUiHandler ->> SchemaUiHandler: handlePropertySpec()
22+
Note over SchemaUiHandler, SchemaUiHandler: See handlePropertySpec() <br />internals diagram
23+
end
24+
SchemaUiHandler ->> FormBuilder: Return $form with SchemaUi alterations
25+
26+
```
27+
28+
## The handlePropertySpec() method
29+
30+
As called from withing SchemaUiHandler::applyShemaUi
31+
32+
```mermaid
33+
sequenceDiagram
34+
participant handlePropertySpec
35+
36+
37+
```
38+
39+
## The initial build
40+
141
```mermaid
242
graph TD
343
getForm["FormBuilder::getJsonForm()"] --> eachProp["foreach $properties"]
4-
subgraph getElements
5-
eachProp --> getElement["FieldTypeRouter::getFormElement()"]
6-
getElement --> switch[Switch $type]
7-
switch --> object{object}
8-
9-
object -- true --> handleObject["ObjectHelper::handleObjectElement()"]
10-
handleObject --> generateObject["ObjectHelper::generateObjectElement()"]
11-
generateObject --> generateProperties["ObjectHelper::generateProperties()"]
12-
generateProperties -- recursion --> eachProp
13-
14-
15-
object -- false --> array{array}
16-
array -- true --> handleArray["ArrayHelper::handleArrayElement()"]
17-
handleArray --> complex{Items are objects?}
18-
complex -- no --> buildSimple["ArrayHelper::buildSimpleArrayElement()"]
19-
complex -- yes --> buildComplex["ArrayHelper::buildComplexArrayElement()"]
20-
buildComplex --> handleObject
21-
22-
array -- false --> string["string"]
23-
string -- true --> handleString["StringHelper::handleStringElement()"]
24-
string -- false --> integer["integer"]
25-
integer -- true --> handleInteger["IntegerHelper::handleIntegerElement()"]
26-
switch --> eachProp
27-
end
28-
eachProp -->getForm
29-
getForm --> applySchemaUi["SchemaUiHandler::applySchemaUi()"]
44+
eachProp --> getElement["FieldTypeRouter::getFormElement()"]
45+
getElement --> switch[Switch $type]
46+
switch --> object{object}
47+
48+
object -- true --> handleObject["ObjectHelper::handleObjectElement()"]
49+
handleObject --> generateObject["ObjectHelper::generateObjectElement()"]
50+
generateObject --> generateProperties["ObjectHelper::generateProperties()"]
51+
generateProperties -- recursion --> eachProp
52+
53+
54+
object -- false --> array{array}
55+
array -- true --> handleArray["ArrayHelper::handleArrayElement()"]
56+
handleArray --> complex{Items are objects?}
57+
complex -- no --> buildSimple["ArrayHelper::buildSimpleArrayElement()"]
58+
complex -- yes --> buildComplex["ArrayHelper::buildComplexArrayElement()"]
59+
buildComplex --> handleObject
3060
31-
subgraph SchemaUI
61+
array -- false --> string["string"]
62+
string -- true --> handleString["StringHelper::handleStringElement()"]
63+
string -- false --> integer["integer"]
64+
integer -- true --> handleInteger["IntegerHelper::handleIntegerElement()"]
65+
switch --> eachProp
66+
eachProp --> getForm
67+
```
68+
69+
## Customizing widgets w/SchemaUI
70+
71+
```mermaid
72+
flowchart-elk TD
73+
getForm["FormBuilder::getJsonForm()"] --> applySchemaUi["SchemaUiHandler::applySchemaUi()"]
3274
applySchemaUi --> eachProp2["foreach schemaUI property"]
3375
eachProp2 --> applyOnBaseField["SchemaUiHandler::applyOnBaseField()"]
34-
eachProp2 --> handlePropertySpec["SchemaUiHandler::handlePropertySpec()"]
76+
eachProp2 --> handlePropertySpec
77+
subgraph s1["applyOnBaseField()"]
78+
applyOnBaseField --> updateWidgets["SchemaUiHandler::updatewidgets()"]
79+
updateWidgets --> disableFields["SchemaUiHandler::disableFields()"]
80+
disableFields --> addPlaceholders["SchemaUiHandler::addPlaceholders()"]
81+
addPlaceholders --> changeFieldDescriptions["SchemaUiHandler::changeFieldDescriptions()"]
82+
changeFieldDescriptions --> changeFieldTitle["SchemaUiHandler::changeFieldTitle()"]
83+
end
84+
subgraph s2["handlePropertySpec"]
85+
handlePropertySpec["SchemaUiHandler::handlePropertySpec()"] --> what{"what is it"}
86+
what -- array --> eachArrayElement
87+
eachArrayElement --> applyOnArrayFields
88+
89+
applyOnArrayFields --> eachArrayElementField
90+
eachArrayElementField --> inSpec{"Does SchemaUI<br>contain config for<br>this field?"}
91+
inSpec -- yes --> handlePropertySpec
92+
inSpec -- no --> applyOnBaseFieldRec["SchemaUiHandler::applyOnBaseField()"]
93+
94+
what -- object --> applyOnObjectFields
95+
applyOnObjectFields --> eachObjField["foreach object property in the SchemaUi spec"]
96+
eachObjField --> applyOnBaseFieldRec
97+
98+
end
3599
36-
end
37100
```

Diff for: modules/json_form_widget/src/ArrayHelper.php

+1
Original file line numberDiff line numberDiff line change
@@ -475,4 +475,5 @@ public static function trimParents(array &$parents, int $element_index): void {
475475
$offset = 0 - (count($parents) - $ei_position);
476476
\array_splice($parents, $offset);
477477
}
478+
478479
}

Diff for: modules/json_form_widget/src/FormBuilder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public function __construct(
6868
SchemaRetriever $schema_retriever,
6969
FieldTypeRouter $router,
7070
SchemaUiHandler $schema_ui_handler,
71-
LoggerInterface $loggerChannel
71+
LoggerInterface $loggerChannel,
7272
) {
7373
$this->schemaRetriever = $schema_retriever;
7474
$this->router = $router;

Diff for: modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
namespace Drupal\json_form_widget\Plugin\Field\FieldWidget;
44

55
use Drupal\Core\Entity\FieldableEntityInterface;
6+
use Drupal\Core\Field\FieldDefinitionInterface;
67
use Drupal\Core\Field\FieldItemListInterface;
78
use Drupal\Core\Field\WidgetBase;
89
use Drupal\Core\Form\FormStateInterface;
910
use Drupal\json_form_widget\FormBuilder;
11+
use Drupal\json_form_widget\ValueHandler;
1012
use Symfony\Component\DependencyInjection\ContainerInterface;
11-
use Drupal\Core\Field\FieldDefinitionInterface;
1213
use Symfony\Component\HttpFoundation\RequestStack;
13-
use Drupal\json_form_widget\ValueHandler;
1414

1515
/**
1616
* Plugin implementation of the 'json_form_widget'.
@@ -82,7 +82,7 @@ public function __construct(
8282
array $third_party_settings,
8383
FormBuilder $builder,
8484
ValueHandler $value_handler,
85-
RequestStack $request_stack
85+
RequestStack $request_stack,
8686
) {
8787
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
8888
$this->builder = $builder;

Diff for: modules/json_form_widget/src/SchemaUiHandler.php

+11-3
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public function applyOnBaseField(mixed $spec, array $element) {
173173
$element = $this->changeFieldDescriptions($spec->{"ui:options"}, $element);
174174
$element = $this->changeFieldTitle($spec->{"ui:options"}, $element);
175175
if (isset($spec->{"ui:options"}->hideActions)) {
176-
// $element = $this->flattenArrays($spec->{"ui:options"}, $element);
176+
$element = $this->flattenArrays($spec->{"ui:options"}, $element);
177177
}
178178
}
179179
return $element;
@@ -194,13 +194,18 @@ public function flattenArrays(mixed $spec, array $element) {
194194
unset($element['actions']);
195195
$default_value = [];
196196
foreach ($element[$spec->child] as $key => $item) {
197-
ArrayHelper::flattenArrayElementFieldset($item);
198197
$default_value = array_merge($default_value, $this->formatArrayDefaultValue($item));
199198
if ($key != 0) {
200199
unset($element[$spec->child][$key]);
201200
}
202201
}
203-
$element[$spec->child][0]['#default_value'] = $default_value;
202+
203+
if (isset($element[$spec->child][0]['field'])) {
204+
$element[$spec->child][0]['field']['#default_value'] = $default_value;
205+
}
206+
else {
207+
$element[$spec->child][0]['#default_value'] = $default_value;
208+
}
204209
return $element;
205210
}
206211

@@ -211,6 +216,9 @@ private function formatArrayDefaultValue($item) {
211216
if (!empty($item['#default_value'])) {
212217
return [$item['#default_value'] => $item['#default_value']];
213218
}
219+
if (!empty($item['field']['#default_value'])) {
220+
return [$item['field']['#default_value'] => $item['field']['#default_value']];
221+
}
214222
return [];
215223
}
216224

0 commit comments

Comments
 (0)