diff --git a/README.md b/README.md index a0c54e3..8e8ec3e 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,29 @@ be achieved with this CSS selector: ```css :not(.json-forms-description-tooltip) ``` +### Custom CSS Classes + +For any control and layout it is possible to specify CSS classes in the UI +schema that will be added to the generated HTML code. The classes can be set at +the property `cssClasses` in the `options` property, e.g.: + +```json +{ + "type": "VerticalLayout", + "elements": [ + { + "type": "Control", + "scope": "#/properties/name", + "options": { + "cssClasses": ["my-name-control-class"] + } + } + ], + "options": { + "cssClasses": ["my-layout-class"] + } +} +``` ## Limitations diff --git a/src/Form/FormArrayFactory.php b/src/Form/FormArrayFactory.php index b0a8db1..5f22359 100644 --- a/src/Form/FormArrayFactory.php +++ b/src/Form/FormArrayFactory.php @@ -53,6 +53,13 @@ public function createFormArray(DefinitionInterface $definition, FormStateInterf $formState->set(['form', $definition->getPropertyFormName()], $form); } + // @phpstan-ignore offsetAccess.nonOffsetAccessible + $form['#attributes']['class'] = + // @phpstan-ignore binaryOp.invalid + ($definition->getOptionsValue('cssClasses') ?? []) + + // @phpstan-ignore offsetAccess.nonOffsetAccessible + ($form['#attributes']['class'] ?? []); + return $form; } } diff --git a/src/JsonForms/Definition/Control/ControlDefinition.php b/src/JsonForms/Definition/Control/ControlDefinition.php index 4dc11d2..852e982 100644 --- a/src/JsonForms/Definition/Control/ControlDefinition.php +++ b/src/JsonForms/Definition/Control/ControlDefinition.php @@ -216,13 +216,7 @@ public function getOptions(): ?\stdClass { return $this->controlSchema->options ?? NULL; } - /** - * @param string $key - * @param mixed $default - * - * @return mixed - */ - public function getOptionsValue(string $key, $default = NULL) { + public function getOptionsValue(string $key, mixed $default = NULL): mixed { return $this->controlSchema->options->{$key} ?? $default; } diff --git a/src/JsonForms/Definition/Custom/CustomDefinition.php b/src/JsonForms/Definition/Custom/CustomDefinition.php index 8fded0d..66f7145 100644 --- a/src/JsonForms/Definition/Custom/CustomDefinition.php +++ b/src/JsonForms/Definition/Custom/CustomDefinition.php @@ -50,6 +50,15 @@ public function __construct( $this->rootDefinition = $rootDefinition ?? $this; } + public function getOptions(): ?\stdClass { + return $this->uiSchema->options ?? NULL; + } + + public function getOptionsValue(string $key, mixed $default = NULL): mixed { + // @phpstan-ignore property.dynamicName + return $this->uiSchema->options->{$key} ?? $default; + } + /** * {@inheritDoc} */ diff --git a/src/JsonForms/Definition/Custom/MarkupDefinition.php b/src/JsonForms/Definition/Custom/MarkupDefinition.php index 34d5c69..9ad01f5 100644 --- a/src/JsonForms/Definition/Custom/MarkupDefinition.php +++ b/src/JsonForms/Definition/Custom/MarkupDefinition.php @@ -52,6 +52,15 @@ public function getContentMediaType(): string { return $this->markupSchema->contentMediaType; } + public function getOptions(): ?\stdClass { + return $this->markupSchema->options ?? NULL; + } + + public function getOptionsValue(string $key, mixed $default = NULL): mixed { + // @phpstan-ignore property.dynamicName + return $this->markupSchema->options->{$key} ?? $default; + } + /** * {@inheritDoc} */ diff --git a/src/JsonForms/Definition/DefinitionInterface.php b/src/JsonForms/Definition/DefinitionInterface.php index 3aa12c7..960ea4d 100644 --- a/src/JsonForms/Definition/DefinitionInterface.php +++ b/src/JsonForms/Definition/DefinitionInterface.php @@ -23,6 +23,10 @@ interface DefinitionInterface { + public function getOptions(): ?\stdClass; + + public function getOptionsValue(string $key, mixed $default = NULL): mixed; + /** * @param mixed $default * diff --git a/src/JsonForms/Definition/Layout/LayoutDefinition.php b/src/JsonForms/Definition/Layout/LayoutDefinition.php index c6642ad..3165aaa 100644 --- a/src/JsonForms/Definition/Layout/LayoutDefinition.php +++ b/src/JsonForms/Definition/Layout/LayoutDefinition.php @@ -94,13 +94,7 @@ public function getOptions(): ?\stdClass { return $this->layoutSchema->options ?? NULL; } - /** - * @param string $key - * @param mixed $default - * - * @return mixed - */ - public function getOptionsValue(string $key, $default = NULL) { + public function getOptionsValue(string $key, mixed $default = NULL): mixed { return $this->layoutSchema->options->{$key} ?? $default; }