Allow class types in item properties in SDC

Created on 25 September 2023, 9 months ago
Updated 18 June 2024, 8 days ago

Problem/Motivation

SDC components have typed properties. They can either be scalar or implement a class.
However, the sdc module currently only allows class types on root properties, not on sub-properties of arrays.

This would be useful for templates like menu.html.twig.

Steps to reproduce

See this component for example:

$schema: https://git.drupalcode.org/project/drupal/-/raw/10.1.x/core/modules/sdc/src/metadata.schema.json
name: Main menu
description: Menu main
libraryOverrides:
  dependencies:
    - core/once
props:
  type: object
  properties:
    attributes:
      title: "Attributes"
      type: Drupal\Core\Template\Attribute
    foo:
      type: array
      items:
        type: object
        properties:
          attributes:
            title: "Attributes"
            type: Drupal\Core\Template\Attribute

The root attributes property works correctly, but the foo array attributes property triggers this InvalidComponentException:

[props.properties.foo.items.properties.attributes.type] Does not have a value in the enumeration ["array","boolean","integer","null","number","object","string"]/n[props.properties.foo.items.properties.attributes.type] String value found, but an array is required/n[props.properties.foo.items.properties.attributes.type] Failed to match at least one schema/n[props.properties.foo.items] Object value found, but an array is required/n[props.properties.foo.items] Failed to match at least one schema

Proposed resolution

ComponentValidator should call nullifyClassPropsSchema() on array properties too.

✨ Feature request
Status

Active

Version

11.0 πŸ”₯

Component
single-directory componentsΒ  β†’

Last updated about 22 hours ago

Created by

πŸ‡«πŸ‡·France prudloff Lille

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

Not all content is available!

It's likely this issue predates Contrib.social: some issue and comment data are missing.

  • Issue created by @prudloff
  • πŸ‡«πŸ‡·France prudloff Lille
  • πŸ‡«πŸ‡·France prudloff Lille

    The MR adds support for the first level of array items, but it would probably be best to implement this recursively.

  • last update 9 months ago
    Custom Commands Failed
  • @prudloff opened merge request.
  • πŸ‡«πŸ‡·France prudloff Lille
  • πŸ‡©πŸ‡ͺGermany geek-merlin Freiburg, Germany

    I've been there before...

  • πŸ‡ͺπŸ‡ΈSpain vidorado Pamplona (Navarra)

    @geek-merlin was there and checked that it worked, but only for first level property types. For property items type, it doesn't work yet. I've applied the changes in MR4871 but it still doesn't work for me.

    @prudloff, Could you review again your changes against the latest Drupal core (10.2.6 at the moment) to check if anything has changed in ComponentValidator::nullifyClassPropsSchema() that makes your changes don't work?

    While I was fighting with it by myself, I changed the method ComponentValidator::getClassProps() to retrieve also the classes of item types. There is, maybe it could help.

      $types = is_string($type) ? [$type] : $type;
    

    changed to

    if (is_array($type) && in_array('array', $type) && ($itemsType = $prop_def['items']['type'] ?? NULL)) {
      $types = is_string($itemsType) ? [$itemsType] : $itemsType;
    }
    else {
      $types = is_string($type) ? [$type] : $type;
    }
    

    but that doesn't make it work either.

    The code in this Validator is very hard for me to understand, it has a very strong array manipulation with reducers and the like...

  • πŸ‡ͺπŸ‡ΈSpain vidorado Pamplona (Navarra)
  • πŸ‡ΊπŸ‡ΈUnited States xjm
  • πŸ‡ͺπŸ‡ΈSpain vidorado Pamplona (Navarra)

    For anyone also on this issue... I would like to share my experience after some playing with it :)

    I realized that working with classes in SDC property definitions is not as practical as I first thought. The magic of SDC is in creating components "on the fly" in yor theme's twig files, and that is not possible if you have to provide a Class argument to a component.

    If we would have a way of creating class objects from plain objects or arrays directly from twig (with a function, filter, whatever...) this could all be possible but, without that, I think is better to go along with simple types (string, boolean, integer...) and enums. We will have a little bit of repetition if we, for example, use the same enum in several places, but it is manageable.

    If, like me, you also are lacking autocompletion when defining component properties, maybe a plugin for PHPStorm/VSCode could be developed, that was aware of SDC definitions.

Production build 0.69.0 2024