Parametrizar modelos do Sling a partir do HTL

O Adobe Experience Manager (AEM) oferece uma estrutura robusta para a criação de aplicativos web dinâmicos e adaptáveis. Um de seus recursos avançados é a capacidade de parametrizar modelos Sling, melhorando sua flexibilidade e reutilização. Este tutorial guiará você pela criação de um modelo Sling com parâmetros e seu uso no HTL (HTML Template Language) para renderizar conteúdo dinâmico.

Script HTL

Neste exemplo, o script HTL envia dois parâmetros para o Modelo Sling ParameterizedModel. O modelo manipula esses parâmetros em seu método getValue() e retorna o resultado para exibição.

Este exemplo passa dois parâmetros de Cadeia de Caracteres, no entanto, você pode passar qualquer tipo de valor ou objeto para o Modelo Sling, desde que o tipo de campo Modelo Sling, anotado com @RequestAttribute corresponda ao tipo de objeto ou valor passado do HTL.

<sly data-sly-use.myModel="${'com.example.core.models.ParameterizedModel' @ myParameterOne='Hello', myParameterTwo='World'}"
     data-sly-test.isReady="${myModel.isReady()}">

    <p>
        ${myModel.value}
    </p>

</sly>

<sly data-sly-use.placeholderTemplate="core/wcm/components/commons/v1/templates.html"
     data-sly-call="${placeholderTemplate.placeholder @ isEmpty=!isReady}">
</sly>
  • Parametrização: A instrução data-sly-use cria uma instância de ParameterizedModel com myParameterOne e myParameterTwo.
  • Renderização Condicional: data-sly-test verifica se o modelo está pronto antes de exibir o conteúdo.
  • Chamada de Espaço Reservado: O placeholderTemplate trata de casos em que o modelo não está pronto.

Implementação do modelo Sling

Veja como implementar o Modelo do Sling:

package com.example.core.models.impl;

import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.osgi.service.component.annotations.Model;
import org.osgi.service.component.annotations.RequestAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Model(
    adaptables = { SlingHttpServletRequest.class },
    adapters = { ParameterizedModel.class }
)
public class ParameterizedModelImpl implements ParameterizedModel {
    private static final Logger log = LoggerFactory.getLogger(ParameterizedModelImpl.class);

    // Use the @RequestAttribute annotation to inject the parameter set in the HTL.
    // Note that the Sling Model field can be any type, but must match the type of object or value passed from HTL.
    @RequestAttribute
    private String myParameterOne;

    // If the HTL parameter name is different from the Sling Model field name, use the name attribute to specify the HTL parameter name
    @RequestAttribute(name = "myParameterTwo")
    private String mySecondParameter;

    // Do some work with the parameter values
    @Override
    public String getValue() {
        return myParameterOne + " " + mySecondParameter + ", from the parameterized Sling Model!";
    }

    @Override
    public boolean isReady() {
        return StringUtils.isNotBlank(myParameterOne) && StringUtils.isNotBlank(mySecondParameter);
    }
}
  • Anotação de Modelo: A anotação @Model designa essa classe como um Modelo Sling, adaptável de SlingHttpServletRequest e implementando a interface ParameterizedModel.
  • Atributos da Solicitação: a anotação @RequestAttribute injeta parâmetros HTL no modelo.
  • Métodos: getValue() concatena os parâmetros, e isReady() verifica se os parâmetros não estão em branco.

A interface ParameterizedModel é definida da seguinte maneira:

package com.example.core.models;

import org.osgi.annotation.versioning.ConsumerType;

@ConsumerType
public interface ParameterizedModel {
    /**
     * Get an example string value from the model. This value is the concatenation of the two parameters.
     *
     * @return the value of the model
     */
    String getValue();

    /**
     * Check if the model is ready to be used.
     *
     * @return {@code true} if the model is ready, {@code false} otherwise
     */
    boolean isReady();
}

Exemplo de saída

Com os parâmetros "Hello" e "World", o script HTL gera a seguinte saída:

<p>
    Hello World, from the parameterized Sling Model!
</p>

Isso demonstra como os modelos Sling parametrizados no AEM podem ser influenciados com base nos parâmetros de entrada fornecidos por HTL.

recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69