Los componentes son la base de la creación de una experiencia en AEM. La variable Componentes principales y Tipo de archivo del proyecto AEM simplifique la introducción de un conjunto de herramientas de componentes sólidos y listos para usar. La variable Tutorial de WKND lleva al desarrollador a través de cómo utilizar estas herramientas y cómo crear componentes personalizados para crear un nuevo sitio AEM.
Antes de hacer referencia a este documento, asegúrese de haber completado la variable Tutorial de WKND y, por lo tanto, están familiarizados con el Componentes principales y AEM tipo de archivo del proyecto.
Dado que el tutorial de WKND cubre la mayoría de los casos de uso, este documento solo está diseñado como un complemento de esos recursos. Proporciona información técnica detallada sobre cómo se estructuran y configuran los componentes en AEM y no está pensado como guía de introducción.
Esta sección trata los conceptos y problemas clave como una introducción a los detalles necesarios para desarrollar sus propios componentes.
Antes de empezar a configurar o codificar realmente su componente, debe preguntar:
Antes de invertir tiempo en la creación de un componente completamente nuevo, considere la posibilidad de personalizar o ampliar los componentes existentes. Los componentes principales ofrecen un conjunto de componentes flexibles, sólidos y probados listos para la producción.
Los componentes principales también ofrecen borrar patrones de personalización que puede utilizar para adaptarlas a las necesidades de su propio proyecto.
Los componentes también se pueden redefinir con un superposición en función de la lógica de ruta de búsqueda. Sin embargo, en tal caso, la variable Fusión de recursos de Sling no se activará y /apps
debe definir la superposición completa.
También es posible anular un cuadro de diálogo de componente utilizando la fusión de recursos de Sling y definiendo la propiedad sling:resourceSuperType
.
Esto significa que solo necesita redefinir las diferencias necesarias, en lugar de redefinir todo el cuadro de diálogo.
El componente se procesará con HTML. El componente debe definir el HTML necesario para tomar el contenido requerido y luego procesarlo según sea necesario, tanto en el entorno de autor como de publicación.
Se recomienda mantener el código responsable del marcado y el procesamiento separado del código que controla la lógica utilizada para seleccionar el contenido del componente.
Esta filosofía está respaldada por HTL, un lenguaje de plantilla limitado intencionalmente para garantizar que se utilice un lenguaje de programación real para definir la lógica empresarial subyacente. Este mecanismo resalta el código que se llama para una vista determinada y, si es necesario, permite una lógica específica para diferentes vistas del mismo componente.
Esta lógica (opcional) se puede implementar de diferentes maneras y se invoca desde HTL con comandos específicos:
La estructura de un componente AEM es potente y flexible. Las principales partes son:
Un elemento clave de la estructura es el tipo de recurso.
Esta es una abstracción que ayuda a garantizar que, incluso cuando la apariencia cambie con el tiempo, la intención se mantenga en el tiempo.
La definición de un componente se puede desglosar de la siguiente manera:
/libs/core/wcm/components
./apps/<myApp>/components
.cq:Component
y que tengan los elementos clave:
cq:Component
definición.<mycomponent> (cq:Component)
- Nodo de jerarquía del componente.jcr:title
- Título del componente; por ejemplo, se utiliza como etiqueta cuando el componente aparece enumerado en la variable Navegador de componentes y Consola Componentesjcr:description
- Descripción del componente; se utiliza como guía de pase de ratón en la consola Componentes y explorador de componentescq:editConfig (cq:EditConfig)
- Define las propiedades de edición del componente y permite que el componente aparezca en el navegador de componentes
cq:childEditConfig (cq:EditConfig)
- Controla los aspectos de la interfaz de usuario del autor para los componentes secundarios que no definen los suyos cq:editConfig
.cq:dialog (nt:unstructured)
- Cuadro de diálogo para este componente. Define la interfaz que permite al usuario configurar el componente o editar contenido.cq:design_dialog (nt:unstructured)
- Edición de diseño para este componenteEl icono o la abreviatura del componente se definen mediante las propiedades JCR del componente cuando el desarrollador crea el componente. Estas propiedades se evalúan en el siguiente orden y se utiliza la primera propiedad válida encontrada.
cq:icon
- Propiedad de cadena que señala a un icono estándar en la variable Biblioteca de Coral UI para mostrar en el navegador de componentes
abbreviation
- Propiedad de cadena para personalizar la abreviatura del nombre del componente en el navegador de componentes
jcr:title
propiedad.
abbreviation_commentI18n
, que luego se utiliza como indicio de traducción.cq:icon.png
o cq:icon.svg
- Icono para este componente, que se muestra en el navegador de componentes
.png
y .svg
son compatibles._cq_icon.png
o _cq_icon.svg
por ejemplo..png
toma precedencia sobre .svg
si ambas están presentes.Si ninguna de las propiedades anteriores (cq:icon
, abbreviation
, cq:icon.png
o cq:icon.svg
) se encuentran en el componente:
sling:resourceSuperType
propiedad.jcr:title
propiedad del componente actual.Para cancelar la herencia de los iconos de los supercomponentes, establezca un vacío abbreviation
en el componente volverá al comportamiento predeterminado.
La variable Consola Componentes muestra cómo se define el icono de un componente determinado.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "https://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" x="0px" y="0px"
width="20px" height="20px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
<ellipse cx="5" cy="5" rx="3" ry="3" fill="#707070"/>
<ellipse cx="15" cy="5" rx="4" ry="4" fill="#707070"/>
<ellipse cx="5" cy="15" rx="5" ry="5" fill="#707070"/>
<ellipse cx="15" cy="15" rx="4" ry="4" fill="#707070"/>
</svg>
Muchos de los nodos o propiedades necesarios para definir un componente son comunes a ambas IU, con diferencias que permanecen independientes para que el componente pueda funcionar en ambos entornos.
Un componente es un nodo de tipo cq:Component
y tiene las siguientes propiedades y nodos secundarios:
Nombre | Tipo | Descripción |
---|---|---|
. |
cq:Component |
Representa el componente actual. Un componente es de tipo nodo cq:Component . |
componentGroup |
String |
Representa el grupo en el que se puede seleccionar el componente en la variable Navegador de componentes. Un valor que comience por . se utiliza para los componentes que no están disponibles para su selección en la interfaz de usuario, como los componentes base de los que heredan otros componentes. |
cq:isContainer |
Boolean |
Esto indica si el componente es un componente contenedor y, por lo tanto, puede contener otros componentes, como un sistema de párrafos. |
cq:dialog |
nt:unstructured |
Esta es la definición del cuadro de diálogo de edición para el componente. |
cq:design_dialog |
nt:unstructured |
Esta es la definición del cuadro de diálogo de diseño para el componente. |
cq:editConfig |
cq:EditConfig |
Define el edite la configuración del componente. |
cq:htmlTag |
nt:unstructured |
Esto devuelve atributos de etiqueta adicionales que se agregan a la etiqueta de HTML circundante. Habilita la adición de atributos a los divs generados automáticamente. |
cq:noDecoration |
Boolean |
Si es true, el componente no se procesa con clases div y css generadas automáticamente. |
cq:template |
nt:unstructured |
Si se encuentra, este nodo se utilizará como plantilla de contenido cuando el componente se añada desde el explorador de componentes. |
jcr:created |
Date |
Esta es la fecha de creación del componente. |
jcr:description |
String |
Esta es la descripción del componente. |
jcr:title |
String |
Este es el título del componente. |
sling:resourceSuperType |
String |
Cuando se configura, el componente hereda de este componente. |
component.html |
nt:file |
Este es el archivo de script HTL del componente. |
cq:icon |
String |
Este valor señala a la variable icono del componente y aparece en el navegador de componentes. |
Si miramos el Texto , se pueden ver varios de estos elementos:
Entre las propiedades de particular interés se incluyen:
jcr:title
: Este es el título del componente utilizado para identificar el componente dentro del explorador de componentes.jcr:description
- Esta es la descripción del componente.sling:resourceSuperType
: indica la ruta de herencia al ampliar un componente (anulando una definición).Los nodos secundarios de interés particular incluyen:
cq:editConfig
: controla los aspectos visuales del componente al editar.cq:dialog
- Define el cuadro de diálogo para editar el contenido de este componente.cq:design_dialog
: especifica las opciones de edición de diseño para este componente.Los cuadros de diálogo son un elemento clave del componente, ya que proporcionan una interfaz para que los autores configuren el componente en una página de contenido y proporcionen entradas para dicho componente. Consulte la documentación de creación para obtener más información sobre cómo interactúan los autores de contenido con los componentes.
Según la complejidad del componente, el cuadro de diálogo puede necesitar una o más fichas.
Cuadros de diálogo para AEM componentes:
cq:dialog
nodos de tipo nt:unstructured
.cq:Component
y junto a sus definiciones de componentes.sling:resourceType
propiedad.nt:unstructured
con el sling:resourceType
propiedad.Dentro del cuadro de diálogo, se definen los campos individuales:
Los cuadros de diálogo de diseño son similares a los cuadros de diálogo utilizados para editar y configurar contenido, pero proporcionan la interfaz para que los autores de plantillas proconfiguren y proporcionen detalles de diseño para ese componente en una plantilla de página. Los autores de contenido utilizan las plantillas de página para crear páginas de contenido. Consulte la documentación de plantilla para obtener más información sobre cómo se crean las plantillas.
Los cuadros de diálogo Diseño se utilizan al editar una plantilla de página, aunque no son necesarios para todos los componentes. Por ejemplo, la variable Título y Componentes de imagen ambos tienen diálogos de diseño, mientras que la variable Componente de uso compartido de medios sociales no.
La IU de Coral y la interfaz de usuario de Granite definen el aspecto de AEM.
La interfaz de usuario de Granite proporciona una amplia gama de widgets básicos necesarios para crear el cuadro de diálogo en el entorno de creación. Si es necesario, puede ampliar esta selección y crear su propio widget.
Para obtener más información, consulte los siguientes recursos:
Para crear un nuevo widget para utilizarlo en un cuadro de diálogo de componentes, es necesario crear un nuevo componente de campo de Granite UI .
Si considera el cuadro de diálogo como un contenedor simple para un elemento de formulario, también puede ver el contenido principal del contenido del cuadro de diálogo como campos de formulario. La creación de un nuevo campo de formulario requiere la creación de un tipo de recurso; esto equivale a crear un componente nuevo. Para ayudarle en esa tarea, la interfaz de usuario de Granite ofrece un componente de campo genérico del que heredar (mediante sling:resourceSuperType
):
/libs/granite/ui/components/coral/foundation/form/field
Más específicamente, la interfaz de usuario de Granite proporciona una serie de componentes de campo que son adecuados para su uso en diálogos o, de forma más general, en formularios.
Una vez creado el tipo de recurso, puede crear una instancia del campo añadiendo un nuevo nodo en el cuadro de diálogo, con la propiedad sling:resourceType
haciendo referencia al tipo de recurso que acaba de introducir.
También puede utilizar condiciones de renderización (rendercondition
) para controlar quién tiene acceso a pestañas/campos específicos del cuadro de diálogo; por ejemplo:
+ mybutton
- sling:resourceType = granite/ui/components/coral/foundation/button
+ rendercondition
- sling:resourceType = myapp/components/renderconditions/group
- groups = ["administrators"]
Una vez que haya creado un componente, debe activarlo para utilizarlo. Su uso muestra cómo la estructura del componente se relaciona con la estructura del contenido resultante en el repositorio.
Una vez definido un componente, debe estar disponible para su uso. Para que un componente esté disponible para su uso en una plantilla, debe habilitar el componente en la política del contenedor de diseño de la plantilla.
Consulte la documentación de plantilla para obtener más información sobre cómo se crean las plantillas.
Si creamos y configuramos una instancia de la variable Título en la página: /content/wknd/language-masters/en/adventures/extreme-ironing.html
A continuación, podemos ver la estructura del contenido creado dentro del repositorio:
En concreto, si observa el texto real de un Componente de título:
jcr:title
que contiene el texto real del título que ha introducido el autor.sling:resourceType
referencia a la definición del componente.Las propiedades definidas dependen de las definiciones individuales. Aunque pueden ser más complejos que arriba, siguen los mismos principios básicos.
Los componentes dentro de AEM están sujetos al Jerarquía de tipo de recurso. Se utiliza para ampliar componentes mediante la propiedad sling:resourceSuperType
. Esto permite que el componente herede de otro componente.
Consulte la sección Reutilización de componentes para obtener más información.
En esta sección se explica cómo configurar el comportamiento de edición de un componente. Esto incluye atributos como acciones disponibles para el componente, características del editor in.place y oyentes relacionados con eventos en el componente.
El comportamiento de edición de un componente se configura añadiendo un cq:editConfig
nodo de tipo cq:EditConfig
debajo del nodo del componente (de tipo cq:Component
) y añadiendo propiedades específicas y nodos secundarios. Están disponibles las siguientes propiedades y nodos secundarios:
cq:editConfig
propiedades de nodocq:editConfig
nodos secundarios:
cq:dropTargets
(tipo de nodo nt:unstructured
): define una lista de destinos de colocación que pueden aceptar una colocación desde un recurso del buscador de contenido (se permite un solo destino de colocación)cq:inplaceEditing
(tipo de nodo cq:InplaceEditingConfig
): define una configuración de edición in situ para el componentecq:listeners
(tipo de nodo cq:EditListenersConfig
): define lo que sucede antes o después de que se produzca una acción en el componenteHay muchas configuraciones existentes en AEM. Puede buscar fácilmente propiedades específicas o nodos secundarios mediante la herramienta Consulta en CRXDE Lite.
Los componentes siempre deben representar algún HTML que sea visible para el autor, incluso cuando el componente no tenga contenido. De lo contrario, podría desaparecer visualmente de la interfaz del editor, haciendo que esté técnicamente presente pero invisible en la página y en el editor. En tal caso, los autores no podrán seleccionar ni interactuar con el componente vacío.
Por este motivo, los componentes deben representar un marcador de posición siempre que no muestren ningún resultado visible cuando la página se procese en el editor de páginas (cuando el modo WCM sea edit
o preview
).
El marcado de HTML típico de un marcador de posición es el siguiente:
<div class="cq-placeholder" data-emptytext="Component Name"></div>
El script HTL típico que procesa el HTML de marcador de posición anterior es el siguiente:
<div class="cq-placeholder" data-emptytext="${component.properties.jcr:title}"
data-sly-test="${(wcmmode.edit || wcmmode.preview) && isEmpty}"></div>
En el ejemplo anterior, isEmpty
es una variable que solo es verdadera cuando el componente no tiene contenido y es invisible para el autor.
Para evitar la repetición, Adobe recomienda que los implementadores de componentes utilicen una plantilla HTL para estos marcadores de posición. como el proporcionado por los componentes principales.
El uso de la plantilla en el vínculo anterior se realiza con la siguiente línea de HTL:
<sly data-sly-use.template="core/wcm/components/commons/v1/templates.html"
data-sly-call="${template.placeholder @ isEmpty=!model.text}"></sly>
En el ejemplo anterior, model.text
es la variable que solo tiene el valor "True" cuando el contenido tiene contenido y es visible.
Se puede ver un ejemplo de uso de esta plantilla en los componentes principales, como en el componente Título.
La variable cq:dropTargets
nodo (tipo de nodo) nt:unstructured
) define el objetivo de colocación que puede aceptar una colocación de un recurso arrastrado desde el buscador de contenido. Es un nodo de tipo cq:DropTargetConfig
.
El nodo secundario del tipo cq:DropTargetConfig
define un destino de colocación en el componente.
Un editor in situ permite al usuario editar contenido directamente en el flujo de contenido, sin necesidad de abrir un cuadro de diálogo. Por ejemplo, el estándar Texto y Título ambos componentes tienen un editor in situ.
Un editor in situ no es necesario ni significativo para cada tipo de componente.
La variable cq:inplaceEditing
nodo (tipo de nodo) cq:InplaceEditingConfig
) define una configuración de edición in situ para el componente. Puede tener las siguientes propiedades:
Nombre de propiedad | Tipo de propiedad | Valor de propiedad |
---|---|---|
active |
Boolean |
true para permitir la edición in situ del componente. |
configPath |
String |
Ruta de la configuración del editor, que puede especificarse mediante un nodo de configuración |
editorType |
String |
Los tipos disponibles son: plaintext para contenido que no sea de HTML, title convierte los títulos gráficos en un texto sin formato antes de que comience la edición, y text utiliza el Editor de texto enriquecido |
La siguiente configuración habilita la edición in situ del componente y define plaintext
como tipo de editor:
<cq:inplaceEditing
jcr:primaryType="cq:InplaceEditingConfig"
active="{Boolean}true"
editorType="plaintext"/>
El método para gestionar eventos en campos de diálogo se realiza con oyentes en una biblioteca de cliente.
Para insertar lógica en el campo, debe:
Para conseguirlo, debe conocer la biblioteca de widgets subyacente con la que desea interactuar. Consulte la documentación de la interfaz de usuario de Coral para identificar a qué evento desea reaccionar.
La variable cq:listeners
nodo (tipo de nodo) cq:EditListenersConfig
) define lo que sucede antes o después de una acción en el componente. La tabla siguiente define sus posibles propiedades.
Nombre de propiedad | Valor de propiedad |
---|---|
beforedelete |
El controlador se activa antes de que se elimine el componente. |
beforeedit |
El controlador se activa antes de editar el componente. |
beforecopy |
El controlador se activa antes de que se copie el componente. |
beforeremove |
El controlador se activa antes de mover el componente. |
beforeinsert |
El controlador se activa antes de que se inserte el componente. |
beforechildinsert |
El controlador se activa antes de que el componente se inserte dentro de otro componente (solo contenedores). |
afterdelete |
El controlador se activa después de eliminar el componente. |
afteredit |
El controlador se activa después de editar el componente. |
aftercopy |
El controlador se activa después de copiar el componente. |
afterinsert |
El controlador se activa después de insertar el componente. |
aftermove |
El controlador se activa después de mover el componente. |
afterchildinsert |
El controlador se activa después de que el componente se inserte dentro de otro componente (solo contenedores). |
En el caso de los componentes anidados, existen ciertas restricciones en las acciones definidas como propiedades en la variable cq:listeners
nodo . Para los componentes anidados, los valores de las siguientes propiedades must be REFRESH_PAGE
:
aftermove
aftercopy
El controlador de eventos se puede implementar con una implementación personalizada. Por ejemplo, donde project.customerAction
es un método estático):
afteredit = "project.customerAction"
El ejemplo siguiente es equivalente al REFRESH_INSERTED
configuración:
afterinsert="function(path, definition) { this.refreshCreated(path, definition); }"
Con la siguiente configuración, la página se actualiza después de que el componente se haya eliminado, editado, insertado o movido:
<cq:listeners
jcr:primaryType="cq:EditListenersConfig"
afterdelete="REFRESH_PAGE"
afteredit="REFRESH_PAGE"
afterinsert="REFRESH_PAGE"
afterMove="REFRESH_PAGE"/>
La validación de campos en la interfaz de usuario de Granite y los widgets de la interfaz de usuario de Granite se realiza utilizando la variable foundation-validation
API. Consulte la foundation-valdiation
Documentación de Granite para obtener más información.
Si tiene un JavaScript personalizado que debe ejecutarse solo cuando el cuadro de diálogo esté disponible y listo, debe escuchar la dialog-ready
evento.
Este evento se activa cada vez que se carga (o recarga) el cuadro de diálogo y está listo para utilizarse, lo que significa que siempre que haya un cambio (crear/actualizar) en el DOM del cuadro de diálogo.
dialog-ready
se puede utilizar para conectar en código personalizado JavaScript que realiza personalizaciones en los campos dentro de un cuadro de diálogo o tareas similares.
La variable Modo WCM se establece al cambiar al modo de vista previa incluso cuando la página no se haya actualizado.
Para los componentes con una renderización que son sensibles al modo WCM, deben definirse para actualizarse específicamente y luego depender del valor de la cookie.
Como desarrollador, desea acceder fácilmente a la documentación de componentes para que pueda comprender rápidamente los siguientes aspectos del componente:
Por este motivo, es bastante fácil hacer cualquier desglose de documentación existente que tenga disponible dentro del propio componente.
Todo lo que debe hacer es colocar un README.md
en la estructura de componentes.
Este marcador se muestra en la sección Consola Componente.
El margen admitido es el mismo que para Fragmentos de contenido.