Cuando los contenidos estructurados que definimos en OpenCMS tienen un gran número de campos, elementos con cardinalidad alta u otros contenidos estructurados anidados se vuelve muy pesado la carga del formulario en el navegador y la edición se vuelve tediosa si tenemos que añadir elementos nuevos con el icono + porque recarga la página. En fin se vuelve poco manejable.
Hasta hace poco esto me traía problemas porque si un elemento tiene muchos campos no hay mas remedio que ponerlos y el usuario se quejaba y prefería que se dividiera en varios Xml separados (!!!que horror!!!), así que perdía la posibilidad de añadir elementos automáticamente con la edición directa o me tenía que crear una clase que escuchara los eventos relacionados con el contenido principal y se encargara de crear/borrar/mover los secundarios asociados a él.
Todavía no he probado como va de rendimiento con elementos muy grandes, pero si la sintaxis y lo que podemos esperar de esta nueva opción.
Veamos la documentación que publican en http://www.opencms-days.org/en/program/sessions/t1.html de Andreas Zahner.
Las principales características son:
- Mejora de la usabilidad del editor de contenidos XML
- Se pueden definir pestañas para el primer nivel de elementos
- Los nombres de las pestañas pueden depender de Local
- Configurable el plegado o desplegado del primer nivel
- Puede ser usado para separar campos por grupos con un objetivo común
- Util para elementos anidados con ocurrencia 1
- Se pueden generar las pestañas automática o manualmente
La sintaxis es la siguiente:
... <xsd:annotation> <xsd:appinfo> <tabs> <tab element="Title" name="TabArticle" collapse="false" /> <tab element="Config" collapse="true" /> </tabs> </xsd:appinfo> </xsd:annotation> ...
Creación automática:
<xsd:appinfo> … <tabs useall="true" /> …
Crea un a pestaña por cada elemento de primer nivel dándole como nombre el
del elemento y lo obvia dentro de la pestaña.
Configuración manual:
<xsd:appinfo> … <tabs> <tab element="…" collapse="false" name="MyTabName" /> <tab element="…" /> … </tabs> …
Cada pestaña define con cual elemento del XML comienza, en general se debe comenzar por el primero. El atributo collapse de ser falso para los elementos simples y true para los anidados. El atributo name que da el título para la pestaña puede estar en un recurso definido por lo que puede depender de Local y debe seguir la sintaxis: label.${Name of XSD complex type}.${Tab name attribute value}
Para ilustrar esto veamos un ejemplo:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:include schemaLocation="opencms://opencms-xmlcontent.xsd"/> <xsd:include schemaLocation="opencms://system/modules/org.ejemplo.opencms/schemas/autor.xsd"/> <xsd:include schemaLocation="opencms://system/modules/org.ejemplo.opencms/schemas/puntuacion.xsd"/> <xsd:element name="Documentos" type="OpenCmsDocumentos"/> <xsd:complexType name="OpenCmsDocumentos"> <xsd:sequence> <xsd:element name="Documento" type="OpenCmsDocumento" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="OpenCmsDocumento"> <xsd:sequence> <xsd:element name="Titulo" type="OpenCmsString" minOccurs="1" maxOccurs="1" /> <xsd:element name="Descripcion" type="OpenCmsString" minOccurs="1" maxOccurs="1" /> <xsd:element name="Autor" type="OpenCmsAutor" minOccurs="1" maxOccurs="1" /> <xsd:element name="Valoracion" type="OpenCmsPuntuacion" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> <xsd:attribute name="language" type="OpenCmsLocale" use="optional"/> </xsd:complexType> <xsd:annotation> <xsd:appinfo> <layouts> <layout element="Descripcion" widget="HtmlWidget" configuration="css:/system/modules/org.ejemplo.opencms/recursos/css/screen.css,source,link,anchor,formatselect,imagegallery,downloadgallery,linkgallery,htmlgallery,tablegallery,height:400px" /> </layouts> </xsd:appinfo> </xsd:annotation> </xsd:schema>
Con lo que el formulario de edición queda:

Si le incluimos el código para definir pestañas:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:include schemaLocation="opencms://opencms-xmlcontent.xsd"/> <xsd:include schemaLocation="opencms://system/modules/org.ejemplo.opencms/schemas/autor.xsd"/> <xsd:include schemaLocation="opencms://system/modules/org.ejemplo.opencms/schemas/puntuacion.xsd"/> <xsd:element name="Documentos" type="OpenCmsDocumentos"/> <xsd:complexType name="OpenCmsDocumentos"> <xsd:sequence> <xsd:element name="Documento" type="OpenCmsDocumento" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="OpenCmsDocumento"> <xsd:sequence> <xsd:element name="Titulo" type="OpenCmsString" minOccurs="1" maxOccurs="1" /> <xsd:element name="Descripcion" type="OpenCmsString" minOccurs="1" maxOccurs="1" /> <xsd:element name="Autor" type="OpenCmsAutor" minOccurs="1" maxOccurs="1" /> <xsd:element name="Valoracion" type="OpenCmsPuntuacion" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> <xsd:attribute name="language" type="OpenCmsLocale" use="optional"/> </xsd:complexType> <xsd:annotation> <xsd:appinfo> <layouts> <layout element="Descripcion" widget="HtmlWidget" configuration="css:/system/modules/org.ejemplo.opencms/recursos/css/screen.css,source,link,anchor,formatselect,imagegallery,downloadgallery,linkgallery,htmlgallery,tablegallery,height:400px" /> </layouts> <tabs> <tab element="Titulo" name="Datos" collapse="false" /> <tab element="Autor" name="Autor" collapse="true" /> <tab element="Valoracion" name="Valoraciones" collapse="true" /> </tabs> </xsd:appinfo> </xsd:annotation> </xsd:schema>
quedaría



Ahora veamos el efecto que tiene poner el atributo collapse a false en la pestaña del autor
<tab element="Autor" name="Autor" collapse="false" />

Decir que incluso definiendo pestañas en el elemento anidado no se muestran cuando está anidado (por supuesto si se crea como elemento individual si aparecen las pestañas) llevando hasta último extremo lo de “primer nivel” de elementos.
Espero haber contribuido en algo con mis pruebas.
Saludos.
Comentarios recientes