Search code examples
freemarkermagnolia

Can I use a list as the value of a custom template property?


I'm using a custom template property in my page template definition to render CSS classes on the body tag in my template script. For example:

parameters:
  body:
    classes: example-body-class1
<body class="${def.parameters.body.classes!}"></body>

Rendered output:

<body class="example-body-class1"></body>

However, when I add multiple classes, I must add spaces between them. For example:

parameters:
  body:
    classes: example-body-class1 example-body-class2

Rendered output:

<body class="example-body-class1 example-body-class2"></body>

I would like to improve upon this design by using a list. For example:

parameters:
  body:
    classes:
      - example-body-class1
      - example-body-class2

However, when I dump the value of def.parameters.body.classes it returns null.

${cmsfn.dump(def.parameters.body.classes)}

[#-- Returns --]
null (Null)

The Magnolia custom template properties documentation example references a string value.

Can I use a list as the value of a custom template property? If so, how would I render the above list as a string with each item separated by a space?


Solution

  • Actually they can be lists, but you need to define them with values (Parameters are typically key:value pairs.

    definition:

    title: "test"
    renderType: freemarker
    templateScript: /test.ftl
    parameters:
      list:
        a: a
        b: b
    

    template:

    ${cmsfn.dump(def.parameters,3,true)}
    [#list def.parameters.list as param, k]
        ${param!"nope"}
    [/#list]
    

    output:

    Hash (1)
     list = Hash (2)
     a = "a" (String)
     b = "b" (String)
    a b